Javascript學(xué)習(xí)筆記 delete運(yùn)算符
更新時(shí)間:2011年09月13日 22:21:00 作者:
關(guān)于javascript的delete運(yùn)算符,MDN里有相關(guān)文檔。以下是我的學(xué)習(xí)筆記,更多是要關(guān)注特殊情況的使用和注意點(diǎn)。
一、語(yǔ)法
delete后面的表達(dá)式必須給出一個(gè)屬性的引用,比如
var o = {a:1};
delete o.a; //此處o.a是對(duì)象o的屬性a的引用
只有在with語(yǔ)句里才能使用單獨(dú)的屬性名
with(o){
delete a;
}
二、delete的返回值
delete是普通運(yùn)算符,會(huì)返回true或false。規(guī)則為:當(dāng)被delete的對(duì)象的屬性存在并且不能被刪除時(shí) 返回false,否則返回true。 這里的一個(gè)特點(diǎn)就是,對(duì)象屬性不存在時(shí)也返回true,所以返回值并非完全等同于刪除成功與否。
var o = {a:1};
delete o.a; //返回true
var b = 2;
delete b;//返回false,ECMA規(guī)則約定:使用var和function聲明的變量不可以被delete
三、哪些情況下不允許delete
上例提到的var和function聲明的變量不可以被delete,但隱式聲明可以被刪除
function c(){return 12;}
delete c;//返回false
d = function(){return 12;}
delete d;//返回true
不能delete從原型鏈上繼承的屬性,但可以刪除原型鏈上的屬性
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
delete foo.bar; // 返回true,但并沒(méi)有起作用
alert(foo.bar); // alerts 42, 屬性是繼承的
delete Foo.prototype.bar; // 在原型上刪除屬性bar
alert(foo.bar); // alerts "undefined", 屬性已經(jīng)不存在,無(wú)法被繼承
四、特例
eval執(zhí)行的代碼中如有通過(guò)var和function聲明的變量,可以被delete
eval("var a=1");
delete a;
alert(a); //報(bào)未定義錯(cuò)誤
如果聲明是在eval執(zhí)行代碼中的閉包內(nèi)進(jìn)行的,則變量不能被delete
eval("(function(){var a=1;delete a; return a;})()");//1
五、delete 數(shù)組元素
從數(shù)組中delete其元素并不會(huì)影響數(shù)組的長(zhǎng)度
var arr = ['yuyin','suhuan','baby'];
delete arr[0];
alert(arr.length);//alert 3
被delete的鍵值已經(jīng)不屬于數(shù)組,但卻還是可以被訪問(wèn),其值為undefined。
var arr = ['yuyin','suhuan','baby'];
delete arr[0];
0 in arr; // false
alert(arr[0]);//undefined
arr[0] === undefined;//true
對(duì)比直接將鍵值賦值undefined
var arr = ['yuyin','suhuan','baby'];
arr[0] = undefined;
0 in arr; // true
alert(arr[0]);//undefined
arr[0] === undefined;//true
可以看出delete 操作只是將鍵值這個(gè)屬性從數(shù)組中刪除了,數(shù)組本身也是對(duì)象,這個(gè)情況好理解的。如果需要保留鍵值,可以用undefined賦值。
delete后面的表達(dá)式必須給出一個(gè)屬性的引用,比如
var o = {a:1};
delete o.a; //此處o.a是對(duì)象o的屬性a的引用
只有在with語(yǔ)句里才能使用單獨(dú)的屬性名
復(fù)制代碼 代碼如下:
with(o){
delete a;
}
二、delete的返回值
delete是普通運(yùn)算符,會(huì)返回true或false。規(guī)則為:當(dāng)被delete的對(duì)象的屬性存在并且不能被刪除時(shí) 返回false,否則返回true。 這里的一個(gè)特點(diǎn)就是,對(duì)象屬性不存在時(shí)也返回true,所以返回值并非完全等同于刪除成功與否。
復(fù)制代碼 代碼如下:
var o = {a:1};
delete o.a; //返回true
var b = 2;
delete b;//返回false,ECMA規(guī)則約定:使用var和function聲明的變量不可以被delete
三、哪些情況下不允許delete
上例提到的var和function聲明的變量不可以被delete,但隱式聲明可以被刪除
復(fù)制代碼 代碼如下:
function c(){return 12;}
delete c;//返回false
d = function(){return 12;}
delete d;//返回true
不能delete從原型鏈上繼承的屬性,但可以刪除原型鏈上的屬性
復(fù)制代碼 代碼如下:
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
delete foo.bar; // 返回true,但并沒(méi)有起作用
alert(foo.bar); // alerts 42, 屬性是繼承的
delete Foo.prototype.bar; // 在原型上刪除屬性bar
alert(foo.bar); // alerts "undefined", 屬性已經(jīng)不存在,無(wú)法被繼承
四、特例
復(fù)制代碼 代碼如下:
eval執(zhí)行的代碼中如有通過(guò)var和function聲明的變量,可以被delete
eval("var a=1");
delete a;
alert(a); //報(bào)未定義錯(cuò)誤
如果聲明是在eval執(zhí)行代碼中的閉包內(nèi)進(jìn)行的,則變量不能被delete
eval("(function(){var a=1;delete a; return a;})()");//1
五、delete 數(shù)組元素
從數(shù)組中delete其元素并不會(huì)影響數(shù)組的長(zhǎng)度
復(fù)制代碼 代碼如下:
var arr = ['yuyin','suhuan','baby'];
delete arr[0];
alert(arr.length);//alert 3
被delete的鍵值已經(jīng)不屬于數(shù)組,但卻還是可以被訪問(wèn),其值為undefined。
復(fù)制代碼 代碼如下:
var arr = ['yuyin','suhuan','baby'];
delete arr[0];
0 in arr; // false
alert(arr[0]);//undefined
arr[0] === undefined;//true
對(duì)比直接將鍵值賦值undefined
復(fù)制代碼 代碼如下:
var arr = ['yuyin','suhuan','baby'];
arr[0] = undefined;
0 in arr; // true
alert(arr[0]);//undefined
arr[0] === undefined;//true
可以看出delete 操作只是將鍵值這個(gè)屬性從數(shù)組中刪除了,數(shù)組本身也是對(duì)象,這個(gè)情況好理解的。如果需要保留鍵值,可以用undefined賦值。
相關(guān)文章
用javascript實(shí)現(xiàn)自定義標(biāo)簽
用javascript實(shí)現(xiàn)自定義標(biāo)簽...2007-05-05淺談async、defer以普通script加載的區(qū)別
本文主要介紹了淺談async、defer以普通script加載的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05JavaScript基于querySelector?/?querySelectorAll對(duì)元素的操作(DOM?AP
這篇文章主要介紹了JavaScript基于querySelector?/?querySelectorAll對(duì)元素的操作(DOM?API掃盲),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12JavaScript中數(shù)組常見(jiàn)操作技巧
下面介紹JavaScript中的數(shù)組對(duì)象遍歷、讀寫、排序等操作以及與數(shù)組相關(guān)的字符串處理操作,需要的的朋友參考下吧2017-09-09僅IE支持clearAttributes/mergeAttributes方法使用介紹
僅IE中HTMLElement元素具有clearAttributes/mergeAttributes方法,它們都是非標(biāo)準(zhǔn)的2012-05-05多個(gè)js與css文件的合并方法詳細(xì)說(shuō)明
在Web項(xiàng)目的開(kāi)發(fā)中,js,css文件會(huì)隨著項(xiàng)目的開(kāi)發(fā)變得越來(lái)越多,越來(lái)越大,這就給給性能方面帶來(lái)一些問(wèn)題;解決該問(wèn)題的一個(gè)好的方法就是合并js,css文件需要了解的朋友可以參考下2012-12-12