![](/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.