【问题标题】:Javascript: what's difference between | and ||?Javascript:有什么区别 |和||?
【发布时间】:2011-06-28 18:57:10
【问题描述】:

我正在查看一些 Javascript 代码:

if ( a>2 | b>4 ) { ... }

(忽略上面的 ...)。是什么|正在做?我认为这是逻辑或,但我在网上找到的所有参考文献都在谈论 ||,我找不到任何只提到 | 的东西。提前致谢

【问题讨论】:

  • 查看这个问题的答案stackoverflow.com/questions/3439951/…
  • 与大多数其他编程语言相同;)
  • Imo 你应该接受@aaronasterling 的回答,因为它实际上描述了| 的工作原理。我的回答只是一个扩展评论;)
  • 虽然它没有出现在下面的任何答案中......| always 评估两个参数,其中||(和&&)是 short-circuit 运算符,并且仅根据需要进行评估。例如var res = true || thisIsNeverExecuted() -- ||(和 &&)通常 [总是] 正确处理逻辑,但有时(而且非常值得怀疑!),不需要短路行为。有些人在紧要关头使用|& 来解决这个问题。不过,我会主张可维护的代码 :)

标签: javascript


【解决方案1】:

这是按位或。 || 是逻辑或。

按位或 (|) 将值强制转换为 32 位整数,并返回 32 位整数,如果相应位置中的两个位中的任何一个为 1,则返回 32 位整数,如果它们都为 0,则每个位都设置为 1。

如果不为假,逻辑或 (||) 计算为第一个值,否则计算为第二个值。

您几乎肯定想要|| 而不是|

【讨论】:

    【解决方案2】:

    ||| 之间的区别已经在其他答案中进行了说明。

    但是,在上面的代码中,|由于类型转换,与||的效果是一样的。

    truefalse 映射到 10,我们有

    0 | 0 = 0
    1 | 0 = 1
    0 | 1 = 1
    1 | 1 = 1
    

    另一个方向也是如此,1 计算结果为 true0 计算结果为 false

    所以在这个例子中,

    if ( a>2 | b>4 )
    

    将得到与

    相同的结果
    if ( a>2 || b>4 )
    

    注意:这实际上只适用于01 这两个值。


    这可能是某种微优化。

    更新:

    但是,一个简短的测试表明,为此目的使用按位 OR 要慢得多(至少在 Chrome 9 中):

    http://jsperf.com/js-or-test

    结论:不要使用它来代替逻辑 OR :) 很可能有人忘记了第二个 |,幸运的是代码产生了相同的结果。

    对布尔运算使用布尔运算符,对花哨的位掩码使用位运算符。这可能值得一读:MDC - Bitwise Operators

    【讨论】:

    • 正是我需要的。谢谢菲利克斯!
    • 同样重要的是要注意 ||短路,|没有。
    • 我很难相信这是一个微优化,而不仅仅是有人不知道两者之间的区别。 || 可以短路并且不需要强制。对于|,两者都不成立。
    • @aaronasterling:是的,使用| 确实慢了一个数量级。
    【解决方案3】:

    单人 |是按位或,而双精度 (||) 是逻辑或。

    按位或取两个源值的二进制表示并将它们 OR 在一起,这样如果其中一个值设置了位,则结果值的位也将被设置(对两个源值中的所有位重复)。

    Logical-OR 关注的是真值和假值(其中 0 映射为假,非零映射为真 - 这很简单,JavaScript 有更具体的规则)。如果任一源值为真,则结果为真。

    【讨论】:

    • 这在 JavaScript 中是不正确的。整体“||”的 expression 是左侧或右侧的值,取决于两者中的哪一个不是 falsy。首先计算左侧,如果它不是 falsy 那么这就是 "||"" 表达式的值。否则该值是右侧的值。区别在于不像,比如说, Java,结果的 type 不一定是 boolean - 它可以是 any 类型。
    【解决方案4】:

    看起来第二个管道刚刚丢失,否则它是一个臭的黑客。看看到底发生了什么:

    if ( Boolean( Number(a>2) | Number(b>4) ) ) { ... }
    

    Number 在这里很特别,因为位运算符使用 32 位整数) 它之所以有效,是因为 Number(true) === 1 && Number(false) === 0。

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 2010-10-29
      • 2010-09-13
      • 1970-01-01
      • 2023-03-07
      • 2011-11-10
      • 2012-02-23
      • 1970-01-01
      相关资源
      最近更新 更多