【问题标题】:Use optional chaning to increment object property使用可选链接来增加对象属性
【发布时间】:2022-11-25 01:06:51
【问题描述】:

我想使用可选的 chaning 运算符 (?.) 来增加对象值。 在我的示例中,我想在一个名为 birthday() 的函数中将一个人的年龄增加一岁,前提是为当前人设置了年龄。 带有 if 子句的行工作正常(如果明显有效,也是 tenary)。但是我想知道是否有可能出现类似下面的行。给出的语法导致 SyntaxError:invalid increment/decrement operand。也许这是一个基于运算符优先级的问题,但我现在知道如何解决它了。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}
let peter = new Person("Peter", 27);
let paul = new Person("Paul", undefined);

Person.prototype.birthday = function() {
  if (this.age) this.age++;
};

//Person.prototype.birthday = function(){this?.age++};

peter.birthday();
paul.birthday();
console.log(peter, paul);

【问题讨论】:

    标签: javascript operators optional-chaining


    【解决方案1】:

    我想使用可选的链接运算符 (?.)

    你不能。原因是可选链接的结果只是一个值,而不是属性引用,因此您不能使用任何写回属性的运算符(如 ++--+= 等.). (由规范的this part 显示。)相比之下,property acccessor 的结果类似于 this.age(在规范术语中)是对该属性的引用,因此操作员可以写回该属性。

    您使用 if 的版本是处理此问题的方法。


    但是,作为旁注,您的两个陈述是分开的做不同的事.

    您的可选链接 (this?.age) 正在检查 this 是否无效。但是您的if 正在检查this.age 是否无效。等效的 if 将是 if (this) { this.age++; }。但是从整体代码上下文来看,你不想要那个,你想要你目前在 if 中拥有的东西,尽管我想我可能会让它成为一个更具体的检查:

    if (this.age !== undefined) {
        this.age++;
    }
    

    我说因为 0 是假的,所以只是 if (this.age) 不会递增 0

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 2021-11-04
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多