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

 if (key in object)

 if (object.hasOwnProperty(key))

当前回答

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

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

其他回答

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

如果在原型链的某个地方找到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操作符一起使用,结果为真 两次都是因为它搜索实例和原型。

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

a in b

vs

b.hasOwnProperty(a)

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

另一种形式(在中调用)枚举属性名(或键) 物体的。控件中的另一个属性名字符串 对象被赋值给变量。通常有必要进行测试 object.hasOwnProperty(变量)来确定属性名是否 是对象的真正成员,或者在原型链上找到。

 for (myvar in obj) {
     if (obj.hasOwnProperty(myvar)) { ... } }

(摘自Crockford的Javascript: The Good Parts)

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