2012-08-17 49 views
7

如果我這樣做:Will hasOwnProperty會從for循環中返回false嗎?

for (var i in obj) { 
    if (obj.hasOwnProperty(i)) console.log("Has property: " + i); 
    else console.log("Doesn't have property: " + i); 
} 

obj.hasOwnProperty(i)再回到false?如果是這樣,何時?

+0

只有hasOwnProperty( 「不存在」)將返回false。 – Shreedhar 2012-08-17 16:55:49

+0

當屬性是可枚舉的,但不是「擁有」並繼承。 – 2012-08-17 17:03:50

回答

3

在循環中使用hasOwnProperty的想法是在循環繼承的屬性時解析爲false。這避免了道格拉斯克羅克福德所說的「深挖」。從https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

示例:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

var buz = { 
    fog: 'stack' 
}; 

for (var name in buz) { 
    if (buz.hasOwnProperty(name)) { 
    alert("this is fog (" + name + ") for sure. Value: " + buz[name]); 
    } 
    else { 
    alert(name); // toString or something else 
    } 
} 
+0

你能舉個例子嗎?我不確定JavaScript中繼承的屬性是什麼。 – Juan 2012-08-17 16:56:57

+0

當然,查看https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty – 2012-08-17 16:58:34

+2

另一個例子:http://jsfiddle.net/PNmMq/ – PPvG 2012-08-17 17:01:52

1

示例 - 不顯示時hasOwnProperty可以返回false。

這是一個測試案例,它表明:

// From some library or earlier in your code 
Object.prototype.xxx = "xxx"; 

// Your object 
var data = { member: "member" }; 

for (var key in data) { 
    if(data.hasOwnProperty(key)) { 
     alert(key); // alert("member") 
    } 
    else { 
     alert(key); // alert("xxx") 
    } 
}