今日プロトタイプのコードを見ていたら、delete 演算子を発見しました。
設定解除: 関数(キー) {
var 値 = this._object[キー];
this._object[key] を削除します。
戻り値;
}
説明書を確認したところ、
delete 演算子は、オブジェクトからプロパティを削除するか、配列から要素を削除します。
式の削除
式パラメータは有効な JScript 式で、通常はプロパティ名または配列要素です。
説明 Expression の結果がオブジェクトで、expression で指定された属性が存在し、そのオブジェクトが削除を許可していない場合は、false が返されます。
それ以外の場合は、true を返します。
「配列から要素を削除する」というのはいい感じですが、ffで試してみると要素そのものではなく、その要素の値しか削除できないようです。ただし、オブジェクトからプロパティを削除することは可能です。
もう一度グーグルで調べたところ、非常に詳しく書かれた記事を見つけたので、忘れないようにここに再投稿します。
タイトル: Javascript 変数と削除オペレーター 著作権宣言: 自由に再版できますが、元の作成者 charlee と元のリンクhttp://tech.idv2.com/2008/01/09/javascript-variables-and-を明記する必要があります。 -operator/ とこのステートメントを再印刷する場合は削除してください。
コンテンツ:
JavaScript の delete 演算子の徹底的な分析を提供する優れた記事 (元のリンク) を読みました。ここで内容を簡単に紹介します。
これは小さな削除演算子ですが、その動作は非常に複雑です。
JavaScript変数
delete 演算子で削除されたオブジェクト 変数に対して delete を実行した場合、削除できる属性と削除できない属性、削除できる変数と削除できない変数
削除の戻り値
-------------------------------------- --- ----------------------------------
Javascript の変数 実際、JavaScript では、変数 = オブジェクトのプロパティ、これは、JavaScript がスクリプトを実行する前に Global オブジェクトを作成するためであり、関数を実行すると、すべてのローカル変数もこの Activation オブジェクトのプロパティになります。例:
var global = 42;this.global; // 42、this.global2 = 12;global2; // 12function foo() { // ただし、アクティブ化はできません。直接アクセスできます , // したがって、ローカル変数には foo.local 経由でアクセスできません} delete 演算子によって削除されたオブジェクト
C++ には、ポインタが指すオブジェクトを削除する削除演算子もあります。例:
// C++class Object {public: Object *x;}Object o;ox = new Object();delete ox; // 前の行の新しい Object オブジェクトは解放されますが、JavaScript の削除は異なります。 C++ からは、ox が指すオブジェクトは削除されませんが、ox 属性自体は削除されます。
// Javascriptvar o = {};ox = new Object();delete ox; // 前の行の Object オブジェクト new はまだ存在します ox; // 実際の Javascript では、x という名前のプロパティが削除されます。 ox を削除すると、その参照が失われるため、Object オブジェクトはガベージ コレクションされます。したがって、ox を削除することは、ox が指すオブジェクトを削除することと「同等」になります。つまり、このアクションは ECMAScript 標準ではありません。実装が完全に削除されていない場合でも、Object オブジェクトを削除しなくても ECMAScript 標準に違反することはありません。
「オブジェクトの削除ではなく属性の削除」は以下のコードで確認できます。
var o = {};var a = { x: 10 };oa = a;delete oa; // oa 属性は削除されます oa; // 10、{ x: 10 } オブジェクトはさらに、delete ox は delete o["x"] と書くこともでき、どちらも同じ効果があります。
変数を削除する場合、その変数は Global オブジェクトまたは Activation オブジェクトのプロパティでもあるため、変数に対する削除操作は同じ結果になります。
var global = 42; // Global.globalfunction foo() を削除します。 { var local = 36; // Activation.local を削除します。 削除できるプロパティと削除できないプロパティ消去。たとえば、プロトタイプで宣言されたプロパティは削除できません。
function C() { this.x = 42; }C.prototype.x = 12;var o = new C();ox; .xdelete ox;ox; // 12、delete oxを再度実行してもプロトタイプに定義されているoxは削除されません。オブジェクトの事前定義されたプロパティは削除できません。 このタイプの属性は DontDelete の特性を持つと考えることができます。
var re = /abc/i;delete re.ignoreCase;re.ignoreCase; // true、ignoreCase は、var で宣言された変数と削除できない変数を削除できません。削除できません。
var x = 36;delete x;x; // 36、x は削除されません y = 12;delete y;y; // unknownfunction foo() { return 42; // 42 1 つの例外は、eval を通じて実行されるコードでは、var を通じて宣言された変数は通常の var 宣言された変数と同じ Global オブジェクトに属しますが、DontDelete 属性を持たないため、削除できます。
eval("var x = 36;");x; // 42delete x;x; // ただし、eval コード内の関数で var で定義された変数には DontDelete があり、削除できません。 function() { var x = 42; delete x; return x; // 42delete の戻り値を返します。
削除は通常の演算子で、true または false を返します。ルールは、削除されたオブジェクトのプロパティが存在し、DontDelete がある場合は false を返し、それ以外の場合は true を返します。ここでの特徴は、object 属性が存在しない場合でも true が返されるため、戻り値は削除の成否と完全には一致しません。
function C() { this.x = 42; }C.prototype.y = 12;var o = new C();delete ox; // 未定義の "x"; // false/ / ox は存在しますが、DontDelete はありません。 return truedelete oy; // 12// o 自体には oy 属性がないため、true を返します。// ここから、プロトタイプ チェーンの存在もわかります。オブジェクト自身の属性とプロトタイプ属性は異なります。 delete o; // false// Global.o には DontDelete 属性があるため、falsedelete が返されます。 unknownProperty; // true// Global には、unknownProperty という名前のプロパティがないため、truedelete 42 が返されます。 /42 はプロパティではないため、true を返します。一部の実装では例外がスローされます (ECMAScript 標準に違反します) var x = 24 // truex; // 25// 削除されるのは属性ではなく、x++ の戻り値 (24) であるため、true が返されます。