确定对象在JavaScript中是否具有属性的两种方法

时间:2014-09-22 19:26:49

标签: javascript

鉴于此对象:

var myObject = {
    ...
};

这是方法:

var hasProp = Object.keys(myObject).indexOf('myProp') !== -1;

与:

相同
var hasProp = myObject.hasOwnProperty('myProp')

也就是说,它们会导致hasProp的值始终相同吗?

我在接受采访时被问到这个问题,面试官说他们会得到不同的结果,但没有给我一个例子。

谢谢!

3 个答案:

答案 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,它还会检查继承的属性。

我认为在实践中,它们的行为相同,但这是一个微妙的差异。