javascript_javascript スキルの削除および削除演算子

WBOY
リリース: 2016-05-16 15:32:14
オリジナル
1292 人が閲覧しました

では、なぜオブジェクトの属性を削除できるのでしょうか:

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);
ログイン後にコピー
delete 演算子は、次の例のように、通常の変数を削除しません。

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);
ログイン後にコピー
delete 演算子にも戻り値があります。属性の削除が成功した場合は true を返し、属性が書き込み可能でない場合は false を返し、そうでない場合はエラーをスローします。厳密モード。

你可能不知道在什么情况下使用删除运算符。答案是,只要你真的想从对象中删除一个属性。

有的时候,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运算符的概述,不妥之处,欢迎大家批评指正。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!