2016-08-25 102 views
1

我在摸索着理解这个非常简化的语句。当搜索答案时,我发现的所有答案都与三元操作符有关。Javascript简化if语句

无论如何。为什么下面的第一种情况会起作用,而后者会抛出ReferenceError?试图了解事情的工作方式。

true && alert("test")

var x; 
 
true && x = 10;

+4

'='你正在做的分配不是一个比较 – Weedoze

+5

我认为它需要这样的'真&&(X = 10);'防止错误否则解释为:'(true && x)= 10' – Titus

+1

可能是某种东西,按照它的顺序解释。 可能是这样的(不知道,只是在想): true && x = 10; (true && x)= 10; false = 10 - >错误 – Adrian

回答

4

Javascript似乎会赋予&&更高的优先级,而不是赋值运算符。

(true && x) = 10; 

如果添加分配左右括号,我想你会看到您所期望的行为:

true && (x = 10); // Sets x to 10 and the whole expression evaluates to 10. 

而且万一你需要为你提供的第二行被解析关于为什么&&可用作if语句的指示器,短语“短路评估”可能有所帮助。

+2

它似乎并不仅仅给'&&'更高的优先级,事实上它确实赋予了该运算符更高的优先级:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/ Operators/Operator_Precedence – JLRishe

+0

@Rabbits:感谢您的短语。现在我知道该怎么称呼它了。 :) – stafffan

6

这与operator precedence做。由于&&操作在=前计算,你的第二个例子就是最终作出没有意义的:(true && x) = 10;

对于你的第二个案件的工作,加上括号这样:

var x; 
 
true && (x = 10);

3

它是一个Operator precedence

正如你可以看到&&具有更高的优先级比=

所以true && x = 10;实际上是(true && x) = 10;这显然是错误的。您只能将值分配给变量,并且(true && x)要么是false要么值为x

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