ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptのdelete演算子の詳しい紹介_基礎知識

Javascriptのdelete演算子の詳しい紹介_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:46:011116ブラウズ

1. 変数

JavaScript の delete 演算子について言えば、まず JavaScript の変数と属性の関係を理解する必要があります。

JavaScript では、変数とオブジェクトのプロパティの関係は非常に微妙であり、JavaScript はスクリプトを実行する前にグローバル オブジェクト (ブラウザのウィンドウ オブジェクトなど) を作成するため、多くの場合それらは同一視されることさえあります。グローバル変数は、グローバル オブジェクトの属性です。関数を実行すると、すべてのローカル変数もこのアクティブ化オブジェクトの属性になります。これらの JavaScript のスコープとクロージャについて学ぶことができます。

コードをコピー コードは次のとおりです:

//プロトタイプで宣言された属性は使用できません。削除されました

var global = 1;
this.global; // 1、グローバル オブジェクトは this
this.global2 = 2;
global2; // 12function foo( ) {
var local = 36;
// ただし、アクティベーションには直接アクセスできません。
// したがって、ローカル変数には foo.local
}
を介してアクセスできません。
変数はオブジェクトのプロパティと同等であるように見えますが、少なくとも削除演算子の場合はそうではありません。私の理解では、変数宣言は var ステートメントで完了する必要があり、var ステートメントで宣言されていないグローバル変数はすべてウィンドウ オブジェクトの属性です。これにより、変数とオブジェクトのプロパティの関係を理解し​​やすくなります。

2. 演算子 を削除します。

削除演算子は、オブジェクト属性を削除するために使用されます。参照型値の場合、オブジェクト属性自体も削除されますが、属性が指すオブジェクトは削除されません。質問がある場合は、基本型と参照型の値を確認するか、次のコードをテストしてください:


コードをコピー コードは次のとおりです。
var o = {};
var a = { x: 10 };
o.a = a;
delete o.a; // o.a 属性は削除されます
console.log(o.a); // 未定義
console.log(a.x); // 10、{ x: 10 } オブジェクトはまだ参照されているため、リサイクル不可
さらに、delete o.x は delete o["x"] と書くこともでき、どちらも同じ効果があります。

3. 変数は削除できません

var で宣言された変数と function で宣言された関数には dontdelete 属性があり、削除できません。 var で宣言されていないグローバル変数 (グローバル オブジェクトのプロパティ)


コードをコピー コードは次のとおりです:
var global = {
a: 123,
b: {
c: 1345
}
};
グローバルを削除します。 //無効な
console.log (global )

obj = {
a: 123
};
delete obj; // obj グローバル変数、ウィンドウ オブジェクトの obj 属性を削除します
console.log (obj);/ /obj が定義されていません

4. プロトタイプで宣言された属性とオブジェクトの属性は削除できません

プロトタイプのプロトタイプで宣言された属性とオブジェクトに付属する属性 (実際、これらの属性はプロトタイプのプロトタイプにもあります) は dontdelete 機能を持つと見なされ、削除できません。たとえば、


コードをコピー コードは次のとおりです。
// で宣言された属性プロトタイプは削除できません

function obj() {
this.x = 1;
}
obj.prototype.x = 2;

var o = new obj ();
console.log(o.x); // 1, o.x はコンストラクターで定義されています

delete o.x;
console.log(o.x); // 2, o.x はプロトタイプで定義されています、再度実行しても delete o.x も削除されません

//オブジェクトのプロパティは削除できません

var strings = "123456";
console.log(strings. length);// 6
delete strings.length;
console.log(strings.length);//まだ 6

5. eval ステートメント におけるいくつかの例外

eval で実行されるコードでは、var で宣言された変数は通常の var 宣言された変数と同じグローバル オブジェクトに属しますが、dontdelete 機能がないため削除できます。ただし、eval コードの関数内で var によって定義された変数には dontdelete があり、削除できません。

コードをコピー コードは次のとおりです:
eval("var x = 42;");
x; 42
delete x;
x; // =>x が定義されていません。 eval("function f() { return 12; }");
f(); // => 12
delete f;
f(); // => not generated
//eval で実行されるコードでは、var で宣言された変数は通常の var で宣言された変数と同じグローバル オブジェクトに属しますが、
// dontdelete 機能がないため削除できます。
eval("(function () {"
" var x = 42;"
" delete x;"
" return x;"
"})();")
// => 42
// eval コードの関数内で var で定義された変数には dontdelete が設定されているため、削除できません。

6. 削除の戻り値

delete は通常の演算子で、true または false を返します。削除されたオブジェクトのプロパティが存在し、dontdelete を持つ場合は false を返し、それ以外の場合は true を返します。 ここでの特徴は、object 属性が存在しない場合でも true が返されるため、戻り値は削除の成否と完全には一致しません。


コードをコピー コードは次のとおりです。
function c() {
this .x = 42;
}
c.prototype.y = 12;
var o = new c();

delete o.x; // true
o.x; unknown
"x" in o; // false
// o.x が存在し、dontdelete が存在しない場合、true

delete o.y; // true
o.y; >// o 自体 o.y 属性がないので true を返します
// ここから、オブジェクト自身の属性とプロトタイプの属性が異なることもわかります

delete o ; // false
// global .o には dontdelete 属性があるため、false

delete unknownproperty; // true
// global には unknownproperty という名前のプロパティがないため、true
を返します。
delete 42; // true
// 42 は属性ではないため、true を返します。一部の実装は例外をスローします (ecmascript 標準に違反します)

var x = 24;
delete x; // true
x; // 25
// x は削除されます。 24) は属性ではないため、true

を返します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。