ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript_javascript ヒントの delete 演算子で削除できないオブジェクトの解析

JavaScript_javascript ヒントの delete 演算子で削除できないオブジェクトの解析

WBOY
WBOYオリジナル
2016-05-16 17:10:561302ブラウズ

ES3 では、次のように削除が 8.6.2.5 と 11.4.1 で導入されます

情報があります、

1. 実装内の削除オペレーターは、エンジン内で [[Delete]] メソッドを呼び出します

2. [[削除]] は 8.6.2

で定義されています。

3. 削除された属性に DontDelete 機能がある場合、

を削除するときに直接 false が返されます。

「DontDelete」を検索すると、次のどれも削除できません

が見つかります。

1、オブジェクト (10.1.6) の引数オブ​​ジェクトをアクティブ化します

コードをコピーします コードは次のとおりです。

関数 func() {
引数を削除します。
}
func(1); 、変数宣言 (10.2. 1)



コードをコピーalert(a); // 10


この記事は、var を使用して宣言された変数は削除できないことを示しています。

3、関数宣言


コードをコピー

コードは次のとおりです。function func () { } delete func;
alert(func) // func コード


4、関数の長さ属性



copy コード
コードは次のとおりです。function func(a, b) {} delete func.length; alert(func.length); / / 2

5、一部の定数 (NaN、無限大、未定義)



コードをコピー
コードは次のとおりです:delete NaN; // false delete Infinity; // false
6、組み込みコンストラクターのプロトタイプ



コードをコピー

コードは次のとおりです:delete Object.prototype; // false delete Array.prototype; // false delete ExpReg.prototype; // false delete Date .prototype; // false
delete Error.prototype; // false
delete Boolean.prototype; // false


7、配列と文字列の長さの場合




コードをコピー

コードは次のとおりです:

コードをコピー


コードは次のとおりです:

delete Math.E; // false
...
9、通常のオブジェクトのプロパティ (source、global、ignoreCase、multiline、lastIndex)コードをコピー

コードは次のとおりです

var reg = /ss/;
reg ソースを削除します; // false
...

ES5 は ES3 とは異なり、「DontDelete」はありませんが、[[Configurable]] (8.6.1) が追加されています。

値が false の場合、上記 9 点は ES5 では [[Configurable]] が false として記述されています。

ES5 の新しい Object.defineProperty メソッドは、次のように定義されたオブジェクトの Configurable を表示できます

コードをコピーします コードは次のとおりです次のように:

var obj = {name: 'John'};
Object.defineProperty(obj, "key", {
構成可能: false,
value: " static"
});
delete obj.name; // true
delete obj.key // false

オブジェクト obj には名前とキーがあります。名前は削除できますが、キーは削除できません。

さらに、ES5 厳密モードでは、構成可能値が false のオブジェクトを削除すると、例外が直接スローされます。たとえば、

コードをコピーします コードは次のとおりです。

"use strict";
delete Object.prototype;

FF のコンソールは次のエラーを報告します

削除できない組み込みオブジェクトの一部のメソッドまたはプロパティに加えて、削除できないカスタム オブジェクトもあります。たとえば、プロトタイプから継承したプロパティは削除できません。

コードをコピー コードは次のとおりです:

function person() {}
person.prototype.name = 'John Backus';
var p = new Person();
delete p.name; .name); // まだ出力 John Backus

これとプロトタイプに名前がある場合、削除後にプロトタイプが表示されます

コードをコピーします コードは次のとおりです。
function Person() {
this.name = 'John Backus'
}
person.prototype .name = 'John Resig';
var p = new Person();
console.log(p.name); // ジョン・バッカス
delete p.name;
console.log( p.name); // John Resig、プロトタイプから

プロトタイプ上の名前を削除する必要がある場合は、

delete Person.prototype.name



要約すると、 1. 組み込みオブジェクトのほとんどのプロパティとメソッドは削除できません (ただし、isNaN、parseInt などの一部は削除できます)

2. オブジェクトがプロトタイプから継承するプロパティとメソッドは削除できません

その理由も非常に単純です、

1. 組み込みオブジェクトのほとんどのプロパティとメソッドは、言語のコア API を保護するために削除できません。これらの API は、削除されると基本的に役に立ちません。 Object.prototype の削除など。

2. オブジェクトがプロトタイプから継承する属性とメソッドは、プロトタイプを保護するために削除できません。そうでない場合、「クラス A のオブジェクトがプロトタイプの属性を削除すると、A から継承されたすべてのオブジェクトはその属性を失います。」 。」

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。