簡體   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