【问题标题】:Optional chaining cause unexpected result when used in if statement可选链接在 if 语句中使用时会导致意外结果
【发布时间】:2020-10-17 13:44:08
【问题描述】:

我在代码中有一个 if 语句,它检查对象是否已定义,然后检查其属性之一的相等性。我的 if 语句是这样的:

if(obj && obj.a !== x) { // do something }

但现在我使用了可选链接并将我的 if 语句更改为:

if(obj?.a !== x) { // do something }

但现在我的代码在这种情况下无法正常工作。即使 obj 未定义,代码也会进入 if 语句。请有人解释一下为什么会这样?

【问题讨论】:

    标签: javascript ecmascript-next optional-chaining


    【解决方案1】:

    但现在我的代码在这种情况下无法正常工作。代码进入 即使 obj 未定义,也可以使用 if 语句。

    这主要是因为运算符的优先级。可选 channing (?.) 的优先级高于 And (&&) 运算符和严格不等式运算符 (!==)

    让我解释一下这两种情况:

    Case 1: if(obj && obj.a !== x) { // do something }
    

    这里 && 的优先级低于 !== 。所以这个比较可以等价于或写成:

    if(obj && (obj.a !== x)){// do something} 
    

    这里,如果 obj 为 falsy 或 nullish,则永远不会执行条件。

    Case 2: if(obj?.a !== x) { // do something }
    

    这里 ?. 的优先级高于 !== 。所以这个比较可能相当于:

    if((obj && obj.a) !== x) { // do something }
    

    所以在这种情况下,如果 obj 为空,我们将始终在 if 语句中输入,直到 x 不是未定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多