我正在试图理解这个非常简化的if语句。在搜索答案时,我发现的所有答案都与三元运算符有关。
反正。为什么下面的第一个案例起作用,而后者抛出ReferenceError
?只是想了解事情是如何运作的。
true && alert("test")
var x;
true && x = 10;
答案 0 :(得分:6)
这与operator precedence有关。由于&&
操作是在=
之前计算的,否则您的第二个示例最终会毫无意义:(true && x) = 10;
对于您的第二个案例,请以这种方式添加括号:
var x;
true && (x = 10);

答案 1 :(得分:4)
Javascript似乎优先于&&
而不是赋值运算符。您给出的第二行解析为:
(true && x) = 10;
如果在作业周围添加括号,我想你会看到你期望的行为:
true && (x = 10); // Sets x to 10 and the whole expression evaluates to 10.
如果你需要一个关于为什么&&
可以用作if语句的指针,短语"短路评估"可能有所帮助。
答案 2 :(得分:3)
正如您所看到的,&&
的优先级高于=
所以true && x = 10;
实际上是(true && x) = 10;
,这显然是错误的。您只能为变量指定值,而(true && x)
可以是false
,也可以是x
的值。
答案 3 :(得分:1)
alert()的结果未定义。所以第一个例子可以重新输入:
var x; // x is now 'undefined'
true && x; // true and undefined is undefined

第二个例子是关于运营商的优先事项。运行时将表达式评估为(true&& x)= 10;
var x;
true && (x = 10); // result will be 10