首頁 > web前端 > js教程 > 解析JavaScript中delete操作符不能刪除的物件_javascript技巧

解析JavaScript中delete操作符不能刪除的物件_javascript技巧

WBOY
發布: 2016-05-16 17:10:56
原創
1358 人瀏覽過

ES3 中,delete在8.6.2.5及11.4.1有介紹,如下

有一些訊息,

1.實作上delete運算子會呼叫引擎內部的[[Delete]]方法

2、[[Delete]]在8.6.2裡定義

3、刪除的屬性有個DontDelete的特性,如果有,delete時直接回傳false

搜尋“DontDelete”,會發現有很多,如下都不能delete

1, 啟動物件的arguments物件(10.1.6)

複製程式碼 程式碼如下:


程式碼如下:



程式碼如下:


程式碼如下: function func() {     delete arguments;     alert(arguments); }
func(1);


func(1);



複製程式碼

程式碼如下:var a = 10;
var a = 10;; ;
alert(a); // 10


這條在很多JS書裡有提及,即不能delete掉使用var聲明的變數。

3,函數宣告
複製程式碼 程式碼如下:

function func( }
delete func;
alert(func); // func code

4,函數的length屬性
程式碼如下:


function func(a, b) {}
delete func.length;
alert(func.length); / 2


5,一些常量(NaN、Infinity、undefined) 代碼如下:


delete NaN; // false
delete Infinity; // false
delete undefined; // false


6,內建建構器的prototype



複製程式碼
程式碼如下:delete Object.prototype; Function.prototype; // false delete Array.prototype; // false delete ExpReg.prototype; // false
delete Date.prototype; // false
delete Error.prototype; false
delete Number.prototype; // false
delete Boolean.prototype; // false
delete String.prototype; // false

7, 數組和字串的length
複製程式碼 程式碼如下:

var arr = [], str = 'hello' ;
delete arr.length; // false
delete str.length; // false


8,Math物件的屬性(Math.E、Math.LN10、Math.LN2 、Math.LOG2E、Math.LOG10E、Math.PI、Math.SQRT1_2、Math.SQRT2) 代碼如下:


delete Math.E; // false
...
9,正規物件的屬性(source、global、ignoreCase、multiline、lastIndex)複製程式碼 程式碼如下:var reg = /ss/; var reg = /ss/; ddelete . source; // false ...
ES5 與ES3不同,ES5中沒有“DontDelete”,卻增加了 [[Configurable]] (8.6.1)。

如果該值為false,則不能delete,以上列舉的9點在ES5中描述為[[Configurable]]為false。

ES5新增的Object.defineProperty方法可顯示的定義物件的Configurable,如下

複製程式碼 程式碼如下:

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

物件obj有name,key。 name可以delete,key則不行。

此外ES5嚴格模式中delete configuable為false的物件時會直接拋異常。如

複製程式碼 程式碼如下:

"use strict";

"use strict";
Objectete . prototype;

FF中控制台報錯如下


除了內建物件的某些方法或屬性不能刪除外,自訂物件也有不能刪除的。如delete不能刪除物件繼承原型上的屬性複製程式碼

程式碼如下:



程式碼如下:

function Person() {}
Person.prototype.name = 'John Backus';
var p = new Person(); delete p.name; console.log(p.name); // 仍然輸出John Backus 如果this和prototype上都有name,那麼delete後,會將prototype上的呈現出來


複製程式碼


程式碼如下:


function Person() {
    this.name = 'John Backus';
}
}
Person.prototype .name = 'John Resig';
var p = new Person(); console.log(p.name); // John Backus delete p.name; console.log( p.name); // John Resig, 來自原型如果非要刪除原型上的name,只能


複製程式碼
代碼如下:delete Person.prototype.name

總結下:

1,內建物件的屬性及方法多數不能delete(雖然有些能delete,如isNaN、parseInt)

2,物件繼承於原型的屬性和方法不能delete

原因也很簡單, 1,內建物件的屬性及方法多數不能delete保護該語言最核心API,這些API被delete了,基本上就廢了。如delete Object.prototype。 2,物件繼承於原型的屬性和方法不能delete是出於保護原型,否則 「類別A的物件delete了原型上的屬性,那麼繼承於A的都將遺失該屬性」。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板