17

当我消磨时间查找 Javascript 速记模式时,我在这里遇到了一种表达语句if的有趣方式。以下作品:

​var var1 = 5;
var var2 = 1;

var1 == 5 && var2++;

我认为这是一种非常酷(并且更短,更简洁)的编写if语句的方式,只需要执行一个操作。但是,一旦我尝试了其他代码,我就遇到了以下代码的问题:

​var var1 = 5;
var var2 = 1;

var1 == 5 && var2 = 2;

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

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

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

4

3 回答 3

33

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

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

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

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

其他人会斥责你写这样的代码,说这是一个坏主意,因为它使代码的意图更难阅读——这是事实,尤其是对于不熟悉这个习语的人——但尝试它很重要出去尝试这样的事情,亲眼看看会发生什么。您已经遇到过这种方法令人讨厌的事情之一。

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

if(condition) statement;

虽然我相信其他人会告诉你这是不好的风格,因为当你需要更多语句时你必须手动添加括号,但这并没有真正让我和 IMO 比使用三行更干净,就像你说的那样.

于 2012-04-25T02:15:05.910 回答
16

不要惊慌,这并没有像你期望的那样工作,事实上不到一个月前,Brendan Eich(JavaScript 的创建者)与我们分享了这种类型的使用更广为人知的是“滥用”语言,因为这个逻辑运算符并不是要执行这样的代码,而是要确定表达式的值。

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

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

(var1 == 5) && (var2 = 2)
于 2012-04-25T02:19:52.007 回答
1

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

于 2012-04-25T02:16:14.230 回答