用于检查对象中的"构造函数"键的奇怪的javascript行为

fso*_*ety 5 javascript

我实际上不确定我是不是偶然发现了javascript中的不需要的行为,或者这是否是某种预期的行为.

以下代码生成一个真实的语句:

var test= {"test":1}
document.write("constructor" in test);    
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/xyatxm2g/2/

如果我将其更改为以下代码,它将返回false,因为它应该:

var test= {"test":1}
document.write(test.hasOwnProperty("constructor"));
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/fg06ovvc/2/

Buz*_*nas 9

顾名思义,该hasOwnProperty方法调查对象以查看它是否具有属性本身.

但是当你使用时'propertyName' in test,你不仅要查看对象自己的属性,还要查看继承的属性.

在这种情况下,constructor是一个驻留在Object原型中的属性,因此所有对象都具有该属性,因为它们都继承自Object.

来自MDN的报价

来自Object的每个对象都继承hasOwnProperty方法.此方法可用于确定对象是否具有指定的属性作为该对象的直接属性; 与in 运算符不同,此方法不会检查对象的原型链.