Javascript中的for in循環(huán)和hasOwnProperty結合使用
更新時間:2013年06月05日 12:37:37 作者:
當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 循環(huán)時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴展本地原型而引起的錯誤
與in操作符相比,for in 在循環(huán)對象的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,如數(shù)組的length屬性。 小結 當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 循環(huán)時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴展本地原型而引起的錯誤。
與in操作符相比,for in 在循環(huán)對象的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,如數(shù)組的length屬性。
// 擴展 Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // 輸出 bar 和 moo
}
我們不可能改變 for in 循環(huán)的行為,當需要對循環(huán)體內(nèi)某些屬性進行過濾時,可以利用Object.prototype的hasOwnProperty方法來完成。
提示:因為 for in 循環(huán)總是遍歷整個原型鏈,所以當遍歷多繼承的對象時效率較低。
使用 hasOwnProperty 進行過濾
// 仍舊針對上例的foo對象
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}
例子中因為使用了hasOwnProperty,最終輸出moo;如果忽略 hasOwnProperty ,代碼將會輸出非預期結果,因為本地原型(如Object.prototype)已經(jīng)被擴展了。
Prototype框架就是擴展Javascript原始對象的一個類庫,并被廣泛使用,其缺點也很明顯,當框架引入后,如果不使用 hasOwnProperty 進行過濾判斷,輸出結果保證不是你想要的。
最佳實踐
推薦在 for in 時,總是使用 hasOwnProperty 進行判斷,沒人可以保證運行的代碼環(huán)境是否被污染過。
hasOwnProperty
為了檢查某個對象是否擁有不在原型鏈上的自定義屬性,就有必要用到 hasOwnProperty 方法,任何一個對象都具有該方法,它繼承自 Object.prototype。
提示:我們無法完全檢測某個屬性是否是undefined,因為屬性有可能存在,但其值為undefined。hasOwnProperty 是Javascript中唯一一個可以處理對象屬性而不遍歷原型鏈的方法。
// 擴展 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 給出了正確的預期結果,當遍歷對象的屬性時這是很有必要的,沒有其它辦法來排除定義在對象原型鏈上的屬性。
hasOwnProperty 作為屬性
Javascript 并沒有保護 hasOwnProperty 為關鍵字或保留字,因此,如果某個對象擁有同名的屬性,就有必要利用擴展的 hasOwnProperty 來獲取正確結果。
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是返回 false
// 使用另一個 hasOwnProperty 并將 this 設置為 foo 來調(diào)用它
{}.hasOwnProperty.call(foo, 'bar'); // true
小結
當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 循環(huán)時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴展本地原型而引起的錯誤。
與in操作符相比,for in 在循環(huán)對象的屬性時也會遍歷原型鏈,for in 不會讀取不可枚舉屬性,如數(shù)組的length屬性。
復制代碼 代碼如下:
// 擴展 Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // 輸出 bar 和 moo
}
我們不可能改變 for in 循環(huán)的行為,當需要對循環(huán)體內(nèi)某些屬性進行過濾時,可以利用Object.prototype的hasOwnProperty方法來完成。
提示:因為 for in 循環(huán)總是遍歷整個原型鏈,所以當遍歷多繼承的對象時效率較低。
使用 hasOwnProperty 進行過濾
復制代碼 代碼如下:
// 仍舊針對上例的foo對象
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}
例子中因為使用了hasOwnProperty,最終輸出moo;如果忽略 hasOwnProperty ,代碼將會輸出非預期結果,因為本地原型(如Object.prototype)已經(jīng)被擴展了。
Prototype框架就是擴展Javascript原始對象的一個類庫,并被廣泛使用,其缺點也很明顯,當框架引入后,如果不使用 hasOwnProperty 進行過濾判斷,輸出結果保證不是你想要的。
最佳實踐
推薦在 for in 時,總是使用 hasOwnProperty 進行判斷,沒人可以保證運行的代碼環(huán)境是否被污染過。
hasOwnProperty
為了檢查某個對象是否擁有不在原型鏈上的自定義屬性,就有必要用到 hasOwnProperty 方法,任何一個對象都具有該方法,它繼承自 Object.prototype。
提示:我們無法完全檢測某個屬性是否是undefined,因為屬性有可能存在,但其值為undefined。hasOwnProperty 是Javascript中唯一一個可以處理對象屬性而不遍歷原型鏈的方法。
復制代碼 代碼如下:
// 擴展 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 給出了正確的預期結果,當遍歷對象的屬性時這是很有必要的,沒有其它辦法來排除定義在對象原型鏈上的屬性。
hasOwnProperty 作為屬性
Javascript 并沒有保護 hasOwnProperty 為關鍵字或保留字,因此,如果某個對象擁有同名的屬性,就有必要利用擴展的 hasOwnProperty 來獲取正確結果。
復制代碼 代碼如下:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 總是返回 false
// 使用另一個 hasOwnProperty 并將 this 設置為 foo 來調(diào)用它
{}.hasOwnProperty.call(foo, 'bar'); // true
小結
當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 循環(huán)時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴展本地原型而引起的錯誤。
您可能感興趣的文章:
- js中hasOwnProperty()方法詳解
- js中hasOwnProperty的屬性及實例用法詳解
- JavaScript中in和hasOwnProperty區(qū)別詳解
- JavaScript hasOwnProperty() 函數(shù)實例詳解
- JS中的hasOwnProperty()和isPrototypeOf()屬性實例詳解
- javascript中hasOwnProperty() 方法使用指南
- Javascript學習筆記之 對象篇(三) : hasOwnProperty
- js中的hasOwnProperty和isPrototypeOf方法使用實例
- js的hasownproperty使用示例
- 理解JAVASCRIPT中hasOwnProperty()的作用
- JS中hasOwnProperty方法用法簡介
相關文章
JavaScript 對引擎、運行時、調(diào)用堆棧的概述理解
這篇文章旨在深入挖掘JavaScript,以及向大家解釋JavaScript是如何工作的。非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10為JavaScript類型增加方法的實現(xiàn)代碼(增加功能)
大家在js開發(fā)過程中有些功能已經(jīng)滿足不了我們的需求,或沒有我們需要的功能,那么我們就可以自己擴展下,個性化js2011-12-12javascript function調(diào)用時的參數(shù)檢測常用辦法
js中并不直接支持類似c#的方法重載,所以只能變相的來解決,示意代碼:(利用了內(nèi)置屬性arguments)2010-02-02js中數(shù)組(Array)的排序(sort)注意事項說明
本篇文章主要是對js中數(shù)組(Array)的排序(sort)注意事項進行了說明介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01javascript檢查表單數(shù)據(jù)是否改變的方法
需要檢查用戶是否修改了一個表單中的內(nèi)容,可以使用本文提供的方法,如果修改了表單的內(nèi)容則返回true,沒修改則返回false,有需求的朋友可以參考下2013-07-07