JavaScript 中的楼层数字:~~n、n|0 或 Math.floor(n)

Flooring numbers in JavaScript: ~~n, n|0 or Math.floor(n)?

本文关键字:Math floor JavaScript 数字      更新时间:2023-09-26

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

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

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

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

所以使用 Math.floor();

下一个查看您的代码并使用 Math.floor() 的人要清楚。

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

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

以下是对其他按位方法的说明:

按位运算符

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

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

尝试n为负数或 [-231, 231-1] 以外的值:

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

快乐编码。