では、なぜオブジェクトの属性を削除できるのでしょうか:
var x = { a: 1 }; delete x.a; // true x.a; // undefined
ただし、変数は削除できません:
var x = 1; delete x; // false; x; // 1
関数を削除することもできません:
function x() {}; delete x; // false; typeof x; // "function"
注: delete は、プロパティを削除できない場合にのみ false を返します。
各属性には、0 個以上の内部属性 (*ReadOnly、DontEnum、DontDelete、Internal**) があります。 これらはタグと考えることができます。プロパティには特別な内部プロパティがある場合とない場合があります。 今日の議論では、DontDelete に興味があります。
変数と関数が宣言されると、それらは Variable オブジェクトのプロパティになります。つまり、アクティベーション オブジェクト (関数コード内) またはグローバル オブジェクト (グローバル コード内) になります。これらのプロパティには、内部プロパティ DontDelete が生成されます。 ただし、明示的/暗黙的に割り当てられたプロパティは DontDelete を生成しません。 これが本質的に、一部のプロパティは削除できるが、他のプロパティは削除できない理由です。
var GLOBAL_OBJECT = this;
/* 'foo' は変数宣言を通じて生成されるグローバル オブジェクトのプロパティであるため、内部プロパティ DontDelete
を持ちます。
だから削除できない*/
var foo = 1; delete foo; // false typeof foo; // "number" /* 'bar
' は変数宣言によって生成されるグローバル オブジェクトのプロパティであるため、DontDelete 子
を持ちます。
だから削除もできない*/
function bar() {}; delete bar; // false typeof bar; // "function"
/* 'baz' はグローバル オブジェクト
のプロパティでもあります
ただし、プロパティの割り当てによって生成されるため、DontDelete はありません
だから削除できる*/
GLOBAL_OBJECT.baz = "baz"; delete GLOBAL_OBJECT.baz; // true typeof GLOBAL_OBJECT.baz; // "undefined"
1.5、ビルトインと DontDelete ビルトインと DontDelete
これが、これがすべて起こる理由です。プロパティの特別な内部プロパティが、プロパティを削除できるかどうかを制御します。 注: 組み込みオブジェクトの一部のプロパティには DontDelete という内部プロパティがあるため、削除できません。また、特殊な引数変数 (ご存知のとおり、アクティブ化されたオブジェクトのプロパティ) には、関数インスタンスの長さ (戻りパラメータの長さ) プロパティもあります。削除しないでください:
(function() { //不能删除'arguments',因为有DontDelete delete arguments; // false; typeof arguments; // "object" //也不能删除函数的length,因为有DontDelete function f() {}; delete f.length; // false; typeof f.length; // "number" }) ();
関数の引数に関連付けられたプロパティにも DontDelete があり、削除することもできません
(function(foo,bar) { delete foo; // false foo; // 1 delete bar; // false bar; // "bah" }) (1,"bah");
1.6. 未宣言の変数の代入
宣言されていない変数の割り当ては、そのプロパティがスコープ チェーンの他の場所で見つからない限り、グローバル オブジェクトのプロパティになることを覚えているかもしれません。 これで、プロパティの割り当てと変数宣言の違いが理解できました。後者は DontDelete を生成しますが、前者は生成しません。これが、宣言されていない変数の割り当てを削除できる理由です。
var GLOBAL_OBJECT = this; /* 通过变量声明生成全局对象的属性,拥有DontDelete */ var foo = 1; /* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */ bar = 2; delete foo; // false delete bar; // true
注: 内部属性は属性の生成時に決定され、その後の割り当てプロセスでは既存の属性の内部属性は変更されません。 この違いを理解することが重要です。
/* 'foo'创建的同时生成DontDelete */ function foo() {}; /* 之后的赋值过程不改变已有属性的内部属性,DontDelete仍然存在 */ foo = 1; delete foo; // false; typeof foo; // "number" /* 但赋值一个不存在的属性时,创建了一个没有内部属性的属性,因此没有DontDelete */ this.bar = 1; delete bar; // true; typeof bar; // "undefined"
概要:
変数と関数の宣言は、Activation グローバル オブジェクトのプロパティです。
プロパティには内部プロパティがあり、そのうちの 1 つである DontDelete は、プロパティを削除できるかどうかを決定します。
グローバル コードまたは関数コード内の変数と関数宣言はすべて、DontDelete を使用して属性を生成します。
関数パラメータもアクティベーション オブジェクトの属性であり、DontDelete も持ちます。
オブジェクト内の属性を削除します: delete object.member
自分のメンバーのみ削除できます
var で宣言されたグローバル変数のみ削除できません
window または window[""] を使用して追加されたグローバル メンバーは削除できます
ps: Javascript の演算子を削除
削除は、JavaScript 言語ではあまり使用されない操作の 1 つですが、削除またはクリア アクションを実行する必要がある場合、削除操作が必要になることがあります。この記事では、その使用方法と仕組みについて詳しく説明します。
削除の目的は、ご想像のとおり、何かを削除することです。より具体的には、次の例のように、オブジェクトの属性を削除します。
var Benjamin = { "name": "zuojj", "url" : "http://www.zuojj.com" }; delete Benjamin.name; //Outputs: Object { url: "http://www.zuojj.com" } console.log(Benjamin);
var benjamin = "http://www.zuojj.com"; delete benjamin; //Outputs: "http://www.zuojj.com" console.log(benjamin);
// Because var isn't used, this is a property of window benjamin = "zuojj"; delete window.benjamin; // ReferenceError: benjamin is not defined console.log(benjamin);
你可能不知道在什么情况下使用删除运算符。答案是,只要你真的想从对象中删除一个属性。
有的时候,Javascript开发不是删除一个属性,而是把这个属性值设置为null.像下面这样:
var benjamin = { "name": "zuojj", "url" : "http://www.zuojj.com" }; benjamin.name = null;
虽然这有效地切断从原来的值的属性,但该属性本身仍然存在的对象上,你可以看到如下:
// Outputs: Object { name: null, url: "http://www.zuojj.com" } console.log(benjamin);
同时,像in和for in 循环运算将不会报告null属性的存在,如果你使用个对象,可能使用这些方法来检查一个对象,你可能想确保你真正删除任何不需要的属性。
最后,你应该记住,删除并没有破坏属性的值,仅仅属性本身,看下面的例子:
var name = "zuojj", benjamin = {}; benjamin.name = name; delete benjamin.name; //Outputs: "zuojj" console.log(name);
这里,name和benjamin.name映射到相同的值,真如你所看到的,删除benjamin.name并不会影响name.
以上,就是我对delete运算符的概述,不妥之处,欢迎大家批评指正。