如何确定对象在JavaScript中是否具有给定属性

如何确定对象在JavaScript中是否具有给定属性,javascript,object,Javascript,Object,如何确定对象x是否具有已定义的属性y,而不考虑x.y的值 我目前正在使用 if (typeof(x.y) !== 'undefined') 但这似乎有点笨重。有更好的方法吗?对象具有以下属性: 如果要测试对象本身(不是其原型链的一部分)上的属性,可以使用: 对象或其原型具有以下属性: 您也可以使用运算符测试继承的属性 if ('y' in x) { // ...... } 你可以把它修剪成这样: if ( x.y !== undefined ) ... 如果您想知道对象是否实际包含属性

如何确定对象
x
是否具有已定义的属性
y
,而不考虑
x.y
的值

我目前正在使用

if (typeof(x.y) !== 'undefined')
但这似乎有点笨重。有更好的方法吗?

对象具有以下属性: 如果要测试对象本身(不是其原型链的一部分)上的属性,可以使用:

对象或其原型具有以下属性: 您也可以使用运算符测试继承的属性

if ('y' in x) {
  // ......
}

你可以把它修剪成这样:

if ( x.y !== undefined ) ...

如果您想知道对象是否实际包含属性,那么使用
hasOwnProperty
将完成这项工作

如果您想知道该属性是否存在于任何位置,无论是在对象本身上还是在原型链中,您可以使用

例如:


我的原始代码的一个特性

if ( typeof(x.y) != 'undefined' ) ...
在某些情况下,无论
x
是否存在,使用它都是安全的,这可能是有用的。对于gnarf答案中的任何一种方法,如果存在任何疑问,应首先测试
x


因此,也许这三种方法在你的技巧袋中都有一席之地。

underline.js或Lodash

if (_.has(x, "y")) ...

:)

既然问题是关于属性检查的笨拙性,而其中一个常见的用例是验证函数参数选项对象,我想我应该提到一种测试多个属性存在性的无库短方法。 免责声明:它确实需要ECMAScript 5(但在我看来,任何仍在使用IE8的人都应该得到一个坏网站)

为什么不简单地:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
或者,如果您希望使用特定类型:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
ES6+: ES6+上有一项新功能,您可以按如下方式进行检查:

if(x?.y)

实际上,解释器检查是否存在
x
,然后调用
y
,因为在
if
括号中放入了
,强制发生并将
x?.y
转换为布尔值。

包括

Object.keys(x).includes('y');
Array.prototype.includes()
方法确定数组的条目中是否包含某个值,并根据需要返回true或false

Object.keys()
返回表示给定对象的所有可枚举属性的字符串数组


.hasOwnProperty()
和ES6+
可选链接,如:
如果(x?.y)
也是非常好的2020+选项。

如果
x={y:undefined}
会失败,有人需要区分“未定义”和“定义为未定义”吗?@darkport我有时会这样做;)@Firestore在保存文档数据时使用jpsimons for and instance“defined to undefined”(定义为未定义),或者更好地使用--
Object.prototype.hasOwnProperty.call(x,'y')
,这样名为“hasOwnProperty”的属性就不会与检查过程冲突;)或者更简短的-
{}.hasOwnProperty.call(x,'y')
。您可以始终使用
(x&&x.hasOwnProperty('y'))
(x中的x&&y)
我同意,x的测试应该是一个单独的案例。也会产生更好的错误报告。这对我来说失败了。如果x未定义,则typeof(x.y)返回一个
ReferenceError
,而不是字符串“undefined”Nope。它只是
Object.prototype.hasOwnProperty.call(x,“y”)
的别名。对于数组,我认为您可能需要
Array.prototype.indexOf
.indexOf
.contains
,因为它不好读,而且输入不严格。我必须问你:为什么不简单地
x.hasOwnProperty('y')
?如果
x.y
存在并且它是一个虚假的值呢?不要用
()
而不是函数“调用”
typeof
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 }
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
Object.keys(x).includes('y');
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 }