为什么 "and" 在 "equal" 之前评估
Why is "and" evaluated before "equal"
In Javascript precedence of strict equal
(10) 大于 logical and
(6) 那么这段代码是如何工作的
var a;
console.log("value of a is", a);
if (a && a.test === "test") {}
它不应该抛出错误吗
cannot read test of undefined.
而member access
的伤口加盐优先级高于两者(19)。
我错过了什么?
一些编程语言,例如 JavaScript,会延迟计算逻辑表达式。这意味着如果表达式的第一部分 (a
) 为假,解释器认为没有理由执行第二部分 (a.test === "test"
),因此不会抛出错误。
澄清一下,优先级不定义表达式执行的实际顺序,只定义有效顺序。因此 member access
运算符具有最高优先级并不意味着它将首先执行。解释器仍然可以首先评估 a
,而不会影响任何更高优先级运算符的结果。您可以将优先级视为隐式括号,如果您将表达式写为 (a) && ((a.test) === "test")
您可以清楚地看到 a
可以并且将首先被评估,因为它位于表达式的最左侧。
table 的意思是在这样的表达式中,元素被评估为
a && (a.test === 'something')
而不是 (a && a.test) === 'something'
因为 precedence.this 的顺序完全独立于逻辑表达式的计算方式(按出现顺序)。因此,如果 a
为假,则没有理由评估表达式的其余部分,因为无论 &&
之后是什么,表达式都将为假。如果 a
是 true
并且运算符是 ||
,也会发生同样的事情。这也称为短路。
In Javascript precedence of strict equal
(10) 大于 logical and
(6) 那么这段代码是如何工作的
var a;
console.log("value of a is", a);
if (a && a.test === "test") {}
它不应该抛出错误吗
cannot read test of undefined.
而member access
的伤口加盐优先级高于两者(19)。
我错过了什么?
一些编程语言,例如 JavaScript,会延迟计算逻辑表达式。这意味着如果表达式的第一部分 (a
) 为假,解释器认为没有理由执行第二部分 (a.test === "test"
),因此不会抛出错误。
澄清一下,优先级不定义表达式执行的实际顺序,只定义有效顺序。因此 member access
运算符具有最高优先级并不意味着它将首先执行。解释器仍然可以首先评估 a
,而不会影响任何更高优先级运算符的结果。您可以将优先级视为隐式括号,如果您将表达式写为 (a) && ((a.test) === "test")
您可以清楚地看到 a
可以并且将首先被评估,因为它位于表达式的最左侧。
table 的意思是在这样的表达式中,元素被评估为
a && (a.test === 'something')
而不是 (a && a.test) === 'something'
因为 precedence.this 的顺序完全独立于逻辑表达式的计算方式(按出现顺序)。因此,如果 a
为假,则没有理由评估表达式的其余部分,因为无论 &&
之后是什么,表达式都将为假。如果 a
是 true
并且运算符是 ||
,也会发生同样的事情。这也称为短路。