下面两个语句产生相同的输出吗?我们有理由选择其中一种方式而不是另一种吗?

 if (key in object)

 if (object.hasOwnProperty(key))

当前回答

你的回答非常棒。 我只是想提供一些东西,将节省你需要检查“hasOwnProperty”,而迭代一个对象。

当创建一个对象时,人们通常会这样创建:

const someMap = {}
// equivalent to: Object.create(Object.prototype)
// someMap.constructor will yield -> function Object() { [native code] }

现在,如果你想通过“someMap”进行迭代,你必须这样做:

const key
for(key in someMap ){
 if (someMap.hasOwnProperty(key)) { 
   // Do something
 }
}

这样做是为了避免迭代继承的属性。

如果你想创建一个简单的对象,它只会被用作“map”(即键值对),你可以这样做:

const newMap = Object.create(null);
// Now, newMap won't have prototype at all.
// newMap.constructor will yield -> undefined

所以现在可以安全地这样迭代了:

for(key in cleanMap){
 console.log(key + " -> " + newMap [key]);
 // No need to add extra checks, as the object will always be clean
}

我在这里学到了这个很棒的技巧

其他回答

in也会检查继承的属性,而hasOwnProperty则不是这样。

你的回答非常棒。 我只是想提供一些东西,将节省你需要检查“hasOwnProperty”,而迭代一个对象。

当创建一个对象时,人们通常会这样创建:

const someMap = {}
// equivalent to: Object.create(Object.prototype)
// someMap.constructor will yield -> function Object() { [native code] }

现在,如果你想通过“someMap”进行迭代,你必须这样做:

const key
for(key in someMap ){
 if (someMap.hasOwnProperty(key)) { 
   // Do something
 }
}

这样做是为了避免迭代继承的属性。

如果你想创建一个简单的对象,它只会被用作“map”(即键值对),你可以这样做:

const newMap = Object.create(null);
// Now, newMap won't have prototype at all.
// newMap.constructor will yield -> undefined

所以现在可以安全地这样迭代了:

for(key in cleanMap){
 console.log(key + " -> " + newMap [key]);
 // No need to add extra checks, as the object will always be clean
}

我在这里学到了这个很棒的技巧

第一个版本更短(特别是在变量重命名的最小化代码中)

a in b

vs

b.hasOwnProperty(a)

不管怎样,正如@AndreMeinhold所说,它们并不总是产生相同的结果。

小心——它们不会产生相同的结果。

如果在原型链的某个地方找到key, in也会返回true,而Object。hasOwnProperty(就像名字已经告诉我们的那样),只会在key在该对象上直接可用时返回true(它的“拥有”属性)。

另一种只有自己属性的方法是:

<script type="text/javascript">"use strict";
  const obj = Object.create({cle:"valeur"});
  obj.a = "aaa";
  obj.b = "bbb";
  obj.c = "ccc";

  for(let key=0 ; key < Object.keys(obj).length ; key++){
     if(Object.keys(obj)[key]==="cle")
     console.log(key , Object.keys(obj)[key] , Object.values(obj)[key]);
     // none

     if(Object.keys(obj)[key]==="b")
     console.log(key , Object.keys(obj)[key] , Object.values(obj)[key]);
     // 1   'b'   'bbb'

     console.log(key , Object.keys(obj)[key] , Object.values(obj)[key]);
     // 0   'a'   'aaa'
     // 1   'b'   'bbb'
     // 2   'c'   'ccc'
  }

  console.log(Object.getOwnPropertyDescriptor(obj,"cle"));
  // undefined

  console.log(Object.getOwnPropertyDescriptor(obj,"c"));
  // {value:'ccc', writable:true, enumerable:true, configurable:true}
</script>