Javascript中的for in迴圈和hasOwnProperty結合使用

來源:互聯網
上載者:User

與in操作符相比,for in 在迴圈對象的屬性時也會遍曆原型鏈,for in 不會讀取不可枚舉屬性,如數組的length屬性。 小結 當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 迴圈時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴充本地原型而引起的錯誤。

與in操作符相比,for in 在迴圈對象的屬性時也會遍曆原型鏈,for in 不會讀取不可枚舉屬性,如數組的length屬性。

複製代碼 代碼如下:// 擴充 Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) {
console.log(i); // 輸出 bar 和 moo
}

我們不可能改變 for in 迴圈的行為,當需要對迴圈體內某些屬性進行過濾時,可以利用Object.prototype的hasOwnProperty方法來完成。

提示:因為 for in 迴圈總是遍曆整個原型鏈,所以當遍曆多繼承的對象時效率較低。

使用 hasOwnProperty 進行過濾

複製代碼 代碼如下:// 仍舊針對上例的foo對象
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}

例子中因為使用了hasOwnProperty,最終輸出moo;如果忽略 hasOwnProperty ,代碼將會輸出非預期結果,因為本地原型(如Object.prototype)已經被擴充了。

Prototype架構就是擴充Javascript原始對象的一個類庫,並被廣泛使用,其缺點也很明顯,當架構引入後,如果不使用 hasOwnProperty 進行過濾判斷,輸出結果保證不是你想要的。

最佳實務

推薦在 for in 時,總是使用 hasOwnProperty 進行判斷,沒人可以保證啟動並執行代碼環境是否被汙染過。

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 來調用它
{}.hasOwnProperty.call(foo, 'bar'); // true

小結
當檢測某個對象是否擁有某個屬性時,hasOwnProperty 是唯一可以完成這一任務的方法,在 for in 迴圈時,建議增加 hasOwnProperty 進行判斷,可以有效避免擴充本地原型而引起的錯誤。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.