4

我最近发现了一些其他方法来删除 JavaScript 中数值的小数部分,而不是Math.floor(n),特别是双位 NOT 运算符~~n并执行位或 0 n|0

我想知道这些方法之间有什么区别,以及推荐一种方法而不是另一种方法的不同场景是什么。

4

3 回答 3

7

所有位运算符的操作数都转换为有符号的 32 位整数:

Math.floor(2147483648) // 2147483648
2147483648 | 0         // 2147483648
~~2147483648           // 2147483648

Math.floor(2147483649) // 2147483649
2147483649 | 0         // -2147483647
~~2147483649           // -2147483647

所以使用 Math.floor();

于 2012-06-05T01:39:57.917 回答
6

让下一个查看您的代码并使用Math.floor().

1%-40% 的性能提升并不值得,所以不要让你的代码混乱和难以维护。

于 2012-06-05T01:31:44.363 回答
2

(我完全同意 josh 的回答:赞成清晰的可维护代码。)

以下是对其他按位方法的解释:

位运算符之所以有效,是因为它们仅对32 位(有符号)整数进行运算符,但 JavaScript 中的数字都是 IEEE-754 值。因此,按位运算符的操作数会发生内部转换(截断,而不是下限!)。

然后,应用的按位运算(例如n<<0或)充当对转换后的值“不做任何事情”的恒等函数:也就是说,所有这些方法都依赖于应用于按位操作数的相同转换。~~nn|0

尝试n作为负数或 [-2 31 , 2 31 -1] 之外的值:

(-1.23|0)            // -1
Math.floor(-1.23)    // -2

var x = Math.pow(2, 40) + .5
x|0                  // 0
Math.floor(x)        // 1099511627776

快乐编码。

于 2012-06-05T01:39:38.180 回答