今日プロトタイプのコードを見ていたら、削除演算子を発見しました
unset: function(key) {
var value = this._object[key];
delete this._object[key];
>
マニュアルを確認したところ、
削除演算子
はオブジェクトから属性を削除したり、配列から要素を削除したりすることが分かりました。
deleteexpression
expression パラメータは有効な JScript 式で、通常はプロパティ名または配列要素です。
説明
expression の結果がオブジェクトで、expression で指定された属性が存在し、そのオブジェクトが削除を許可していない場合は、false を返します。
その他すべての場合、true を返します。
「配列から要素を削除する」というのはいい感じですが、ffで試してみると要素そのものではなく、その要素の値しか削除できないようです。ただし、オブジェクトからプロパティを削除することは可能です。
再度グーグルで検索したところ、非常に詳細な記事を見つけたので、忘れないようにここに再掲します。
Javascript 変数
実際、JavaScript では変数 = オブジェクトのプロパティが認識されるためです。スクリプトを作成します。すべてのグローバル変数は、この Global オブジェクトのプロパティです。関数を実行すると、すべてのローカル変数もこの Activation オブジェクトのプロパティになります。例:
var global = 42; 🎜>this .global; // 42、グローバル オブジェクトには、この
this.global2 = 12;
global2; // 12
function foo() {
var local = 36 ;
// ただし、アクティベーションには直接アクセスできません。
// したがって、ローカル変数には foo.local を介してアクセスできません
}
削除演算子によって削除されたオブジェクト
も C にあります。 delete 演算子は、ポインタが指すオブジェクトを削除します。例:
class Object {
public:
Object *x;
}
Object o;
o.x = new Object()
delete o.x;
しかし、JavaScript の削除は C とは異なります。o.x が指すオブジェクトを削除するのではなく、o.x 属性自体を削除します。
var o = {};
o.x = new Object();
delete o.x; // 前の行の新しいオブジェクトはまだ存在します
o.x; // o の x という名前の属性は削除されます
実際の Javascript では、o.x を削除した後、Object オブジェクトは参照の損失によりガベージ コレクションされます。そのため、o.x の削除は、o.x が指すオブジェクトを削除するのと「同等」ですが、このアクションは ECMAScript ではありません。 standard 、つまり、実装が Object オブジェクトをまったく削除しない場合でも、ECMAScript 標準には違反しません。
「オブジェクトの削除ではなく属性の削除」は以下のコードで確認できます。
o.a = a;
delete o.a; // o.a 属性は削除されます。
a.x; : 10 } オブジェクトは残ります a によって参照されるため、リサイクルされません
また、delete o.x は delete o["x"] と書くこともできます。どちらも同じです。効果。
変数に対して削除を実行する状況
変数も Global オブジェクトまたは Activation オブジェクトのプロパティであるため、変数に対する削除操作も同じ結果になります。
コードをコピーします
}
属性を削除します。削除できる属性と削除できない属性
すべての属性を削除できるわけではありません。たとえば、プロトタイプで宣言された属性は削除できません:
コードをコピー
コードは次のとおりです:
関数 C() { this.x = 42; }
C.prototype.x = 12;
var o = new C(); // 42, 構築関数で定義された o.x
delete o.x;
o.x; // 12、delete o.x を再度実行しても、プロトタイプで定義された o.x は削除されません
オブジェクトの事前定義されたプロパティ削除することもできません。 このタイプの属性は DontDelete の特性を持つと考えることができます。
var re = /abc/i; 🎜>delete re.ignoreCase;
re.ignoreCase; // true、ignoreCase は削除できません
var と関数で宣言された変数関数で宣言されている DontDelete 属性があり、削除できません。
x; // 36、x は削除されません
y を削除します
関数 { return 42; >delete foo ;
foo(); // 42
ただし、var で宣言された変数が同じグローバルに属している場合でも例外が 1 つあります。 object は通常の var 宣言された変数と同じですが、DontDelete 属性を持たないため、削除できます。
コードをコピーします
コードは次のとおりです。
ただし、eval コード内で var によって定義された変数が 1 つあります。 DontDelete があるため、削除できません。
コードをコピー
コードは次のとおりです。
eval("(function() { var x = 42 ;ルールは、削除されたオブジェクトのプロパティが存在し、DontDelete がある場合は false を返し、それ以外の場合は true を返します。ここでの特徴は、object 属性が存在しない場合でも true が返されるため、戻り値は削除の成否と完全には一致しません。 コードをコピー
コードは次のとおりです。
function C() { this.x = 42; }
C.prototype.y = 12;
var o = new C();
o.x; // 未定義
delete undefinedProperty; // true
// グローバルには unknownProperty という名前のプロパティがないため、true を返します
delete 42; // true
// 42 はプロパティではないため、true を返します。一部の実装では例外がスローされます (ECMAScript 標準に違反します)
var x = 24;
delete x; // 25
// 削除されるのは x の戻り値です。 24) は属性ではないため、true
を返します。