返回其中一个操作数的布尔运算符

时间:2010-07-12 09:08:13

标签: javascript operators boolean

在Python中,也许在Javascript中,布尔orand运算符返回其中一个操作数,而不是truefalse

  • 在Python中,返回了一个操作数:'' || 'hello' == 'hello'
  • 相比之下,在PHP中:'' || 'hello' == true;

现在,

  • 如何调用布尔运算符的这种行为?
  • 这在所有浏览器中都适用于Javascript吗?

3 个答案:

答案 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 }}将始终被执行。

因此,尽管可以将它们用于类似目的,但重要的是要了解哪一个效率更高-特别是如果您在操作范围内触发大代码块时。