![](/img/trans.png)
[英]Node.js hasOwnProperty does not work even when the property exists
[英]What Advantage Does HasOwnProperty Offer When Checking if a Property Exists As Part of An Object Literal?
我引用的代碼來自以下答案:
Array.prototype.getUnique = function(){
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i){
if(u.hasOwnProperty(this[i])) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
hasOwnProperty
在這里的目的是什么? 我已經運行了一個不使用該方法的版本,它的工作原理相同:
Array.prototype.getUnique = function(){
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i){
if(u[this[i]] !== undefined) {
continue;
}
a.push(this[i]);
u[this[i]] = 1;
}
return a;
}
.hasOwnProperty()
測試允許代碼排除從原型鏈繼承的屬性。
在您的示例代碼中,如果數組包含字符串“ toString”,那么您經過修改的代碼將被認為已經看到了該值-所有對象都從Object原型繼承了“ toString”函數。
如果對象具有屬性,並且該屬性具有undefined
的值或具有該屬性的祖先對象,該怎么辦?
那是主要的區別。
例如:
var a = {b:undefined};
a.b !== undefined; //false
a.hasOwnProperty("b");//true
沒有東西,而自己擁有未定義值的東西是兩件不同的事情。
hasOwnProperty(name)
檢查對象是否具有直接在其上聲明的名為“ name”的屬性。
obj.propertyName === undefined
-檢查原型鏈中某處(在對象中,還是在其原型中,等等),對象是否具有名稱為'propertyName'的屬性,並且其值未定義, 或者它的鏈沒有這樣的屬性。
以下示例說明了兩者之間的區別:
var a={b:undefined};
a.hasOwnProperty(b);//true
a.b!==undefined;//false
//Create a new object, with b being the prototype
var c = Object.create(b);
c.hasOwnProperty("b");//false
c.b;//undefined;
b in c;// true
c.b!==undefined;//false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.