为什么在JavaScript中1|0,2|0等于2

Why does 1|0,2|0 equal 2 in JavaScript?

本文关键字:等于 JavaScript 为什么      更新时间:2023-09-26

如果在JavaScript中评估1|0,2|0,则会得到2

如果你评估1|0+','+2|0,你会得到1

我无法理解这一点。

二进制位运算符(包括|)的绑定不如加法运算符+紧密。因此

1|0+','+2|0

真的是

1|(0+','+2)|0

哪个是

1|('0,2')|0

哪个是

1|0|0

即CCD_ 7。(字符串"0,2"被转换为整数;作为数字,它是NaN,但由于NaN是一个浮点概念,当强制为整数时,它会变成0。)

编辑—关于第一个表达式1|0,2|0,它涉及JavaScript逗号运算符。逗号运算符允许将一个独立的、本质上独立的(而不是通过副作用)表达式列表"粘在一起",形成解析器将识别为单个表达式的内容。计算时,每个表达式都将按正常情况进行计算,但整个表达式的值只是列表中最后一个表达式的值。因此,1|0,2|0将首先导致对1|0进行评估,但该结果被丢弃,并且总值仅为2|0的值。

逗号运算符在许多从C派生表达式语法的语言中很常见;仅一个表达式—为了出现在几种有趣的语法情况下,并且因为表达式可能(而且经常)有副作用,有时可以将几个单独的表达式插入到语言真正想要的地方是很方便的。也就是说,通常有更干净、更好的做事方式。在JavaScript中,我个人更喜欢使用立即调用的函数。它的类型更多,出于性能原因可能会有点糟糕,但我认为它要干净得多,因为它允许为临时变量和更多涉及的逻辑提供一个独立的命名空间。

您需要查看运算符优先级表才能理解这一点。

表达式1|0,2|0具有按位或比逗号运算符更高的优先级,因此它等效于(1|0), (2|0)。逗号运算符计算两个操作数并返回第二个操作数,因此可以得到(2|0)的值。该值为2

表达式1|0+','+2|0的加法优先级高于按位或,因此它等效于1|(0+','+2)|00+','+2的结果是"0,2",这不是数值,因此在数值运算中它的求值为NaN。它被强制为按位或的0,因此留下1|0|0,其结果为1。

来自MDN:

逗号运算符计算其两个操作数(从左到右)并返回第二操作数的值。

因此,在1|0,2|0中,首先从左到右评估两个表达式1|02|0,然后返回最后一个表达式(2|0)的结果。1|0 === 12|0 === 2,所以最后一个表达式的结果是2,这是返回的。

1|0+','+2|0中,逗号出现在与02连接的字符串文字中。整个事情的评估如下:

  1. ( 1 | ( (0+',')+2 ) ) | 0
  2. ( 1 | ( '0,'+2 ) ) ) | 0(数字+字符串=字符串串联)
  3. ( 1 | '0,2' ) | 0(字符串+数字=字符串串联)
  4. ( 1 | NaN ) | 0(位OR需要数字操作数。0,2转换失败,改为NaN
  5. 1 | 0(逐位OR仅处理整数,因此浮点NaN被强制转换为0
  6. 1