我实际上不确定我是不是偶然发现了javascript中的不需要的行为,或者这是否是某种预期的行为。
以下代码会产生一个真实的陈述:
var test= {"test":1}
document.write("constructor" in test);
http://jsfiddle.net/xyatxm2g/2/
如果我将其更改为以下代码,则返回false:
var test= {"test":1}
document.write(test.hasOwnProperty("constructor"));
答案 0 :(得分:9)
hasOwnProperty
method,如名称所示,查看对象以查看它是否具有该属性本身。
但是当你使用'propertyName' in test
时,你不仅要查看对象自己的属性,还要查看继承中的属性。
在这种情况下,constructor
是一个驻留在Object
's prototype内的属性,因此所有对象都具有该属性,因为它们都从Object
继承。
来自MDN的报价
来自Object的每个对象都继承hasOwnProperty方法。 此方法可用于确定对象是否具有 指定属性作为该对象的直接属性;与
in
operator不同,此方法不会检查对象的原型 链
答案 1 :(得分:2)
继承属性
in运算符为原型链中的属性返回true"toString" in {}; // returns true
hasOwnProperty()
方法只检查对象上的属性,而不是继承(即不在原型链上)。
答案 2 :(得分:1)
根据MDN文档,它不是可枚举的字段。
您可以执行以下测试:
var obj = {"t": 23};
obj.propertyIsEnumerable("t")
结果:是真的
obj.propertyIsEnumerable("constructor")
结果:false
本文档的完整示例见以下部分:
直接与继承属性
答案 3 :(得分:1)
我认为这里的key in object
运算符正在搜索原型链并为Object.prototype.constructor
返回true,这可能是正常行为。请参阅此讨论 - 它涉及相关主题。