用于检查的奇怪javascript行为";建造商;输入对象
实际上,我不确定我是否只是在javascript中偶然发现了一个不需要的行为,或者这是否是有意为之的行为 以下代码将生成一个true语句:用于检查的奇怪javascript行为";建造商;输入对象,javascript,Javascript,实际上,我不确定我是否只是在javascript中偶然发现了一个不需要的行为,或者这是否是有意为之的行为 以下代码将生成一个true语句: var test= {"test":1} document.write("constructor" in test); 如果我将其更改为以下代码,它将返回false,正如它应该返回的那样: var test= {"test":1} document.write(test.hasOwnProperty("constructor")); 如名称所示
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对象作为映射可能会变得不那么流行,因为我们有了一个更专业的选项