JavaScript delete操作符應(yīng)用實(shí)例
更新時(shí)間:2009年01月13日 01:28:26 作者:
delete 運(yùn)算符 從對(duì)象中刪除一個(gè)屬性,或從數(shù)組中刪除一個(gè)元素。
今天在看prototype代碼時(shí)發(fā)現(xiàn)了delete這個(gè)操作符
unset: function(key) {
var value = this._object[key];
delete this._object[key];
return value;
}
查了一下手冊(cè),
delete 運(yùn)算符
從對(duì)象中刪除一個(gè)屬性,或從數(shù)組中刪除一個(gè)元素。
delete expression
expression 參數(shù)是一個(gè)有效的 JScript 表達(dá)式,通常是一個(gè)屬性名或數(shù)組元素。
說明
如果 expression 的結(jié)果是一個(gè)對(duì)象,且在 expression 中指定的屬性存在,而該對(duì)象又不允許它被刪除,則返回 false。
在所有其他情況下,返回 true。
看到“從數(shù)組中刪除一個(gè)元素”感覺不錯(cuò),可ff里試了一下,似乎只能刪除那個(gè)元素的值,而不是元素本身。不過從對(duì)象中刪除一個(gè)屬性是可以的。
又google了一下,發(fā)現(xiàn)有一篇文章講得很詳細(xì),轉(zhuǎn)載過來以免忘記:
Javascript的變量
實(shí)際上Javascript中,變量 = 對(duì)象屬性,這是因?yàn)?Javascript 在執(zhí)行腳本之前會(huì)創(chuàng)建一個(gè)Global對(duì)象,所有的全局變量都是這個(gè)Global對(duì)象的屬性,執(zhí)行函數(shù)時(shí)也會(huì)創(chuàng)建一個(gè)Activation對(duì)象,所有的局部變量都是這個(gè)Activation對(duì)象的屬性。如下例:
var global = 42;
this.global; // 42, 可以通過this來訪問Global對(duì)象
this.global2 = 12;
global2; // 12
function foo() {
var local = 36;
// 不過無法直接訪問Activation,
// 因此無法通過 foo.local 的方式來訪問local變量
}
delete操作符刪除的對(duì)象
C++中也有delete操作符,它刪除的是指針?biāo)赶虻膶?duì)象。例如:
// C++
class Object {
public:
Object *x;
}
Object o;
o.x = new Object();
delete o.x; // 上一行new的Object對(duì)象將被釋放
但Javascript的delete與C++不同,它不會(huì)刪除o.x指向的對(duì)象,而是刪除o.x屬性本身。
// Javascript
var o = {};
o.x = new Object();
delete o.x; // 上一行new的Object對(duì)象依然存在
o.x; // undefined,o的名為x的屬性被刪除了
在實(shí)際的Javascript中,delete o.x之后,Object對(duì)象會(huì)由于失去了引用而被垃圾回收,所以delete o.x也就“相當(dāng)于”刪除了o.x所指向的對(duì)象,但這個(gè)動(dòng)作并不是ECMAScript標(biāo)準(zhǔn),也就是說,即使某個(gè)實(shí)現(xiàn)完全不刪除Object對(duì)象,也不算是違反ECMAScript標(biāo)準(zhǔn)。
“刪除屬性而不是刪除對(duì)象”這一點(diǎn),可以通過以下的代碼來確認(rèn)。
var o = {};
var a = { x: 10 };
o.a = a;
delete o.a; // o.a屬性被刪除
o.a; // undefined
a.x; // 10, 因?yàn)閧 x: 10 } 對(duì)象依然被 a 引用,所以不會(huì)被回收
另外,delete o.x 也可以寫作 delete o["x"],兩者效果相同。
對(duì)變量執(zhí)行delete的情況
由于變量也是 Global 或者是 Activation 對(duì)象的屬性,所以對(duì)變量的delete操作也是同樣的結(jié)果。
var global = 42;
delete global; // 刪除Global.global
function foo() {
var local = 36;
delete local; // 刪除Activation.local
}
能刪除的屬性和不能刪除的屬性
并不是所有的屬性都能被delete。例如,prototype中聲明的屬性就無法被delete:
function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C();
o.x; // 42, 構(gòu)造函數(shù)中定義的o.x
delete o.x;
o.x; // 12, prototype中定義的o.x,即使再次執(zhí)行delete o.x也不會(huì)被刪除
對(duì)象的預(yù)定義屬性也無法刪除。 可以認(rèn)為這類屬性帶有DontDelete的特性。
var re = /abc/i;
delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase無法刪除
能刪除的變量和不能刪除的變量
通過var聲明的變量和通過function聲明的函數(shù)擁有DontDelete特性,無法被刪除。
var x = 36;
delete x;
x; // 36, x沒有被刪除
y = 12;
delete y;
y; // undefined
function foo() { return 42; }
delete foo;
foo(); // 42
但是有一點(diǎn)例外,就是通過 eval 執(zhí)行的代碼中,通過var聲明的變量雖然與正常的var聲明變量同屬于Global對(duì)象,但它們不具有DontDelete特性,能被刪除。
eval("var x = 36;");
x; // 42
delete x;
x; // undefined
但是這也有一點(diǎn)例外,eval的代碼中的函數(shù)內(nèi)通過var定義的變量具有DontDelete,不能被刪除。
eval("(function() { var x = 42; delete x; return x; })();");
// 返回 42
delete的返回值
delete是普通運(yùn)算符,會(huì)返回true或false。規(guī)則為:當(dāng)被delete的對(duì)象的屬性存在并且擁有DontDelete時(shí)返回false,否則返回true。這里的一個(gè)特點(diǎn)就是,對(duì)象屬性不存在時(shí)也返回true,所以返回值并非完全等同于刪除成功與否。
function C() { this.x = 42; }
C.prototype.y = 12;
var o = new C();
delete o.x; // true
o.x; // undefined
"x" in o; // false
// o.x存在并且沒有DontDelete,返回true
delete o.y; // true
o.y; // 12
// o自身沒有o.y屬性,所以返回true
// 從這里也可以看到prototype鏈的存在,對(duì)象自身屬性和prototype屬性是不同的
delete o; // false
// Global.o擁有DontDelete特性所以返回false
delete undefinedProperty; // true
// Global沒有名為undefinedProperty的屬性因此返回true
delete 42; // true
// 42不是屬性所以返回true。有的實(shí)現(xiàn)會(huì)拋出異常(違反ECMAScript標(biāo)準(zhǔn))
var x = 24;
delete x++; // true
x; // 25
// 被刪除的是x++的返回值(24),不是屬性,所以返回true
復(fù)制代碼 代碼如下:
unset: function(key) {
var value = this._object[key];
delete this._object[key];
return value;
}
查了一下手冊(cè),
delete 運(yùn)算符
從對(duì)象中刪除一個(gè)屬性,或從數(shù)組中刪除一個(gè)元素。
delete expression
expression 參數(shù)是一個(gè)有效的 JScript 表達(dá)式,通常是一個(gè)屬性名或數(shù)組元素。
說明
如果 expression 的結(jié)果是一個(gè)對(duì)象,且在 expression 中指定的屬性存在,而該對(duì)象又不允許它被刪除,則返回 false。
在所有其他情況下,返回 true。
看到“從數(shù)組中刪除一個(gè)元素”感覺不錯(cuò),可ff里試了一下,似乎只能刪除那個(gè)元素的值,而不是元素本身。不過從對(duì)象中刪除一個(gè)屬性是可以的。
又google了一下,發(fā)現(xiàn)有一篇文章講得很詳細(xì),轉(zhuǎn)載過來以免忘記:
Javascript的變量
實(shí)際上Javascript中,變量 = 對(duì)象屬性,這是因?yàn)?Javascript 在執(zhí)行腳本之前會(huì)創(chuàng)建一個(gè)Global對(duì)象,所有的全局變量都是這個(gè)Global對(duì)象的屬性,執(zhí)行函數(shù)時(shí)也會(huì)創(chuàng)建一個(gè)Activation對(duì)象,所有的局部變量都是這個(gè)Activation對(duì)象的屬性。如下例:
復(fù)制代碼 代碼如下:
var global = 42;
this.global; // 42, 可以通過this來訪問Global對(duì)象
this.global2 = 12;
global2; // 12
function foo() {
var local = 36;
// 不過無法直接訪問Activation,
// 因此無法通過 foo.local 的方式來訪問local變量
}
delete操作符刪除的對(duì)象
C++中也有delete操作符,它刪除的是指針?biāo)赶虻膶?duì)象。例如:
復(fù)制代碼 代碼如下:
// C++
class Object {
public:
Object *x;
}
Object o;
o.x = new Object();
delete o.x; // 上一行new的Object對(duì)象將被釋放
但Javascript的delete與C++不同,它不會(huì)刪除o.x指向的對(duì)象,而是刪除o.x屬性本身。
復(fù)制代碼 代碼如下:
// Javascript
var o = {};
o.x = new Object();
delete o.x; // 上一行new的Object對(duì)象依然存在
o.x; // undefined,o的名為x的屬性被刪除了
在實(shí)際的Javascript中,delete o.x之后,Object對(duì)象會(huì)由于失去了引用而被垃圾回收,所以delete o.x也就“相當(dāng)于”刪除了o.x所指向的對(duì)象,但這個(gè)動(dòng)作并不是ECMAScript標(biāo)準(zhǔn),也就是說,即使某個(gè)實(shí)現(xiàn)完全不刪除Object對(duì)象,也不算是違反ECMAScript標(biāo)準(zhǔn)。
“刪除屬性而不是刪除對(duì)象”這一點(diǎn),可以通過以下的代碼來確認(rèn)。
復(fù)制代碼 代碼如下:
var o = {};
var a = { x: 10 };
o.a = a;
delete o.a; // o.a屬性被刪除
o.a; // undefined
a.x; // 10, 因?yàn)閧 x: 10 } 對(duì)象依然被 a 引用,所以不會(huì)被回收
另外,delete o.x 也可以寫作 delete o["x"],兩者效果相同。
對(duì)變量執(zhí)行delete的情況
由于變量也是 Global 或者是 Activation 對(duì)象的屬性,所以對(duì)變量的delete操作也是同樣的結(jié)果。
復(fù)制代碼 代碼如下:
var global = 42;
delete global; // 刪除Global.global
function foo() {
var local = 36;
delete local; // 刪除Activation.local
}
能刪除的屬性和不能刪除的屬性
并不是所有的屬性都能被delete。例如,prototype中聲明的屬性就無法被delete:
復(fù)制代碼 代碼如下:
function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C();
o.x; // 42, 構(gòu)造函數(shù)中定義的o.x
delete o.x;
o.x; // 12, prototype中定義的o.x,即使再次執(zhí)行delete o.x也不會(huì)被刪除
對(duì)象的預(yù)定義屬性也無法刪除。 可以認(rèn)為這類屬性帶有DontDelete的特性。
復(fù)制代碼 代碼如下:
var re = /abc/i;
delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase無法刪除
能刪除的變量和不能刪除的變量
通過var聲明的變量和通過function聲明的函數(shù)擁有DontDelete特性,無法被刪除。
復(fù)制代碼 代碼如下:
var x = 36;
delete x;
x; // 36, x沒有被刪除
y = 12;
delete y;
y; // undefined
function foo() { return 42; }
delete foo;
foo(); // 42
但是有一點(diǎn)例外,就是通過 eval 執(zhí)行的代碼中,通過var聲明的變量雖然與正常的var聲明變量同屬于Global對(duì)象,但它們不具有DontDelete特性,能被刪除。
復(fù)制代碼 代碼如下:
eval("var x = 36;");
x; // 42
delete x;
x; // undefined
但是這也有一點(diǎn)例外,eval的代碼中的函數(shù)內(nèi)通過var定義的變量具有DontDelete,不能被刪除。
復(fù)制代碼 代碼如下:
eval("(function() { var x = 42; delete x; return x; })();");
// 返回 42
delete的返回值
delete是普通運(yùn)算符,會(huì)返回true或false。規(guī)則為:當(dāng)被delete的對(duì)象的屬性存在并且擁有DontDelete時(shí)返回false,否則返回true。這里的一個(gè)特點(diǎn)就是,對(duì)象屬性不存在時(shí)也返回true,所以返回值并非完全等同于刪除成功與否。
復(fù)制代碼 代碼如下:
function C() { this.x = 42; }
C.prototype.y = 12;
var o = new C();
delete o.x; // true
o.x; // undefined
"x" in o; // false
// o.x存在并且沒有DontDelete,返回true
delete o.y; // true
o.y; // 12
// o自身沒有o.y屬性,所以返回true
// 從這里也可以看到prototype鏈的存在,對(duì)象自身屬性和prototype屬性是不同的
delete o; // false
// Global.o擁有DontDelete特性所以返回false
delete undefinedProperty; // true
// Global沒有名為undefinedProperty的屬性因此返回true
delete 42; // true
// 42不是屬性所以返回true。有的實(shí)現(xiàn)會(huì)拋出異常(違反ECMAScript標(biāo)準(zhǔn))
var x = 24;
delete x++; // true
x; // 25
// 被刪除的是x++的返回值(24),不是屬性,所以返回true
相關(guān)文章
一文了解JavaScript中call/apply/bind的使用
這篇文章主要介紹了一文了解JavaScript中call/apply/bind的使用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07JavaScript算法實(shí)例之求二叉樹從根到葉的所有路徑和
如果你希望求某一特定路徑(例如從根到葉子)上數(shù)字的和,那么問題就轉(zhuǎn)變?yōu)榱恕扒蠖鏄鋸母饺~的所有路徑和”,所以本文給大家介紹了如何使用JavaScript求二叉樹從根到葉的所有路徑和,需要的朋友可以參考下2023-10-10JS實(shí)現(xiàn)帶有抽屜效果的產(chǎn)品類網(wǎng)站多級(jí)導(dǎo)航菜單代碼
這篇文章主要介紹了JS實(shí)現(xiàn)帶有抽屜效果的產(chǎn)品類網(wǎng)站多級(jí)導(dǎo)航菜單代碼,涉及JavaScript動(dòng)態(tài)操作頁面元素屬性的技巧,整體界面效果美觀大方,具有極強(qiáng)的立體感,需要的朋友可以參考下2015-09-09JavaScript實(shí)現(xiàn)的伸展收縮型菜單代碼
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的伸展收縮型菜單代碼,可實(shí)現(xiàn)JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)遍歷及修改頁面元素屬性的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10JavaScript.The.Good.Parts閱讀筆記(二)作用域&閉包&減緩全局空間污染
塊級(jí)作用域: 大多數(shù)使用c語言語法的語言都有塊級(jí)作用域,而JavaScript沒有塊級(jí)作用域。2010-11-11微信小程序非swiper組件實(shí)現(xiàn)的自定義偽3D輪播圖效果示例
這篇文章主要介紹了微信小程序非swiper組件實(shí)現(xiàn)的自定義偽3D輪播圖效果,涉及微信小程序事件響應(yīng)及元素屬性動(dòng)態(tài)操作實(shí)現(xiàn)輪播圖效果相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12javaScript canvas實(shí)現(xiàn)(畫筆大小 顏色 橡皮的實(shí)例)
下面小編就為大家分享一篇javaScript canvas實(shí)現(xiàn)(畫筆大小 顏色 橡皮的實(shí)例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11