为什么在JavaScript中1|0,2|0等于2
Why does 1|0,2|0 equal 2 in 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
即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)|0
。0+','+2
的结果是"0,2",这不是数值,因此在数值运算中它的求值为NaN
。它被强制为按位或的0
,因此留下1|0|0
,其结果为1。
来自MDN:
逗号运算符计算其两个操作数(从左到右)并返回第二操作数的值。
因此,在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
(数字+字符串=字符串串联)( 1 | '0,2' ) | 0
(字符串+数字=字符串串联)( 1 | NaN ) | 0
(位OR需要数字操作数。0,2
转换失败,改为NaN
)1 | 0
(逐位OR仅处理整数,因此浮点NaN
被强制转换为0
)1
- javascript中的脚本等于php中的$_SERVER['REQUEST_URI']
- Javascript使变量等于自身加上自身
- Javascript平等三重等于,但是大于和小于呢?
- Javascript检查表单的当前数据是否等于其原始数据
- JavaScript:检查变量是否等于两个或多个值之一的简单方法
- 为什么我的 React getDOMNode().textContent JavaScript 字符串不等于字符串
- JavaScript 变量等于 iframe
- Javascript在引用函数到变量时等于这个
- 使用Javascript设置带有子节点的父节点的类's文本等于.
- 如何将类方法设置为等于多个函数?-Javascript
- 为什么这个值等于'未定义'?(javascript)
- 访问等于 javascript 中特定值的 JSON 属性
- 使php变量等于javascript输出
- 如何测试水平鼠标位置是否等于Javascript中的一个变量
- 制作'这'等于Javascript函数分配中的调用方
- 如果某个值大于或等于javascript中的某个值,想要改变它的值
- 将一个HTML字符串设置为等于javascript中的一个变量
- 是一个空数组,严格等于JavaScript中的任何值
- 如何将复选框值设置为等于Javascript对象
- innerHTML 字符串不等于 javascript 中的相同字符串