有很多博客說,只要使用for..in
循環,就應該使用hasOwnProperty
檢查,但我不明白爲什麼會出現這種情況。無論有沒有檢查,我們都會得到相同的結果。hasOwnProperty仍然與for..in語句一起使用
結賬this fiddle。
有很多博客說,只要使用for..in
循環,就應該使用hasOwnProperty
檢查,但我不明白爲什麼會出現這種情況。無論有沒有檢查,我們都會得到相同的結果。hasOwnProperty仍然與for..in語句一起使用
結賬this fiddle。
如果您要創建一個基本對象與{}
,或使用JSON.Parse
得到它從JSON,hasOwnProperty
是全球沒用。
但如果你擴展(使用原型)一個「類」,那麼它可以幫助你知道,如果你訪問你的「自己的屬性」(直接的屬性,包括直接的功能)。
注意一個基本的對象至少有一個(不是直接)屬性,你可以用console.log({});
或console.log({}.toString)
但it's not enumerable and not seen在for... in
環發現:
一種... in循環不會遍歷通過不可枚舉的屬性。 從內置構造函數(如Array和Object)創建的對象具有 從Object.prototype繼承的不可枚舉屬性和 String.prototype不可枚舉,如String的indexOf 方法或Object的toString方法。該循環將遍歷對象的所有 枚舉的屬性,或者它從 構造函數的原型繼承(包括任何其覆蓋操作內置 屬性)。
'hasOwnProperty'不是無用的,必要的時候你沒有完全控制的代碼你的頁面。就像Cristoph的回答中說的,有人修改Object.prototype。即使是一個簡單的對象,如果沒有'hasOwnProperty',你將得到不可預知的結果。 – Radu
我想說,你沒有完全控制的混亂代碼與*用{}創建一個基本對象或者從JSON * –
沒有hasOwnProperty
你不知道該屬性是你的對象的本地屬性還是繼承它的原型。
var obj1 = {a:"10",b:"20"};
Object.prototype.c = "prototype:30";
var i;
for(i in obj1) {
document.getElementById("div1").innerHTML += obj1[i]+" ";
}
// result 10 20 prototype:30
for(i in obj1) {
if(obj1.hasOwnProperty(i)) {
document.getElementById("div2").innerHTML += obj1[i] +" ";
}
}
// result 10 20
在這種情況下obj1
從它繼承的財產c
的原型Object
,你會錯誤地列出它在你的第一個循環。
通常你會得到相同的結果,有或沒有hasOwnProperty
,但後者會忽略繼承的屬性,而不是直接在有問題的對象上生存。
考慮這個基本的繼承系統。狗從主動物類繼承。
function Animal(params) { this.is_animal = true; }
function Dog(params) { for (var i in params) this[i] = params[i]; }
Dog.prototype = new Animal();
var fido = new Dog({name: 'Fido'});
如果我們窺視fido
,hasOwnProperty
幫助我們確定這是自己的屬性(名稱)和繼承。
for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]);
...提醒name=Fido
但不is_animal=true
。
檢查這個搗鼓出http://jsfiddle.net/gFmXM/1/ – goat
@ rambocoder,謝謝,現在我明白了 –