recent question 已重定向至此处,尽管我同意中心问题已在高层次上得到准确回答,但部分较新问题似乎是在询问逻辑 OR 和三元运算符之间的区别在 Javascript 中。
我想提供一个低级示例来说明差异,因为我在重定向问题之前编写了大部分内容,null-coalescing operator 的概念相当抽象。
考虑这些函数,它们可以在浏览器控制台或任何 repl 中运行:
let logicalOrTest = function(val) {
let a = 2;
let b = 3;
console.log(val === a);
console.log(val === b);
console.log(val === (a || b));
console.log(val !== (a || b));
}
期待logicalOrTest(2) 登录true false true false
期待logicalOrTest(3) 登录false true false true
期待logicalOrTest(4) 登录false false false true
这表明,当值等于第一个条件时,将任何值 val 与 (a || b) 进行比较将返回 true,而对于任何其他值,将返回 false,包括第二个.
简单地说,如果满足a 条件,则甚至不考虑条件b。另一方面,如果条件a 不满足,b 将在决定做什么之前考虑。
现在让我们看看三元运算符:
let ternaryTest = function(val) {
let a = 2;
let b = 3;
val === a ? console.log(true) : console.log(false);
val === b ? console.log(true) : console.log(false);
val === (a || b) ? console.log(true) : console.log(false);
val !== (a || b) ? console.log('neither condition was met') : console.log('wat');
}
期望ternaryTest(2) 登录true false true "wat"
期待ternaryTest(3) 登录false true false "neither condition was met"
期待ternaryTest(4) 登录false false false "neither condition was met"
与逻辑 OR (||) 一样,三元运算符 x ? x : y 会将任何 falsy 值传递到第二个表达式的范围内,其中还包括与第二个条件等效的值。如果满足条件a,则不考虑条件b。
区别在于,如果条件a在三元运算中不满足,则表达式a将被忽略,而表达式b将总是被执行。
因此,虽然它们可以用于类似目的,但了解哪一个更有效非常重要——尤其是当您在操作范围内触发大块代码时。