我最近发现了一些其他方法来删除 JavaScript 中数值的小数部分,而不是Math.floor(n)
,特别是双位 NOT 运算符~~n
并执行位或 0 n|0
。
我想知道这些方法之间有什么区别,以及推荐一种方法而不是另一种方法的不同场景是什么。
我最近发现了一些其他方法来删除 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
或)充当对转换后的值“不做任何事情”的恒等函数:也就是说,所有这些方法都依赖于应用于按位操作数的相同转换。~~n
n|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
快乐编码。