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

为什么在JavaScript中1 | 0,2 | 0等于2?,javascript,Javascript,如果您在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 那是 1|('0,2')|0 1|0|0 这是1。(字符串“0,2”被转换为整数;作为一个数字,它是NaN,但由于NaN是一个浮点概念,当强制为整数时,它会变成0。) 编辑-对于第一个表达式

如果您在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
那是

1|('0,2')|0
1|0|0
这是
1
。(字符串“0,2”被转换为整数;作为一个数字,它是
NaN
,但由于
NaN
是一个浮点概念,当强制为整数时,它会变成
0
。)

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


逗号运算符在许多从C派生表达式语法的语言中很常见(据我所知,C是从其他地方得到的;这几乎不是一个革命性的概念),因为这样的语言允许表达式(只有一个表达式)出现在几个有趣的语法情况中,因为表达式可能(而且经常)有副作用,所以有时可以方便地将多个单独的表达式塞进语言只需要一个表达式的地方。也就是说,通常有更干净、更好的方法来做事情。在JavaScript中,我个人更喜欢使用立即调用的函数。它更多的是类型化,出于性能方面的原因,可能有点糟糕,但我认为它更干净,因为它为临时变量和更复杂的逻辑提供了一个隔离的名称空间。

二进制位运算符(包括
)的绑定没有加法运算符
+
那么紧密。因此

1|0+','+2|0
真是

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

1|('0,2')|0
1|0|0
那是

1|('0,2')|0
1|0|0
这是
1
。(字符串“0,2”被转换为整数;作为一个数字,它是
NaN
,但由于
NaN
是一个浮点概念,当强制为整数时,它会变成
0
。)

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

逗号运算符在许多从C派生表达式语法的语言中很常见(据我所知,C是从其他地方得到的;这几乎不是一个革命性的概念),因为这样的语言允许表达式(只有一个表达式)出现在几个有趣的语法情况中,因为表达式可能(而且经常)有副作用,所以有时可以方便地将多个单独的表达式塞进语言只需要一个表达式的地方。也就是说,通常有更干净、更好的方法来做事情。在JavaScript中,我个人更喜欢使用立即调用的函数。它的类型更多,出于性能方面的原因可能更差,但我认为它更干净,因为它允许为临时变量和更复杂的逻辑提供一个独立的名称空间。

您需要查看一个实例来理解这一点

表达式
1 | 0,2 | 0
的优先级为位或高于逗号运算符,因此它相当于
(1 | 0)、(2 | 0)
。计算两个操作数的值并返回第二个操作数,因此得到
(2 | 0)
。该值为
2

表达式
1 | 0+,'+2 | 0
的加法优先级高于按位or,因此它相当于
1 |(0+,'+2)| 0
0+,“+2
的结果是“0,2”,这不是数值运算,因此在数值运算中计算为
NaN
。它被按位or强制设置为
0
,这样剩下
1 | 0 | 0
,结果是1。

您需要查看一个实例来理解这一点

表达式
1 | 0,2 | 0
的优先级为位或高于逗号运算符,因此它相当于
(1 | 0)、(2 | 0)
。计算两个操作数的值并返回第二个操作数,因此得到
(2 | 0)
。该值为
2

表达式
1 | 0+,'+2 | 0
的加法优先级高于按位or,因此它相当于
1 |(0+,'+2)| 0
0+,“+2
的结果是“0,2”,这不是数值运算,因此在数值运算中计算为
NaN
。它被强制按位或设置为
0
,这样剩下
1 | 0 | 0
,结果是1。

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

因此,在
1 | 0,2 | 0
中,首先从左到右计算两个表达式
1 | 0
2 | 0
,然后返回最后一个表达式(
2 | 0
)的结果
1 | 0==1
2 | 0==2
,因此最后一个表达式的结果是
2
,并返回该结果

1 | 0+'中+