--- title: delete slug: Web/JavaScript/Reference/Operators/delete tags: - JavaScript - Memory Management - Object - Operator - Property - Reference - Release - Unary - delete translation_of: Web/JavaScript/Reference/Operators/delete ---
JavaScript の delete
演算子は、オブジェクトからプロパティを削除します。同じプロパティへの参照がそれ以上保持されない場合は、自動的に解放されます。
delete expression
expression には、プロパティへの参照になる式を置きます。例えば:
delete object.property delete object['property']
object
property
非 strict モードでは、プロパティが編集不可の場合、false が返ります。その他の場合すべてで true
が返ります。
strict モード では、プロパティが編集不可の場合、{{jsxref("Global_objects/SyntaxError")}} をスローします。
一般的に信じられていることとは異なり、delete
演算子は、直接的にメモリを開放することはありません。メモリの管理は参照が切れることで間接的に行われます。詳細は memory management をご覧ください。
delete
演算子は指定したプロパティをオブジェクトから取り除きます。削除に成功すると true
を返し、そうでなければ false
を返します。しかし、次のシナリオを考慮することが重要です:
delete
は何の効果もなく、true
を返します。delete
自身のプロパティにのみ効果があります)。delete
はグローバルスコープ内の関数を削除できません (関数定義の一部であるか関数式の一部であるかにかかわらず)。delete
で削除できます。次のスニペットがシンプルな例です:
var Employee = { age: 28, name: 'abc', designation: 'developer' } console.log(delete Employee.name); // returns true console.log(delete Employee.age); // returns true // When trying to delete a property that does // not exist, true is returned console.log(delete Employee.salary); // returns true
プロパティが編集不可に設定されているとき、delete
は何の効果もなく、false
を返します。strict モードでは、これは SyntaxError
を生成します。
var Employee = {}; Object.defineProperty(Employee, 'name', {configurable: false}); console.log(delete Employee.name); // returns false
{{jsxref("Statements/var","var")}} や {{jsxref("Statements/let","let")}}、{{jsxref("Statements/const","const")}} は、delete
演算子で削除できない編集不可のプロパティを生成します:
var nameOther = 'XYZ'; // We can access this global property using: Object.getOwnPropertyDescriptor(window, 'nameOther'); // output: Object {value: "XYZ", // writable: true, // enumerable: true, // configurable: false} // Since "nameOther" is added using with the // var keyword, it is marked as "non-configurable" delete nameOther; // return false
strict モードでは、例外が発生します。
strict モードのとき、変数や関数の引数、関数名への参照に直接 delete
が使われた場合、{{jsxref("SyntaxError")}} をスローします。
var
で宣言された変数は編集不可に設定されます。次の例では、salary
は編集不可で削除できません。非 strict モードでは、delete
演算子は false
を返します。
function Employee() { delete salary; var salary; } Employee();
strict モードで同じコードがどのように振る舞うか見てみましょう。false
を返す代わりに、ステートメントは SyntaxError
を発生させます。
"use strict"; function Employee() { delete salary; // SyntaxError var salary; } // Similarly, any direct access to a function // with delete will raise a SyntaxError function DemoFunction() { //some code } delete DemoFunction; // SyntaxError
// creates the property adminName on the global scope adminName = 'xyz'; // creates the property empCount on the global scope // Since we are using var, this is marked as non-configurable. The same is true of let and const. var empCount = 43; EmployeeDetails = { name: 'xyz', age: 5, designation: 'Developer' }; // adminName is a property of the global scope. // It can be deleted since it is created without var. // Therefore, it is configurable. delete adminName; // returns true // On the contrary, empCount is not configurable, // since var was used. delete empCount; // returns false // delete can be used to remove properties from objects delete EmployeeDetails.name; // returns true // Even when the property does not exists, it returns "true" delete EmployeeDetails.salary; // returns true // delete does not affect built-in static properties delete Math.PI; // returns false // EmployeeDetails is a property of the global scope. // Since it defined without "var", it is marked configurable delete EmployeeDetails; // returns true function f() { var z = 44; // delete doesn't affect local variable names delete z; // returns false }
delete
とプロトタイプチェーン次の例では、 プロトタイプチェーンで同じ名前のプロパティを使用できる間に、オブジェクトの独自のプロパティを削除します :
function Foo() { this.bar = 10; } Foo.prototype.bar = 42; var foo = new Foo(); // Returns true, since the own property // has been deleted on the foo object delete foo.bar; // foo.bar is still available, since it // is available in the prototype chain. console.log(foo.bar); // We delete the property on the prototype delete Foo.prototype.bar; // logs "undefined" since the property // is no longer inherited console.log(foo.bar);
配列の要素を削除したとき、配列の長さは影響を受けません。これは配列の最後の要素を削除しても保持されます。
delete
演算子が配列の要素を削除すると、要素はもはや配列からなくなります。 次の例では、trees[3]
が delete
で削除されます。
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; delete trees[3]; if (3 in trees) { // this does not get executed }
配列の要素を存在させたいが値が未定義の場合、delete
演算子の代わりに undefined
値を用います。次の例では、trees[3]
は undefined が割り当てられていますが、配列の要素はまだ存在しています:
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; trees[3] = undefined; if (3 in trees) { // this gets executed }
代わりに、配列の内容を変更して配列要素を削除する場合は、{{jsxref("Array.splice", "splice")}}
メソッドを使用します。次の例では、{{jsxref("Array.splice", "splice")}} を使用して配列から trees[3]
が削除されます:
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; trees.splice(3,1); console.log(trees); // ["redwood", "bay", "cedar", "maple"]
仕様 | ステータス | コメント |
---|---|---|
{{SpecName('ESDraft', '#sec-delete-operator', 'The delete Operator')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-delete-operator', 'The delete Operator')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-11.4.1', 'The delete Operator')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES1', '#sec-11.4.1', 'The delete Operator')}} | {{Spec2('ES1')}} | 初期定義。JavaScript 1.2 で実装。 |
{{Compat("javascript.operators.delete")}}
ECMAScript はオブジェクトのイテレーション順を実装系依存であるとしているにもかかわらず、すべての主要なブラウザーはイテレーション順を、(少なくともプロトタイプ上にないプロパティについて) 最初に追加されたプロパティを最初に持ち出す方式に基づいてサポートしているように見受けられます。ところが Internet Explorer ではプロパティに対して delete
を用いたときに、他のブラウザーが単純なオブジェクトを整列された連想配列のように用いることを妨げる、ややこしい動作になる場合があります。Internet Explorer では、プロパティの値が実際 undefined に設定されているとき、後から同じ名前で再びプロパティを追加すると、そのプロパティは元の場所でイテレートされるようになるでしょう。削除済みのプロパティを再度追加した場合に期待するであろう、イテレーション順の最後ではありません。
クロスブラウザー環境で整列された連想配列をしたい場合は、可能であれば {{jsxref("Map")}} を使用してください。または、2 つに分けた配列 (片方はキー、もう片方は値) やプロパティをひとつ持つオブジェクトの配列などで構造をシミュレートしてください。