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

 if (key in object)

 if (object.hasOwnProperty(key))

当前回答

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

a in b

vs

b.hasOwnProperty(a)

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

其他回答

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

a in b

vs

b.hasOwnProperty(a)

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

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

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

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

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

总之,hasOwnProperty()不查看原型,而In查看原型。

摘自O'Reilly高性能Javascript:

属性可以确定对象是否具有实例成员 使用hasOwnProperty()方法,并传入 成员名。来确定对象是否具有对对象的访问权 属性,则可以使用in操作符。例如:

var book = {
    title: "High Performance JavaScript",
    publisher: "Yahoo! Press" 
};

alert(book.hasOwnProperty("title"));  //true
alert(book.hasOwnProperty("toString"));  //false
alert("title" in book); //true 
alert("toString" in book); //true

在这段代码中,hasOwnProperty()在传入“title”时返回true 因为title是一个对象实例;时,该方法返回false 传入" toString "是因为它在实例中不存在。当 每个属性名与in操作符一起使用,结果为真 两次都是因为它搜索实例和原型。

我会用另一个例子来解释。 假设我们有以下两个属性的对象:

function TestObj(){
    this.name = 'Dragon';
}
TestObj.prototype.gender = 'male';

让我们创建TestObj实例:

var o = new TestObj();

让我们检查一下对象实例:

console.log(o.hasOwnProperty('name')); // true
console.log('name' in o); // true

console.log(o.hasOwnProperty('gender')); // false
console.log('gender' in o); // true

结论:

如果属性可被对象直接访问或从原型访问,则In运算符总是返回true hasOwnProperty()只在实例上存在属性,而在其原型上不存在时才返回true

如果我们想要检查原型上是否存在某些属性,逻辑上,我们会说:

console.log(('name' in o) && !o.hasOwnProperty('name')); //false
console.log(('gender' in o) && !o.hasOwnProperty('gender')); //true - it's in prototype

最后:

所以,关于这两个条件…

if (key in object)
if (object.hasOwnProperty(key))

...产生同样的结果,答案是显而易见的,视情况而定。