1

如果你1|0,2|0用 JavaScript 计算,你会得到2.

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

我无法理解这一点。

4

3 回答 3

11

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

1|0+','+2|0

是真的

1|(0+','+2)|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 中,我个人更喜欢使用立即调用的函数。出于性能原因,它的类型更多并且可能更糟,但我认为它更干净,因为它允许为临时变量和更多涉及的逻辑提供隔离的命名空间。

于 2013-07-16T16:08:26.400 回答
4

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

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

该表达式1|0+','+2|0的加法优先级高于按位或,因此它等价于1|(0+','+2)|0. 的结果0+','+2是“0,2”,它不是数字,因此它NaN在数值运算中计算为。它被强制0按位或,所以离开1|0|0,结果是 1。

于 2013-07-16T16:11:03.530 回答
0

来自 MDN

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

因此,在 中,首先从左到右对1|0,2|0两个表达式1|0进行求值,然后返回最后一个表达式 ( ) 的结果。和,所以最后一个表达式的结果是并且返回。2|02|01|0 === 12|0 === 22

在中,逗号出现在与and1|0+','+2|0连接的字符串文字中。整体评价如下:02

  1. ( 1 | ( (0+',')+2 ) ) | 0
  2. ( 1 | ( '0,'+2 ) ) ) | 0(数字 + 字符串 = 字符串连接)
  3. ( 1 | '0,2' ) | 0(字符串 + 数字 = 字符串连接)
  4. ( 1 | NaN ) | 0(按位或需要数字操作数。0,2转换失败,改为给出NaN
  5. 1 | 0(按位或只处理整数,所以浮点数NaN被强制转换为0
  6. 1
于 2013-07-16T16:15:12.203 回答