JavaScript 如何判断一个对象是否具有给定的属性

IT技术 javascript object
2021-01-22 13:58:53

无论 的值如何,如何确定对象是否具有x已定义的属性yx.y

我目前正在使用

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

但这似乎有点笨拙。有没有更好的办法?

6个回答

对象具有属性:

如果您正在测试对象本身(不是其原型链的一部分)上的属性,您可以使用.hasOwnProperty()

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

对象或其原​​型有一个属性:

您也可以使用in运算符来测试继承的属性。

if ('y' in x) {
  // ......
}
甚至更好——Object.prototype.hasOwnProperty.call(x, 'y')这样名为“hasOwnProperty”的属性就不会与检查过程发生冲突;)
2021-03-19 13:58:53
或者更短—— {}.hasOwnProperty.call(x, 'y')
2021-04-06 13:58:53

如果您想知道对象物理上是否包含属性@gnarf's answer usinghasOwnProperty将完成工作。

如果您想知道该属性是否存在于任何地方,无论是在对象本身还是在原型链中,您可以使用in运算符

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
2021-04-06 13:58:53

你可以像这样修剪一下:

if ( x.y !== undefined ) ...
有人需要区分“未定义”和“定义为未定义”吗?
2021-03-25 13:58:53
那会失败 x = {y:undefined}
2021-04-06 13:58:53
@jpsimons for 和实例“定义为未定义”在保存文档数据时被 Firestore 使用。
2021-04-06 13:58:53
@darkporter 我有时会这样做;)
2021-04-14 13:58:53

我的原始代码的一个功能

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

在某些情况下可能有用的是,无论是否x存在,使用都是安全的使用 gnarf 答案中的任何一种方法,首先应该测试x是否存在任何疑问。

因此,也许所有三种方法都有自己的技巧。

你总是可以使用(x && x.hasOwnProperty('y'))(x && 'y' in x)
2021-03-23 13:58:53
我同意,对 x 的测试应该是一个单独的案例。还可以产生更好的错误报告。
2021-03-28 13:58:53
那对我来说失败了。如果 x 未定义,则 typeof(xy) 返回 aReferenceError而不是字符串 'undefined'
2021-04-11 13:58:53