如果您在JavaScript中评估1|0,2|0
,则会获得2
。
如果您评估1|0+','+2|0
,则会获得1
。
我无法理解这一点。
答案 0 :(得分:11)
二进制位运算符(包括|
)的绑定比加法运算符+
更紧密。因此
1|0+','+2|0
真的是
1|(0+','+2)|0
是
1|('0,2')|0
是
1|0|0
是1
。 (字符串“0,2”被转换为整数;作为数字它是NaN
,但因为NaN
是一个浮点概念,它变成{{1当被强制为整数时。)
编辑 - 关于涉及JavaScript逗号运算符的第一个表达式0
。逗号运算符允许将单独的,基本上独立的(除了通过副作用)表达式的列表“粘合”到解析器将识别为单个表达式的某些内容中。在计算时,每个表达式将按照通常的方式计算,但整个表达式的值只是列表中最后一个表达式的值。因此,1|0,2|0
首先会导致1|0,2|0
被评估,但结果会被丢弃,整体价值只是1|0
的结果。
逗号运算符对于从C派生表达式语法的许多语言都是通用的。(据我所知,C从其他地方获取它;它几乎不是一个革命性的概念。)因为这样的语言允许表达式 - 只是一个表达式 - 出现在几个有趣的语法情境中,并且因为表达式可以(并且经常会有)副作用,有时候能够将几个单独的表达式塞进一个语言真正只需要一个语言的地方。也就是说,通常有更清洁,更好的方法来做事。在JavaScript中,我个人更喜欢使用立即调用的函数。由于性能原因,它打字更多,可能更糟糕,但我认为它更清晰,因为它允许临时变量和更复杂逻辑的孤立命名空间。
答案 1 :(得分:4)
您需要查看operator precedence table才能理解这一点。
表达式1|0,2|0
具有按位或比逗号运算符更高的优先级,因此它等同于(1|0), (2|0)
。 comma operator评估两个操作数并返回第二个操作数,因此您获得(2|0)
的值。该值为2
。
表达式1|0+','+2|0
的优先级高于按位,或者等于1|(0+','+2)|0
。 0+','+2
的结果是“0,2”,这不是数字,因此它在数值运算中求值为NaN
。它被逐位强制转换为0
,或者离开1|0|0
,结果为1.
答案 2 :(得分:0)
逗号运算符计算其两个操作数(从左到右) 并返回第二个操作数的值。
因此,在1|0,2|0
中,首先从左到右计算两个表达式1|0
和2|0
,然后返回最后一个表达式(2|0
)的结果。 1|0 === 1
和2|0 === 2
,因此最后一个表达式的结果为2
,并且已返回。
在1|0+','+2|0
中,逗号显示在与0
和2
连接的字符串文字中。整个过程评估如下:
( 1 | ( (0+',')+2 ) ) | 0
( 1 | ( '0,'+2 ) ) ) | 0
(number + string = string concatenation)( 1 | '0,2' ) | 0
(字符串+数字=字符串连接)( 1 | NaN ) | 0
(按位OR需要数字操作数。0,2
无法转换,而是改为NaN
1 | 0
(按位OR仅处理整数,因此浮点NaN
会转换为0
)1