欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript中的for in循環(huán)和hasOwnProperty結(jié)合使用

 更新時(shí)間:2013年06月05日 12:37:37   作者:  
當(dāng)檢測(cè)某個(gè)對(duì)象是否擁有某個(gè)屬性時(shí),hasOwnProperty 是唯一可以完成這一任務(wù)的方法,在 for in 循環(huán)時(shí),建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯(cuò)誤
與in操作符相比,for in 在循環(huán)對(duì)象的屬性時(shí)也會(huì)遍歷原型鏈,for in 不會(huì)讀取不可枚舉屬性,如數(shù)組的length屬性。 小結(jié) 當(dāng)檢測(cè)某個(gè)對(duì)象是否擁有某個(gè)屬性時(shí),hasOwnProperty 是唯一可以完成這一任務(wù)的方法,在 for in 循環(huán)時(shí),建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯(cuò)誤。

與in操作符相比,for in 在循環(huán)對(duì)象的屬性時(shí)也會(huì)遍歷原型鏈,for in 不會(huì)讀取不可枚舉屬性,如數(shù)組的length屬性。

復(fù)制代碼 代碼如下:

// 擴(kuò)展 Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // 輸出 bar 和 moo
}


我們不可能改變 for in 循環(huán)的行為,當(dāng)需要對(duì)循環(huán)體內(nèi)某些屬性進(jìn)行過(guò)濾時(shí),可以利用Object.prototype的hasOwnProperty方法來(lái)完成。

提示:因?yàn)?for in 循環(huán)總是遍歷整個(gè)原型鏈,所以當(dāng)遍歷多繼承的對(duì)象時(shí)效率較低。

使用 hasOwnProperty 進(jìn)行過(guò)濾

復(fù)制代碼 代碼如下:

// 仍舊針對(duì)上例的foo對(duì)象
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}


例子中因?yàn)槭褂昧薶asOwnProperty,最終輸出moo;如果忽略 hasOwnProperty ,代碼將會(huì)輸出非預(yù)期結(jié)果,因?yàn)楸镜卦停ㄈ鏞bject.prototype)已經(jīng)被擴(kuò)展了。

Prototype框架就是擴(kuò)展Javascript原始對(duì)象的一個(gè)類庫(kù),并被廣泛使用,其缺點(diǎn)也很明顯,當(dāng)框架引入后,如果不使用 hasOwnProperty 進(jìn)行過(guò)濾判斷,輸出結(jié)果保證不是你想要的。

最佳實(shí)踐

推薦在 for in 時(shí),總是使用 hasOwnProperty 進(jìn)行判斷,沒(méi)人可以保證運(yùn)行的代碼環(huán)境是否被污染過(guò)。

hasOwnProperty
為了檢查某個(gè)對(duì)象是否擁有不在原型鏈上的自定義屬性,就有必要用到 hasOwnProperty 方法,任何一個(gè)對(duì)象都具有該方法,它繼承自 Object.prototype。

提示:我們無(wú)法完全檢測(cè)某個(gè)屬性是否是undefined,因?yàn)閷傩杂锌赡艽嬖?,但其值為undefined。hasOwnProperty 是Javascript中唯一一個(gè)可以處理對(duì)象屬性而不遍歷原型鏈的方法。

復(fù)制代碼 代碼如下:

// 擴(kuò)展 Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};

foo.bar; // 1
'bar' in foo; // true

foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true


只有 hasOwnProperty 給出了正確的預(yù)期結(jié)果,當(dāng)遍歷對(duì)象的屬性時(shí)這是很有必要的,沒(méi)有其它辦法來(lái)排除定義在對(duì)象原型鏈上的屬性。

hasOwnProperty 作為屬性

Javascript 并沒(méi)有保護(hù) hasOwnProperty 為關(guān)鍵字或保留字,因此,如果某個(gè)對(duì)象擁有同名的屬性,就有必要利用擴(kuò)展的 hasOwnProperty 來(lái)獲取正確結(jié)果。

復(fù)制代碼 代碼如下:

var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是返回 false
// 使用另一個(gè) hasOwnProperty 并將 this 設(shè)置為 foo 來(lái)調(diào)用它
{}.hasOwnProperty.call(foo, 'bar'); // true


小結(jié)
當(dāng)檢測(cè)某個(gè)對(duì)象是否擁有某個(gè)屬性時(shí),hasOwnProperty 是唯一可以完成這一任務(wù)的方法,在 for in 循環(huán)時(shí),建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯(cuò)誤。

相關(guān)文章

最新評(píng)論