在Python中,也许在Javascript中,布尔or
和and
运算符返回其中一个操作数,而不是true
或false
。
'' || 'hello' == 'hello'
'' || 'hello' == true
; 现在,
答案 0 :(得分:2)
正如Ignacio's answer所指出的,这些是合并运算符。 ||
是null coalescing operator,&&
是空安全合并运算符(链接要遵循,如果我能找到一个抱歉,我找不到链路)。
它们应该适用于所有浏览器 - 它们都在ECMA-262第1版,第2版,第3版和第5版中定义,大多数当前的Javascript实现基于第3版或第5版。来自ECMA-262第3版:
制作LogicalANDExpression:LogicalANDExpression&& BitwiseORExpression评估为 如下:
1.评估LogicalANDExpression 2.调用GetValue(结果(1)) 3.调用ToBoolean(Result(2))。
4.如果Result(3)为false,则返回Result(2) 5.评估BitwiseORExpression 6.调用GetValue(结果(5)) 7.返回结果(6)。生产LogicalORExpression:LogicalORExpression || LogicalANDExpression评估为 如下:
1.评估LogicalORExpression 2.调用GetValue(结果(1)) 3.调用ToBoolean(Result(2))。
4.如果Result(3)为true,则返回Result(2) 5.评估LogicalANDExpression 6.调用GetValue(结果(5)) 7.返回结果(6)。
答案 1 :(得分:1)
它被称为“合并”。它应该在任何声称符合要求的浏览器中表现相同。
答案 2 :(得分:0)
此处已重新定向了recent question,尽管我同意核心问题已在较高级别上得到了正确回答,但较新问题的一部分似乎正在询问逻辑或与逻辑或之间的区别。 Java语言中的三元运算符。
我想提供一个低级示例来说明这种差异,因为我在重定向问题之前写了大部分内容,并且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
将被忽略,而表达式{{1 }}将始终被执行。
因此,尽管可以将它们用于类似目的,但重要的是要了解哪一个效率更高-特别是如果您在操作范围内触发大代码块时。