用于检查的奇怪javascript行为";建造商;输入对象

用于检查的奇怪javascript行为";建造商;输入对象,javascript,Javascript,实际上,我不确定我是否只是在javascript中偶然发现了一个不需要的行为,或者这是否是有意为之的行为 以下代码将生成一个true语句: var test= {"test":1} document.write("constructor" in test); 如果我将其更改为以下代码,它将返回false,正如它应该返回的那样: var test= {"test":1} document.write(test.hasOwnProperty("constructor")); 如名称所示

实际上,我不确定我是否只是在javascript中偶然发现了一个不需要的行为,或者这是否是有意为之的行为

以下代码将生成一个true语句:

var test= {"test":1}
document.write("constructor" in test);    

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

var test= {"test":1}
document.write(test.hasOwnProperty("constructor"));

如名称所示,查看对象是否具有属性本身

但是,当您在测试中使用“propertyName”时,您不仅要查看对象本身的属性,还要查看来自继承的属性

在这种情况下,是驻留在中的属性,因此所有对象都具有该属性,因为它们都从
对象继承

引自MDN

从对象派生的每个对象都继承hasOwnProperty方法。 此方法可用于确定对象是否具有 指定财产作为该对象的直接财产;与不同的是,此方法不检查对象的原型 链子

从:

继承属性
in运算符为原型链中的属性返回true。
{}中的“toString;”返回真值


hasOwnProperty()
方法仅直接检查对象上的属性,而不是继承的属性(即不在原型链上)。

遵循MDN文档,它不是可枚举字段

您可以执行以下测试:

var obj = {"t": 23};
obj.propertyIsEnumerable("t")
结果:是的

obj.propertyIsEnumerable("constructor")
结果:
false

本文件第节下有一个完整的示例:

直接属性与继承属性


我认为
key in object
操作符在原型链中搜索并返回
object.prototype.constructor
的true可能是正常的行为。参见本讨论-它涉及一个相关主题


因此,如果我想在字典中查找一个键,我应该总是选择使用
hasOwnProperty
方法?@barsch Yes。这就是为什么要迭代一个对象的所有实际键(如果
object.keys(obj)
不可用),您需要为(obj中的var-key){if(obj.hasOwnProperty(key)){doSomethingWithKey(key);}}@barsch执行
,如果您只针对新的浏览器,您也可以使用它。将来,使用标准JavaScript对象作为映射可能会变得不那么流行,因为我们有了一个更专业的选项