可选链接在 if 语句中使用时会导致意外结果
Optional chaining cause unexpected result when used in if statement
我在代码中有一个 if 语句,它检查一个对象是否被定义,然后检查它的一个属性是否相等。我的 if 语句是这样的:
if(obj && obj.a !== x) { // do something }
但现在我使用了可选链接并将我的 if 语句更改为:
if(obj?.a !== x) { // do something }
但现在我的代码在这种情况下无法正常工作。即使 obj 未定义,代码也会进入 if 语句。请问有人可以解释为什么会这样吗?
But now my code is not working correctly in this case. The code enters
if statement even when obj is undefined.
发生这种情况主要是因为运算符的优先级。可选通道 (?.) 的优先级高于 And (&&) 运算符和严格不等运算符 (!==) .
让我解释一下这两种情况:
Case 1: if(obj && obj.a !== x) { // do something }
此处,&& 的优先级低于 !== 。所以这个比较可以等同于或写成:
if(obj && (obj.a !== x)){// do something}
此处,如果 obj 为假或空值,则永远不会执行条件。
Case 2: if(obj?.a !== x) { // do something }
这里,?. 的优先级高于 !== 。所以这个比较可以等同于:
if((obj && obj.a) !== x) { // do something }
所以在这种情况下,如果 obj 为空,我们将始终进入 if 语句,直到 x 不是未定义的。
我在代码中有一个 if 语句,它检查一个对象是否被定义,然后检查它的一个属性是否相等。我的 if 语句是这样的:
if(obj && obj.a !== x) { // do something }
但现在我使用了可选链接并将我的 if 语句更改为:
if(obj?.a !== x) { // do something }
但现在我的代码在这种情况下无法正常工作。即使 obj 未定义,代码也会进入 if 语句。请问有人可以解释为什么会这样吗?
But now my code is not working correctly in this case. The code enters if statement even when obj is undefined.
发生这种情况主要是因为运算符的优先级。可选通道 (?.) 的优先级高于 And (&&) 运算符和严格不等运算符 (!==) .
让我解释一下这两种情况:
Case 1: if(obj && obj.a !== x) { // do something }
此处,&& 的优先级低于 !== 。所以这个比较可以等同于或写成:
if(obj && (obj.a !== x)){// do something}
此处,如果 obj 为假或空值,则永远不会执行条件。
Case 2: if(obj?.a !== x) { // do something }
这里,?. 的优先级高于 !== 。所以这个比较可以等同于:
if((obj && obj.a) !== x) { // do something }
所以在这种情况下,如果 obj 为空,我们将始终进入 if 语句,直到 x 不是未定义的。