繁体   English   中英

在检查属性是否作为对象文字的一部分存在时,HasOwnProperty有什么优势?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM