`Math.trunc` vs` | 0` vs` << 0` vs` >> 0` vs`&-1` vs` ^ 0`

Ori*_*iol 6 javascript math bit-manipulation truncated

我刚刚发现在ES6中有一种新的数学方法:Math.trunc.

我已经在MDN文章中阅读了它的描述,听起来像是在使用|0.

此外,<<0,>>0,&-1,^0也做类似的事情(感谢@kojiro&@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
Run Code Online (Sandbox Code Playgroud)

Gro*_*alo 4

Math.trunc(Math.pow(2,31))对比怎么样Math.pow(2,31) | 0

对有符号 32 位整数执行按位运算。因此,当您执行 Math.pow(2, 31) 时,您会得到以“10000000000000000000000000000000”为单位的表示形式。因为这个数字必须转换为带符号的 32 位形式,所以现在符号位位置有一个 1。这意味着我们正在查看带符号的 32 位形式的 -eve 数字。然后,当我们与 0 进行按位或运算时,我们会得到带符号的 32 位形式的相同结果。十进制为-2147483648。

旁注:在带符号的 32 位形式中,可以用二进制表示的小数范围为 [10000000000000000000000000000000, 01111111111111111111111111111111]。以十进制(基数 10)表示,此范围为 [-2147483648, 2147483647]。

  • 按位运算对*有符号* 32 位整数执行。因此,当您执行 Math.pow(2, 31) 时,您会得到以“10000000000000000000000000000000”为单位的表示形式。因为这个数字必须转换为带符号的 32 位形式,所以现在符号位位置有一个 1。这意味着我们正在查看带符号的 32 位形式的 -eve 数字。然后,当我们与 0 进行按位或运算时,我们会得到带符号的 32 位形式的相同结果。十进制为-2147483648。 (2认同)