如何确定对象x
是否具有已定义的属性y
,而不管x.y
的值是什么?
我正在使用
if (typeof(x.y) !== 'undefined')
但这看起来有点笨重。还有更好的方法吗?
答案 0 :(得分:504)
如果您正在测试对象本身的属性(不是其原型链的一部分),您可以使用.hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
您可以使用in
运算符来测试继承的属性。
if ('y' in x) {
// ......
}
答案 1 :(得分:69)
如果您想知道对象物理是否包含属性@gnarf's,请使用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
答案 2 :(得分:13)
Underscore.js或Lodash
if (_.has(x, "y")) ...
:)
答案 3 :(得分:12)
你可以这样修剪一下:
if ( x.y !== undefined ) ...
答案 4 :(得分:5)
我原始代码的一个功能
if ( typeof(x.y) != 'undefined' ) ...
在某些情况下可能有用的是使用x
是否存在是安全的。使用gnarf的答案中的任何一种方法,如果存在任何疑问,应首先测试x
。
所以也许所有这三种方法都有其中一个技巧。
答案 5 :(得分:2)
包括
Object.keys(x).includes('y');
Array.prototype.includes()
方法确定数组是否在其条目中包含某个值,并根据需要返回 true 或 false。
和
Object.keys()
返回一个字符串数组,表示给定对象的所有可枚举属性。
.hasOwnProperty()
和 ES6+ .?
-optional-chaining like: if (x?.y)
也是非常好的 2020+ 选项。
答案 6 :(得分:1)
由于问题是关于属性检查的笨拙,以及一个用于验证函数参数选项对象的常规用例,我想我会提到一种无库的测试存在多个属性的简短方法。 免责声明:它确实需要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
答案 7 :(得分:0)
ES6 +上有一项新功能,您可以通过以下方式对其进行检查:
if (x?.y)
实际上,解释器会检查x
的存在,然后调用y
,由于在if
括号中加上了强制,因此x?.y
转换为布尔值。 / p>
答案 8 :(得分:0)
const data = [{"b":1,"c":100},{"a":1,"b":1,"c":150},{"a":1,"b":2,"c":100},{"a":2,"b":1,"c":13}]
const result = data.reduce((r, e) => {
r['a'] += (e['a'] ? e['a'] : 0)
r['d'] += (e['b'] ? e['b'] : 0)
r['c'] += (e['c'] ? e['c'] : 0)
return r
}, {'a':0, 'd':0, 'c':0})
console.log(result)
`result` { a: 4, d: 5, c: 363 }
答案 9 :(得分:-1)
为什么不简单:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
或者如果您期望特定类型:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
答案 10 :(得分:-4)
我想知道名为foo的对象是否具有我简单使用的名为bar的属性
if(foo.bar){
//do stuff
}
如果该属性不存在,则Javascript返回false。在某些情况下,这是不正确的。例如,如果bar期望是布尔值或可以等于零的数字。Everything without a value is false.
否则,我认为它是最优雅的解决方案。