delete
オブジェクトからプロパティを削除します。
文法
delete expression
式はプロパティ参照を評価する必要があります。 下記はその例になります。
delete object.property
delete object['property']
引数 | 説明 |
---|---|
object | オブジェクトの名前、またはオブジェクトを評価する式を指定します。 |
property | 削除するプロパティを指定します。 |
戻り値 | |
strictモードで、そのプロパティ自身が設定不可(non-configurable)のプロパティの場合は例外がスローされます。 非strictモードであれば、falseを返します。 それ以外のケースは、全てtrueを返します。 |
説明
一般的にこういったケースではメモリの解放が関係すると思われがちですが、 delete演算子はそれとは直接的に何の関係もありません。 (参照の破棄により間接的に行われるのみです。詳細はメモリ管理のページを参照してください。)
delete演算子の処理が成功すると、オブジェクト全体からそのプロパティが削除されます。 ただし、オブジェクトのprototypeチェーン上に同じ名前のプロパティが存在すれば、 そのオブジェクトはprototypeから、そのプロパティを継承します。
deleteはオブジェクトのプロパティにのみ有効です。 変数または関数の名前に対しては機能しません。 また、グローバル変数について誤りやすいのですが(翻訳に自信なし)、 オブジェクトを指定しない割り当て(例えば、x=5)は、 実際にはグローバルオブジェクトへのプロパティ割り当てになります。
deleteは予め定義されたオブジェクト(Object、Array、Math等)の特定のプロパティは削除出来ません。 これらはECMAScript 5に記述されており、設定不可(non-configurable)により、 後から設定が変更出来ないようにされています。
例
x = 42; // グローバルオブジェクト上のプロパティxを作成
var y = 43; // 新しい変数yを宣言
myobj = {
h: 4,
k: 5
};
// xはグローバルオブジェクトのプロパティであり、
// 削除することが出来ます。
delete x; // returns true
// 変数名であるため、deleteは機能しません。
delete y; // returns false
// 予め定義された特定のプロパティであるため、
// deleteは機能しません。
delete Math.PI; // returns false
// ユーザー定義のプロパティは削除可能です。
delete myobj.h; // returns true
// myobjはグローバルオブジェクトのプロパティであり、
// 変数でありません。そのため、削除することが出来ます。
delete myobj; // returns true
オブジェクトがprototypeからプロパティを継承し、自身でプロパティを持たない場合、 参照しているそのオブジェクトから、そのプロパティを削除することは出来ません。 ただし、prototype上から直接削除することが出来ます。
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
// trueを返しますが、barは継承されたプロパティであるため、
// 何も起こりません。
delete foo.bar;
// 42を出力し、プロパティがまだ継承されている事を確認。
console.log(foo.bar);
// prototype上から、プロパティを削除
delete Foo.prototype.bar;
// "undefined"を出力し、継承されていないことを確認。
console.log(foo.bar);
配列要素の削除
配列の要素を削除した場合、配列のlengthは影響を受けません。 これは配列の最後の要素の削除であっても同じです。
delete
演算子で配列の要素を削除すると、
その要素は配列内から無くなります。
下記の例では、threes[3]
が、delete
を使用して削除されています。
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
// これは実行されません。
}
配列の要素として存在はするが、未定義の値を持たいといった場合、
delete
演算子の代わりにundefined
を使用してください。
下記の例では、threes[3]
にundefined
を割り当てていますが、
配列の要素は存在したままになります。
var trees = ["redwood","bay","cedar","oak","maple"];
trees[3] = undefined;
if (3 in trees) {
// これは実行されます。
}
仕様
ブラウザ互換性
機能 | Chrome | Firefox (Gecko) |
IE | Opera | Safari |
---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ |
機能 | Android | Chrome for Android |
Firefox Mobile |
IE Mobile |
Opera Mobile |
Safari Mobile |
---|---|---|---|---|---|---|
基本 | ◯ | ◯ | ◯ | ◯ | ◯ | ◯ |
クロスブラウザ問題
ECMAScriptはオブジェクトの繰り返し処理の順序を実装依存としていますが、
全ての主要なブラウザは、先入れ先出しに基づいて繰り返し処理を行っているように思われます。
(少なくとも、prototype上に内プロパティは)
ただし、Internet Explorerではプロパティにdelete
を使用すると、ある困惑する挙動が起こり、
他のブラウザでの、順序立てられた連想配列としてのオブジェクトリテラルのような、単純なオブジェクトの使用を妨げてしまいます。
Internet Explorerで、プロパティの値に実際にundefined
が設定され、
後から同じ名前でプロパティが追加されると、削除後の追加であるため最後尾にあると期待されるかもしれませんが、
実際にはそのプロパティは古い位置で繰り返し処理されてしまいます。(翻訳に自信なし)
そのため、もしクロスブラウザの環境で順序立てられた配列をシミュレートしたいのであれば、 2つに分けられた配列(1つはキー、もう1つは値)を使用するか、 単一のプロパティオブジェクトの配列を構築するといった対応が必要になります。
関連項目
© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
- 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
- MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。