【问题标题】:How does "5.5 | 0 === 5" work? [duplicate]“5.5 | 0 === 5”如何工作? [复制]
【发布时间】:2014-02-10 05:56:57
【问题描述】:

5.5 | 0 === 5 是如何工作的?

| 0 在这种情况下是按位计算的OR 我怀疑它是吗?如果是这样,为什么它会在该点之后切断所有内容?

【问题讨论】:

  • @Cristy 在这种情况下,我不确定它是否重复,因为实际上看起来像这样的代码可能并不是真的试图简单地进行“地板”操作。当然,这实际上就是正在发生的事情。

标签: javascript


【解决方案1】:

| 执行运算符是按位或运算,将每个操作数隐式转换为 32 位整数。作为Pointy notes5.5 | 0 === 5 被解析为5.5 | (0 === 5),其计算结果为5.5 | false

根据specification


5. 令 lnum 为 ToInt32(lval)。
6. 设 rnum 为 ToInt32(rval)。
7. 返回对 lnum 和 rnum 应用位运算符 @ 的结果。结果是一个带符号的 32 位整数。

而且由于 X | 0X 对于任何整数,它实际上只是删除了数字的任何小数部分。

【讨论】:

    【解决方案2】:

    不等于真,只是不等于假。

    5.5 | 0 === 5 
    

    返回

    5
    

    【讨论】:

    • 运算符优先级。 (5.5 | 0) === 5 返回真
    • 那只是因为0 === 5是假的,被强制为0,然后5.5 | 0就是5
    • @YuriyGalanter 表达式5.5 | 0 === 5 为我返回5,而(5.5 | 0) === 5 返回true。我认为我们需要确认我们/问题所指的是哪种表达方式。
    • @ajp15243 === 运算符的优先级高于|,所以先进行比较。
    • @Pointy 我明白这一点。我要指出的是,OP 的问题是关于没有( ) 的表达式,而 Yuriy 似乎试图用包含 ( ) 的表达式来说明一点,这显然是一个不同的表达式,不一定是什么被问及。如果( ) 表达式在这里有一点意义,我没有看到它。
    【解决方案3】:

    位运算符总是将操作数强制为 32 位整数。

    操作被解释为

    5.5 | (0 === 5)
    

    这是

    5.5 | false
    

    这是强制的

    5.5 | 0
    

    现在5.5 被转换为 32 位整数,所以我们有

    5 | 0
    

    这是5

    关系运算符比位运算符绑定得更紧密,这可能会造成混淆。如果要比较位运算符的结果(与加法或乘法不同),则必须显式加括号。

    【讨论】:

    • 哈,真是巧合 :) “位运算符总是将操作数强制转换为 32 位整数”一般是真的吗,即对于其他语言也是如此?
    • 很好,我以为 OP 是在谈论 5.5 | 0 结果产生 5 并且措辞很糟糕。
    • @user2820379 有些语言会这样做,但很多语言不会。像 C# 这样的强类型语言甚至没有在非整数类型上定义位运算符。例如"foo"|"bar" 导致编译器错误。
    猜你喜欢
    • 2021-07-12
    • 2018-01-27
    • 2014-09-17
    • 2017-09-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2012-04-04
    相关资源
    最近更新 更多