【问题标题】:Is this a safe way to check if a property exist else assign one?这是检查属性是否存在的安全方法,否则分配一个?
【发布时间】:2019-01-26 01:12:22
【问题描述】:

以下是 MDN 示例的摘录

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

这是检查属性是否存在以及分配和初始化它的安全方法吗?如果没有,有没有更好、安全和优化的方法?

【问题讨论】:

    标签: javascript object properties


    【解决方案1】:

    不,这不安全,因为该属性可能确实存在于对象上,但 falsey,在这种情况下,withValue.d || 将失败并进入交替状态,将对象分配给 @ 987654322@ 属性,尽管d 属性已经存在。请改用hasOwnProperty,并且不要将赋值放在需要表达式的位置:

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

    如果d 属性存在,将永远是一个对象,那么你的原始代码将工作,因为对象总是真实的。 (不过,由于赋值为表达式,代码还是有点臭)

    【讨论】:

    • 为什么最后一行const { d } = withValue;
    • 我只是更喜欢在可能的情况下进行解构(就像许多 linter 一样)——更少的类型,更少的语法噪音。 (想象一下,如果d 很长 - 那么,你需要const somePropNameHere = withValue.somePropNameHere)随意使用const d = withValue.d
    【解决方案2】:

    不,你应该检查它是否是in对象

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多