delete 演算子は JavaScript ではあまり一般的には使用されませんが、その特性は確かに非常に奇妙です。
1、オブジェクトの属性を削除します。コード:
var o = {
a: 1、
b: 2
};
o.a を削除;
アラート(o.a); //未定義
では、delete はオブジェクトの属性を削除するのでしょうか、それともオブジェクトの属性値を削除するのでしょうか? 結果は未定義でエラーは報告されなかったので、削除されたものが値であるべきだと考え始めました。しかし実際には、私の見解は間違っています。たとえば、次のとおりです。
var o = {};
var a = {
プロ: "ジェン"
};
o.c = a;
delete o.c; //オブジェクト o の属性 a
を削除します
console.log(o.c); // 未定義
console.log(a.pro); // zhenn
上記のコードから、o.c を削除した後、o.c が指す値が削除されていない、つまりオブジェクト a がまだ存在していることがわかります。そうでない場合、a.pro はコンパイル レベルに合格しないはずです。そういえば、delete はオブジェクトの属性を削除することと同じですが、この値はオブジェクト スタックにまだ残っていることがわかります。
2. 配列の操作については、まずコードを確認してください。
var arr = [1,2,3];
arr[2] を削除;
console.log(arr.length); // 3
console.log(arr); // [1,2,未定義]
もう一度、delete は実際には要素を削除するのではなく、要素に対応するキー値を削除するだけであることが証明されています。 delete の性質をさらに理解するために、Array の Pop メソッドと比較してください。以下のように:
var arr = [1,2,3];
arr.pop();
console.log(arr); // [1,2]
console.log(arr.length) // 2
今、真実が明らかにされるべきです。
3. オブジェクトと配列 に対する上記の操作は理解しやすいですが、変数の操作は必然的に混乱を招きます。コードは次のとおりです。
var a = 1;
を削除します;
アラート(a); // 1
関数 fn(){ 戻り値 42 }
fn を削除;
アラート(fn()); // 42
b = 2;
bを削除;
alert(b); // b が定義されていません;
これもグローバル変数なので、var で宣言した変数は削除できませんが、ECMA の説明では、delete は非常に奇妙だと言わざるを得ません。これは、var で宣言された変数と function で宣言された関数には DontDelete 属性があり、削除できないことを意味します。