Answers:
如果要测试对象本身(而不是其原型链的一部分)上的属性,则可以使用.hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
您也可以使用in
运算符测试继承的属性。
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
。
如果您想知道对象是否实际包含属性@gnarf的答案,则hasOwnProperty
可以完成工作。
如果您想知道该属性是否存在于对象本身或原型链中的任何位置,则可以使用in
operator。
if ('prop' in obj) {
// ...
}
例如。:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.js或Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
。对于数组我想你可能想Array.prototype.indexOf
,_.indexOf
或者_.contains
我原始代码的一个功能
if ( typeof(x.y) != 'undefined' ) ...
在某些情况下可能有用的是使用是否x
存在是安全的。使用gnarf答案中的任何一种方法,都应该首先测试x
是否存在疑问。
因此,也许所有这三种方法都可以胜任。
(x && x.hasOwnProperty('y'))
或(x && 'y' in x)
ReferenceError
而不是字符串“ undefined”
由于问题是关于属性检查的笨拙性,并且一个常规用例是对函数参数选项对象的验证,因此我想提到一种无库测试多种属性存在的简短方法。免责声明:它确实需要ECMAScript 5(但IMO仍在使用IE8的任何人都应该被损坏的网络)。
function f(opts) {
if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
throw new Error("IllegalArgumentException");
}
alert("ok");
}
f({req1: 123}); // error
f({req1: 123, req2: 456}); // ok
为什么不简单地:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
或者,如果您期望使用特定类型:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
以便名为“ hasOwnProperty”的属性不会与检查过程冲突;)