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

我正在使用

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

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


当前回答

ES6 +:

ES6+有一个新功能,你可以像下面这样检查:

if (x?.y)

实际上,解释器检查x的存在,然后调用y,因为在if括号内,强制发生,x?Y转换为布尔值。

其他回答

下划线。js或Lodash

if (_.has(x, "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 }

我的原始代码的一个特性

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

这在某些情况下是有用的不管x是否存在它都是安全的。对于gnarf回答中的任何一种方法,如果对x是否存在有任何怀疑,都应该首先测试x。

因此,也许这三种方法在一个人的魔术包中都有一席之地。

既然问题是关于属性检查的笨拙,一个常规的用例是函数参数选项对象的验证,我认为我应该提到一种无库的测试多个属性是否存在的简短方法。 免责声明:它确实需要ECMAScript 5(但在我看来,任何仍在使用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

除了其他答案,我想建议使用object . hasown()方法来检查指定的对象是否有指定的属性作为自己的属性(在对象本身上的意思),你可以使用新的object . hasown()方法,这是一个静态方法,如果指定的对象有指定的属性作为自己的属性,它会返回true。如果该属性被继承,或不存在,则该方法返回false。

Const person = {name: 'dan'}; console.log(对象。hasOwn(person, 'name')) console.log(对象。hasOwn(person, 'age')) const person2 =对象。创建({性别:男性的}); console.log(对象。hasOwn(person2, 'gender'))

建议在Object.hasOwnProperty()方法上使用此方法,因为它也适用于使用Object.create(null)创建的对象以及覆盖继承的hasOwnProperty()方法的对象。虽然可以通过在外部对象上调用object .prototype. hasownproperty()来解决这类问题,但object . hasown()克服了这些问题,因此是首选的(参见下面的示例)

Let person = { hasOwnProperty: function() { 返回错误; }, 年龄:35 }; 如果对象。hasOwn(人,年龄)){ console.log (person.age);// true - hasOwnProperty()的补充不影响对象 }

let person = Object.create(null); 的人。年龄= 35岁; 如果对象。hasOwn(人,年龄)){ console.log (person.age);// true -无论对象是如何创建的都有效 }

更多关于Object的信息。hasOwn可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn

浏览器兼容性- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility

检查指定的属性是否存在于对象本身或原型链中,可以通过in操作符验证,就像其他答案所建议的那样。