在三元运算符中使用 || 和 &&。

7

使用传统的 if 语句,我可以做到这一点:

if(a===0 || b===0) {console.log('aloha amigo')};

但是,当我尝试使用三元运算符做同样的事情时,代码如下:
a===0 || b===0 && console.log('aloha amigo')

我只是遇到了意外的 || 错误。

根据这个答案:Precedence: Logical or vs. Ternary operator,我们可以使用

condition1 || condition2 ? do if true : do if false

对于这种情况,抱歉我不知道如何称呼? :符号,但我不确定如何使用&&运行它(它的意思是只有在返回true时才运行代码)。

我创建了一个CodePen来轻松测试它。以下是整个代码:

var a = 0;
var b = 1;

a===0 || b===0 ? console.log('Works here') : console.log('And here');

a===0 || b===0 && console.log('Doesn\'t work here');

a===0 && console.log('The && works for a single test');

Here's the link


“但是,当我尝试使用三元运算符做同样的事情时......”那不是三元运算符(一种接受三个操作数的运算符)。这是两个二进制运算符(||&&——接受两个操作数的运算符)。JavaScript目前只有一个三元运算符:条件运算符:condition ? ifTrue : ifFalse。它可能在某个阶段添加另一个三元运算符,但现在它只有一个。 - T.J. Crowder
1个回答

14

只需使用括号避免 && 运算符比 || 运算符的优先级更高。

(a === 0 || b === 0) && console.log('aloha amigo')

没有括号,你将得到一个不同的结果(现在显示运算优先级)。

a === 0 || (b === 0 && console.log('aloha amigo'))
^^^^^^^                                             first evaluation
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  second evaluation

好的,这个可行。但是为什么我需要把它放在括号里?我将在10分钟内选择最佳答案。 - Alex Ironside
4
更重要的问题是,为什么你浪费时间让你的代码变得更难以阅读、更难以维护并且更容易出错呢?只需要使用 if 语句就好了,这才是它存在的意义。即使是该语言的作者Brendan Eich也将 condition && doSomething(); 称为对 && 运算符的滥用。**;-)** - T.J. Crowder
1
我看到其他人在使用它,感觉很有道理,于是我也开始使用了。它看起来很易读。这不是一个更短的if语句吗? - Alex Ironside
4
@alex.iron- 当然,易读性是读者的观点。 简短并不等于更好。 将缩小代码的工作留给缩小器。 相反,编写清晰、易于修改的代码。 在这里,一个带有适当块的“if”语句会多几个字符,但以后修改起来会容易得多。 无论如何,编码愉快! - T.J. Crowder
@alex.iron - :-) 希望我上面的夸张言辞传达了我想要表达的友好精神。书面沟通真的很难。编程愉快! - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接