各プロパティには、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 はありません
だからこそ、削除できるのです。これがすべての理由です。プロパティの特別な内部プロパティが、プロパティが削除することができます。 注: 組み込みオブジェクトの一部のプロパティには DontDelete という内部プロパティがあるため、削除できません。また、特殊な引数変数 (ご存知のとおり、アクティブ化されたオブジェクトのプロパティ) には、関数インスタンスの長さ (戻りパラメータの長さ) プロパティもあります。 DontDelete:
GLOBAL_OBJECT.baz = "baz"; delete GLOBAL_OBJECT.baz; // true typeof GLOBAL_OBJECT.baz; // "undefined"
(function() { //不能删除'arguments',因为有DontDelete delete arguments; // false; typeof arguments; // "object" //也不能删除函数的length,因为有DontDelete function f() {}; delete f.length; // false; typeof f.length; // "number" }) ();
(function(foo,bar) { delete foo; // false foo; // 1 delete bar; // false bar; // "bah" }) (1,"bah");
注: 内部プロパティはプロパティの生成時に決定され、その後の割り当てプロセスでは既存のプロパティの内部プロパティは変更されません。 この違いを理解することが重要です。
var GLOBAL_OBJECT = this; /* 通过变量声明生成全局对象的属性,拥有DontDelete */ var foo = 1; /* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */ bar = 2; delete foo; // false delete bar; // true
概要:
グローバル コードまたは関数コード内の変数と関数宣言はすべて、DontDelete を使用して属性を生成します。
関数パラメータもアクティベーションオブジェクトのプロパティであり、DontDelete もあります。オブジェクト内の属性を削除します: オブジェクトを削除します。メンバー
は自分のメンバーのみを削除できます
、VAR で宣言されたグローバル変数のみが、Window [""] グローバル メンバーの使用を許可しません。
追記: Javascript の削除演算子
削除は、JavaScript 言語であまり使用されない操作の 1 つですが、削除またはクリア アクションを実行する必要がある場合、削除操作が必要になることがあります。この記事では、その使用方法と仕組みについて詳しく説明します。
ご想像のとおり、削除の目的は何かを削除することです。より具体的には、次の例のように、オブジェクトの属性を削除します。
/* 'foo'创建的同时生成DontDelete */ function foo() {}; /* 之后的赋值过程不改变已有属性的内部属性,DontDelete仍然存在 */ foo = 1; delete foo; // false; typeof foo; // "number" /* 但赋值一个不存在的属性时,创建了一个没有内部属性的属性,因此没有DontDelete */ this.bar = 1; delete bar; // true; typeof bar; // "undefined"
var Benjamin = { "name": "zuojj", "url" : "http://www.php.cn" }; delete Benjamin.name; //Outputs: Object { url: "http://www.php.cn" } console.log(Benjamin);
ただし、「グローバル変数」は実際にはグローバル オブジェクト (ブラウザのウィンドウ) オブジェクトのプロパティであるため、削除する可能性があります。
var benjamin = "http://www.php.cn"; delete benjamin; //Outputs: "http://www.php.cn" console.log(benjamin);
delete 演算子にも戻り値があります。属性の削除が成功した場合は true を返し、属性が書き込み可能でないために削除できない場合は false を返すか、if をスローします。厳密モードで。
// Because var isn't used, this is a property of window benjamin = "php"; delete window.benjamin; // ReferenceError: benjamin is not defined console.log(benjamin);
var benjamin = { "name": "zuojj", "url" : "http://www.php.cn" }; var nameDeleted = delete benjamin.name; // Outputs: true console.log(nameDeleted); "use strict"; var benjamin_ = "zuojj"; //Outputs: Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. delete benjamin_;
// Outputs: Object { name: null, url: "http://www.php.cn" } 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.
以上がjsのdelete演算子とdelete演算子とは何ですか?と使用例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。