6

我刚刚发现在 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
4

2 回答 2

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]。

于 2014-03-03T20:42:29.117 回答
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'

在 ECMA-262中,数字是双精度 64 位二进制格式 IEEE 754。换句话说,JavaScript 中没有整数。只要您正在处理的值适合-(Math.pow(2,32))Math.pow(2,31)然后按位运算就是截断浮点值的快速方法。所有不同的按位运算都做不同的事情,但在这里的每个示例中,它们本质上都是在做一个恒等运算。关键的区别在于JavaScript在执行其他ToInt32操作之前先对值进行操作。

按位恒等运算:

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.
于 2014-03-04T02:53:28.380 回答