使用'&&'作为简写如果声明?

时间:2012-04-25 02:12:47

标签: javascript

虽然我在查找Javascript简写模式时节省了时间,但我发现了一种表达if语句here的有趣方式。以下作品:

​var var1 = 5;
var var2 = 1;

var1 == 5 && var2++;

我认为编写只需要进行一次操作的if语句就是一种非常酷(而且更简洁,更清晰)的方式。但是,当我尝试使用其他代码时,我遇到了以下代码的问题:

​var var1 = 5;
var var2 = 1;

var1 == 5 && var2 = 2;

我的测试不会像第一个代码片段那样工作,而是抛出一个错误:

  

未捕获的ReferenceError:分配中的左侧无效

为什么这不起作用,为什么我的陈述的左侧被称为不正确而不是右手?

3 个答案:

答案 0 :(得分:28)

这不起作用,因为 &&运算符的优先级高于=运算符。换句话说,您的代码解释如下:

(var1 == 5 && var2) = 2; 

如果在分配周围手动放置括号,它将被正确解释。

var1 == 5 && (var2 = 2); 

其他人会谴责你写这样的代码,说这是一个坏主意,因为它使代码的意图更难阅读 - 这是真的,特别是对于不熟悉这个成语的人 - 但这很重要尝试一下,尝试这样的事情,亲眼看看会发生什么。你已经遇到过这种方法的烦人之处。

无论如何,在这种情况下,我个人更喜欢使用单行if语句,比如

if(condition) statement;

虽然我确信其他人会告诉你那种不好的风格,因为你需要在需要更多语句时手动添加括号,这对我来说并不是真的比IMO更清洁,而不仅仅是为了一个简单的条件而使用三条线,就像你说的那样。

答案 1 :(得分:14)

不要担心这不会像你期望的那样起作用,事实上不到一个月前,Brendan Eich(JavaScript的创造者)与我们分享这种类型的使用被称为“滥用” “这个语言,因为这个逻辑运算符并不意味着执行这样的代码,而是意味着确定表达式的值。

  

“我也同意......&&行是一种滥用行为,由于JS的C传承通过Java而被允许,但大多数JS黑客不赞成;并且if语句会更好......“http://brendaneich.com/2012/04/the-infernal-semicolon/

话虽如此,您可以通过包装语句来避免运算符优先级问题:

(var1 == 5) && (var2 = 2)

答案 2 :(得分:1)

因为您在右侧使用了无效的运算符。它试图将整个语句作为单个变量读取。