虽然我在查找Javascript简写模式时节省了时间,但我发现了一种表达if
语句here的有趣方式。以下作品:
var var1 = 5;
var var2 = 1;
var1 == 5 && var2++;
我认为编写只需要进行一次操作的if
语句就是一种非常酷(而且更简洁,更清晰)的方式。但是,当我尝试使用其他代码时,我遇到了以下代码的问题:
var var1 = 5;
var var2 = 1;
var1 == 5 && var2 = 2;
我的测试不会像第一个代码片段那样工作,而是抛出一个错误:
未捕获的ReferenceError:分配中的左侧无效
为什么这不起作用,为什么我的陈述的左侧被称为不正确而不是右手?
答案 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)
因为您在右侧使用了无效的运算符。它试图将整个语句作为单个变量读取。