delete expression
expression 應該是一個對象的屬性引用,例如:express
delete object.property數組
delete object['property']
若是 expression 的計算結果不是一個對象的屬性引用,那麼,delete不會起任何做用。prototype
objectName 對象名. property 須要刪除的屬性. 返回值
【注意】在嚴格模式中,若是屬性是一個不可配置(non-configurable)屬性,刪除時會拋出異常,非嚴格模式下返回 false。其餘狀況都返回 true。code
delete 操做符與直接釋放內存(只能經過解除引用來間接釋放)沒有關係。可查看內存管理頁面。對象
【注意】你能夠使用 delete 操做符來刪除一個隱式聲明的全局變量,也就是沒有使用 var 定義的全局變量.全局變量實際上是global對象(window)的屬性.繼承
若是 delete 操做符刪除成功,則被刪除的屬性將從所屬的對象上完全消失。而後,若是該對象的原型鏈上有一個同名屬性,則該對象會從原型鏈上繼承該同名屬性。ip
在ECMAScript 6中,經過 const 或 let 聲明指定的 "temporal dead zone" (TDZ) 對 delete 操做符也會起做用。所以,下面的代碼將會拋出 ReferenceError。內存
function foo(){
delete x;
let x;
}原型鏈
function bar() {
delete y;
const y;
}
一些對象的屬性不能被delete. ECMA 262 規範中把這些屬性標記爲 DontDelete.get
x = 42; // 隱式聲明的全局變量
var y = 43; // 顯式聲明的全局變量
myobj = {
h: 4,
k: 5
}
// 隱式聲明的全局變量能夠被刪除
delete x; // 返回 true
// 顯式聲明的全局變量不能被刪除,該屬性不可配置(not configurable)
delete y; // 返回 false
//內置對象的內置屬性不能被刪除
delete Math.PI; // 返回 false
//用戶定義的屬性能夠被刪除
delete myobj.h; // 返回 true
// myobj 是全局對象(window)的屬性,而不是變量,所以能夠被刪除
delete myobj; // 返回 true
function f() {
var z = 44;
// delete doesn't affect local variable names
delete z; // returns false
}
你不能刪除一個對象從原型繼承而來的屬性(不過你能夠從原型上直接刪掉它).
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
// 無效的操做
delete foo.bar;
// logs 42,繼承的屬性
console.log(foo.bar);
// 直接刪除原型上的屬性
delete Foo.prototype.bar;
// logs "undefined",已經沒有繼承的屬性
console.log(foo.bar);
刪除數組元素
當你刪除一個數組元素時,數組的 length 屬性並不會變小。
例如,若是你刪除了a[3], a[4]仍然是a[4], a[3]成爲undefined. 即使你刪除了最後一個元素也是如此 (delete a[a.length-1]).
當用 delete 操做符刪除一個數組元素時,被刪除的元素已經徹底不屬於該數組。下面的例子中, trees[3] 被使用delete完全刪除。
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
// 這裏不會被執行
}
若是你想讓一個數組元素的值變爲 undefined 而不是刪除它,能夠使用 undefined 給其賦值而不是使用 delete 操做符。下面的例子中,trees[3] 被賦值爲undefined,但該元素仍然存在。
var trees = ["redwood","bay","cedar","oak","maple"];
trees[3]=undefined;
if (3 in trees) {
// 這裏會被執行
}
1.delete使用原則:delete 操做符用來刪除一個對象的屬性。
2.delete在刪除一個不可配置的屬性時在嚴格模式和非嚴格模式下的區別:
在嚴格模式中,若是屬性是一個不可配置(non-configurable)屬性,刪除時會拋出異常;
非嚴格模式下返回 false。
3.delete能刪除隱式聲明的全局變量:這個全局變量實際上是global對象(window)的屬性
4.delete能刪除的:
(1)可配置對象的屬性(2)隱式聲明的全局變量 (3)用戶定義的屬性 (4)在ECMAScript 6中,經過 const 或 let 聲明指定的 "temporal dead zone" (TDZ) 對 delete 操做符也會起做用
delete不能刪除的:
(1)顯式聲明的全局變量 (2)內置對象的內置屬性 (3)一個對象從原型繼承而來的屬性
5.delete刪除數組元素:
(1)當你刪除一個數組元素時,數組的 length 屬性並不會變小,數組元素變成undefined
(2)當用 delete 操做符刪除一個數組元素時,被刪除的元素已經徹底不屬於該數組。
(3)若是你想讓一個數組元素的值變爲 undefined 而不是刪除它,能夠使用 undefined 給其賦值而不是使用 delete 操做符。此時數組元素是在數組中的
6.delete 操做符與直接釋放內存(只能經過解除引用來間接釋放)沒有關係。