jsのdelete演算子とdelete演算子とは何ですか?と使用例の分析

伊谢尔伦
リリース: 2017-07-19 09:46:42
オリジナル
1772 人が閲覧しました

各プロパティには、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"
ログイン後にコピー

関数の引数に関連付けられたプロパティにも 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");
ログイン後にコピー


注: 内部プロパティはプロパティの生成時に決定され、その後の割り当てプロセスでは既存のプロパティの内部プロパティは変更されません。 この違いを理解することが重要です。

var GLOBAL_OBJECT = this;

/* 通过变量声明生成全局对象的属性,拥有DontDelete */
var foo = 1;

/* 通过未声明的变量赋值生成全局对象的属性,没有DontDelete */
bar = 2;
delete foo; // false
delete bar; // true
ログイン後にコピー

概要:

変数と関数の宣言は、Activation グローバル オブジェクトのプロパティです。


プロパティには内部プロパティがあり、そのうちの 1 つである DontDelete は、プロパティを削除できるかどうかを決定します。

グローバル コードまたは関数コード内の変数と関数宣言はすべて、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);
ログイン後にコピー

delete 演算子をいつ使用すればよいかわからないかもしれません。答えは、オブジェクトからプロパティを本当に削除したいときはいつでもです。

場合によっては、JavaScript 開発者はプロパティを削除する代わりに、以下のようにプロパティ値を null に設定します:


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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート