1。変数
JavaScriptの削除演算子に関しては、最初にJavaScriptの変数と属性の関係を把握する必要があります。
JavaScriptでは、変数とオブジェクト属性の関係は非常に微妙であり、ブラウザのウィンドウオブジェクトであるスクリプトを実行する前にグローバルオブジェクトを作成するため、何度も同等にすることさえできます。すべてのグローバル変数は、このグローバルオブジェクトの属性です。関数を実行すると、アクティベーションオブジェクトも作成されます。すべてのローカル変数は、このアクティベーションオブジェクトの属性です。これらのJavaScriptの範囲と閉鎖について学ぶことができます。
コードコピーは次のとおりです。
//プロトタイプで宣言された属性は削除できません
var global = 1;
this.global; // 1、これを介してグローバルオブジェクトにアクセスできます
this.global2 = 2;
Global2; // 12
function foo(){
var local = 36;
//ただし、アクティベーションに直接アクセスすることはできません。
//したがって、foo.localを介してローカル変数にアクセスすることはできません
}
変数はオブジェクトプロパティと同等であるように見えますが、実際には、少なくとも削除演算子では同じではありません。私の理解では、変数宣言はVARステートメントを通じて完了する必要があります。 VARステートメントで宣言されていないグローバル変数は、すべてウィンドウオブジェクトのプロパティです。これにより、変数とオブジェクトプロパティの関係を簡単に理解できます。
2.オペレーターを削除します
削除演算子は、オブジェクトプロパティを削除するために使用されます。参照型値の場合、オブジェクトプロパティ自体も削除され、プロパティが指すオブジェクトを削除しません。ご質問がある場合は、基本タイプと参照タイプの値を確認するか、次のコードをテストできます。
コードコピーは次のとおりです。
var o = {};
var a = {x:10};
oa = a;
OAを削除します。 // OA属性が削除されます
console.log(oa); // 未定義
console.log(ax); // 10、{x:10}オブジェクトはまだaで参照されているため、リサイクルされないため
さらに、Delete Oxは削除o ["x"]として記述することもでき、両方の効果は同じです。
3。変数を削除することはできません
VARによって宣言された変数および関数によって宣言された関数には、dontDelete機能があり、削除できません。 var(グローバルオブジェクトのプロパティ)を介して宣言されていないグローバル変数
コードコピーは次のとおりです。
var global = {
A:123、
B:{
C:1345
}
};
グローバルを削除します。 //無効
console.log(グローバル)
obj = {
A:123
};
objを削除します。 // OBJグローバル変数を削除し、ウィンドウオブジェクトのOBJ属性
console.log(obj); // objは定義されていません
4.プロトタイプで宣言された属性とオブジェクトに付属する属性は削除できません。
プロトタイプのプロトタイプで宣言された属性とオブジェクトに付属する属性(実際、これらの属性もプロトタイプのプロトタイプにあります)は、dontdeleteの特性を持つと見なされ、削除できません。例えば
コードコピーは次のとおりです。
//プロトタイプで宣言された属性は削除できません
関数obj(){
this.x = 1;
}
obj.prototype.x = 2;
var o = new obj();
console.log(ox); // 1、コンストラクターで定義されているOX
OXを削除します。
console.log(ox); // 2、プロトタイプで定義されているOXは、削除oxが再度実行されたとしても、削除されません。
//オブジェクトに付属する属性を削除することはできません
var strings = "123456";
console.log(strings.length); // 6
文字列を削除します。
console.log(strings.length); //まだ6です
5.評価ステートメントに基づくいくつかの例外
VARによって宣言された変数は、通常のVAR宣言された変数としてグローバルオブジェクトに属しますが、varによって宣言された変数では、dontDelete属性を持たず、削除することができます。ただし、評価コードの関数のVARによって定義された変数は、削除されておらず、削除することはできません。
コードコピーは次のとおりです。Eval( "var x = 42;");
x; // => 42
xを削除します。
x; // =>参照エラー:xは定義されていません
eval( "function f(){return 12;}");
f(); // => 12
fを削除します。
f(); // =>参照エラー:fは定義されていません
// varによって宣言された変数は、通常のvar宣言変数としてグローバルオブジェクトに属しますが、evalによって実行されたコードで、
//しかし、それらはdontdelete機能を持っておらず、削除することができます。
eval( "(function(){" +
「var x = 42;」 +
「Xを削除;」 +
"Return x;" +
"})();")
// => 42
// evalコードの関数のVARによって定義された変数は、削除されておらず、削除できません。
6.削除の返品値
削除は通常の演算子であり、trueまたはfalseを返します。削除されたオブジェクトのプロパティが存在し、dondeleteがある場合にfalseを返します。ここでの特徴の1つは、オブジェクト属性が存在しない場合、それが真であるため、削除が成功しているかどうかと正確に等しいものではないことです。
コードコピーは次のとおりです。
関数c(){
this.x = 42;
}
c.prototype.y = 12;
var o = new C();
OXを削除します。 // 真実
牛; // 未定義
oの「x」; // 間違い
//牛は存在し、存在しません。
oyを削除します。 // 真実
oy; // 12
// o自体にはoy属性がないので、trueを返します
//ここからプロトタイプチェーンの存在も確認できます。オブジェクト自身の属性とプロトタイプ属性は異なります。
o;を削除します。 // 間違い
// global.oにはdontdelete機能があるので、falseを返します
未定義のプロパティを削除します。 // 真実
//グローバルには未定義のプロパティという名前のプロパティがないので、trueを返します
削除42; // 真実
// 42はプロパティではないため、真実を返します。いくつかの実装は例外をスローします(ECMAScript標準に違反します)
var x = 24;
x ++を削除します。 // 真実
x; // 25
//削除されているのは、プロパティではなくx ++(24)の返品値です。