我刚刚发现在ES6中有一种新的数学方法:Math.trunc
。
我已在MDN article中阅读了其说明,听起来像使用|0
。
此外,<<0
,>>0
,&-1
,^0
也做类似的事情(感谢@kojiro&amp; @Bergi)。
经过一些测试,似乎唯一的区别是:
Math.trunc
返回-0
,其中包含间隔(-1,-0]
中的数字。按位运算符返回0
。Math.trunc
以非数字返回NaN
。按位运算符返回0
。是否存在更多差异(所有这些差异)?
n | Math.trunc | Bitwise operators
----------------------------------------
42.84 | 42 | 42
13.37 | 13 | 13
0.123 | 0 | 0
0 | 0 | 0
-0 | -0 | 0
-0.123 | -0 | 0
-42.84 | -42 | -42
NaN | NaN | 0
"foo" | NaN | 0
void(0)| NaN | 0
答案 0 :(得分:4)
Math.trunc(Math.pow(2,31))
与Math.pow(2,31) | 0
对带符号的32位整数执行按位运算。因此,当您执行Math.pow(2,31)时,您可以使用位“10000000000000000000000000000000”获得此表示形式。由于此数字必须转换为带符号的32位格式,因此我们现在在符号位位置有1。这意味着我们正在以带符号的32位形式查看-eve数字。然后当我们用0进行按位OR时,我们以带符号的32位形式得到相同的东西。小数点是-2147483648。
旁注: 在带符号的32位格式中,可以用二进制表示的小数范围是[10000000000000000000000000000000,01111111111111111111111111111111]。在十进制(基数10)中,此范围为[-2147483648,2147483647]。
答案 1 :(得分:1)
在许多使用按位运算符的编程语言中,尝试对非整数执行按位运算是类型错误:
>>> # Python
>>> 1 << 0; 1.2 << 0
1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'
In ECMA-262,Number是双精度64位二进制格式IEEE 754.换句话说,JavaScript中没有整数。只要您处理的值适合-(Math.pow(2,32))
和Math.pow(2,31)
,则按位运算是截断浮点值的快速方法。所有不同的按位运算都做不同的事情,但在这里的每个例子中,它们基本上都在进行身份操作。在执行其他任何部分之前,关键的区别在于JavaScript does a ToInt32
operation。
i | 0 // For each bit that is 1, return 1|0. For each bit that is 0, return 0|0.
i ^ 0 // xor, but effectively same as previous.
i << 0 // Shift the value left zero bits.
i >> 0 // Shift the value right zero bits.
i & -1 // Identity mask
~~i // Not not - I had forgotten this one above.