JavaScriptの怪しいdeleteの操作符
1739 ワード
deleteという操作符はjavascriptではあまり使われていませんが、彼の特性は確かにおかしいです.
1、オブジェクトの属性、コードを削除します.
2、配列の操作はコードを先に見ます.
3、以上は対象と配列の操作についてよく分かりますが、変数の操作についてはよく考えられなくなります.コードは下記の通りです.
1、オブジェクトの属性、コードを削除します.
var o = {
a: 1,
b: 2
};
delete o.a;
alert(o.a); //undefined
では、deleteが削除したのは対象の属性ですか?それとも対象の属性値ですか?削除したのは値だと思い始めました.結果はundefinedですので、エラーはありません.しかし、実際には私の見方は間違っています.例を挙げて説明します.
var o = {};
var a = {
pro: "zhenn"
};
o.c = a;
delete o.c; // o a
console.log(o.c); // undefined
console.log(a.pro); // zhenn
上記のコードを通じて、delete o.cの後に、o.cの指した値を削除していません.つまり対象aは依然として存在します.そうでないと、a.proはコンパイルしたことがないはずです.ここでは、delete削除対象の属性は、オブジェクト中の属性値への参照を削除したものと同じですが、この値はまだオブジェクトスタックにあります.2、配列の操作はコードを先に見ます.
var arr = [1,2,3];
delete arr[2];
console.log(arr.length); // 3
console.log(arr); // [1,2,undefined]
もう一回証明しました.deleteは本当に元素を削除していません.元素に対応するキーを削除しました.deleteの本質をより明確にするために、Aray中のpop方法と比較してみます.以下のとおりです
var arr = [1,2,3];
arr.pop();
console.log(arr); // [1,2]
console.log(arr.length) // 2
これで真相が明らかになるはずです.3、以上は対象と配列の操作についてよく分かりますが、変数の操作についてはよく考えられなくなります.コードは下記の通りです.
var a = 1;
delete a;
alert(a); // 1
function fn(){ return 42; }
delete fn;
alert(fn()); // 42
b = 2;
delete b;
alert(b); // b is not defined;
通を説明するのは難しいですね.同じグローバル変数でもvar声明で削除できません.直接声明の変数bは削除できます.deleteは怪しいと言わざるを得ません.ECMAの説明では、var声明の変数とfunction声明の関数でDotDelete特性を持っています.削除できません.