鉴于此对象:
var myObject = {
...
};
这是方法:
var hasProp = Object.keys(myObject).indexOf('myProp') !== -1;
与:
相同var hasProp = myObject.hasOwnProperty('myProp')
也就是说,它们会导致hasProp
的值始终相同吗?
我在接受采访时被问到这个问题,面试官说他们会得到不同的结果,但没有给我一个例子。
谢谢!
答案 0 :(得分:5)
任何不可枚举的属性都会破坏这种对称性。例如,启动Node.js控制台或使用兼容的浏览器控制台执行以下两项操作:
Object.keys([]); // yields []
[].hasOwnProperty('length'); // yields true.
因为对于数组,魔术length
属性被标记为不可枚举。还有另一个功能可以完成所有这些功能,甚至是非枚举功能:
Object.getOwnPropertyNames([]) // yields [ 'length' ]
完全等效。
答案 1 :(得分:3)
Object.keys
“返回给定对象自己的可枚举属性的数组”。无论该属性是否可枚举,hasOwnProperty
都可以正常工作。
请参阅此示例hasOwnProperty
为真但Object.keys
不包含该属性。
var obj = {};
Object.defineProperty(obj, "prop", {value: 1, enumerable: false});
obj.prop; // 1
obj.hasOwnProperty("prop"); // true
Object.keys(obj); // []
Object.keys(obj).indexOf('prop'); // -1
这使用ECMAScript 5 defineProperty
,但基本对象上也存在不可枚举的属性。如@ChrisDrost所示,数组的length
是一个不可枚举的属性,但未在Object.keys
中显示,但对hasOwnProperty
的响应为真。
答案 2 :(得分:-1)
您的代码不会始终返回hasOwnProperty
的相同值。
来自Mozilla's Documentation on hasOwnProperty:
示例:直接属性与继承属性
以下示例区分直接属性和 通过原型链继承的属性:
o = new Object(); o.prop = 'exists'; o.hasOwnProperty('prop'); // returns true o.hasOwnProperty('toString'); // returns false o.hasOwnProperty('hasOwnProperty'); // returns false
这意味着您的方法充当一种hasOwnProperty
,它还会检查继承的属性。
我认为在实践中,它们的行为相同,但这是一个微妙的差异。