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

284 javascript object

如何确定对象是否具有x已定义的属性y,而不管其值是x.y多少?

我正在使用

if (typeof(x.y) !== 'undefined')
Run Code Online (Sandbox Code Playgroud)

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

gna*_*arf 539

对象有属性:

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

if (x.hasOwnProperty('y')) { 
  // ......
}
Run Code Online (Sandbox Code Playgroud)

对象或其原​​型具有以下属性:

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

if ('y' in x) {
  // ......
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至更好 - "Object.prototype.hasOwnProperty.call(x,'y')`,以便名为"hasOwnProperty"的属性不会与检查过程冲突;) (21认同)
  • 这些天使用 [`Object.hasOwn()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn) (4认同)
  • 甚至更短-`{} .hasOwnProperty.call(x,'y')`。 (3认同)
  • https://eslint.org/docs/rules/no-prototype-builtins (2认同)

CMS*_*CMS 76

如果你想知道对象是否物理上包含属性@ gnarf的回答使用hasOwnProperty将做的工作.

如果您想知道属性是存在于对象本身还是原型链中的任何位置,您可以使用in运算符.

if ('prop' in obj) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

例如.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Run Code Online (Sandbox Code Playgroud)


nac*_*son 15

Underscore.js或Lodash

if (_.has(x, "y")) ...
Run Code Online (Sandbox Code Playgroud)

:)


jps*_*ons 14

你可以这样修剪一下:

if ( x.y !== undefined ) ...
Run Code Online (Sandbox Code Playgroud)

  • 有没有人需要区分"未定义"和"定义为未定义?" (18认同)
  • 用`x = {y:undefined}`会失败 (15认同)
  • @darkporter我有时会这样做;) (13认同)

小智 7

我的原始代码的一个功能

if ( typeof(x.y) != 'undefined' ) ...
Run Code Online (Sandbox Code Playgroud)

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

因此,也许所有三种方法都有其中一个方法.


J R*_*Rod 5

包括

Object.keys(x).includes('y');
Run Code Online (Sandbox Code Playgroud)

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

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

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