这是检查属性是否存在的安全方法吗?

时间:2019-01-26 01:12:22

标签: javascript object properties

下面是MDN示例的摘录

var d = withValue.d || (
  withValue.d = {
    enumerable: false,
    writable: false,
    configurable: false,
    value: value
  }
);

这是检查属性是否存在的安全方法,否则分配并初始化它?如果没有,那么有没有一种更好,安全和优化的方法?

2 个答案:

答案 0 :(得分:5)

不,这并不安全,因为该属性可能确实存在于对象上,但为 falsey ,在这种情况下,withValue.d ||会失败并继续进行更改,将一个对象分配给尽管d属性已经存在,但d属性仍然存在。请改用hasOwnProperty,并且不要将作业放在期望表达的地方:

if (!withValue.hasOwnProperty('d')) {
  withValue.d = {
    enumerable: false,
    writable: false,
    configurable: false,
    value: value
  }
}
const { d } = withValue;

如果d属性(如果存在),将始终是一个对象,那么您的原始代码将起作用,因为对象始终是真实的。 (由于赋值即表达,代码仍然有点臭)

答案 1 :(得分:0)

否,您应该检查它是否in个对象

就像@certainperformance所说的那样,通过检查对象的值来检查其属性是否存在并不安全。相反,您可以使用JavaScript's in operator来简单地检查属性是否为in对象:

if (!('d' in withValue)) {
  withValue.d = { ... };
}

const { d } = withValue;

您可能会遇到的唯一问题是prop in obj不仅会检查对象的属性,还会检查原型。但是,在大多数情况下,这可能还不错。