我最近发现了除Math.floor(n)
以外的JavaScript中删除数值的小数部分的其他方法,特别是双位NOT运算符~~n
并执行按位或0 {{1 }}
我想知道这些方法之间的区别,以及推荐一种方法与另一种方法的不同情况。
答案 0 :(得分:6)
向下一位查看您的代码的人清楚并使用Math.floor()
。
The performance gain of 1%-40%并不值得,所以不要让代码混乱,难以维护。
答案 1 :(得分:5)
所有位运算符的操作数都转换为带符号的32位整数:
Math.floor(2147483648) // 2147483648
2147483648 | 0 // 2147483648
~~2147483648 // 2147483648
Math.floor(2147483649) // 2147483649
2147483649 | 0 // -2147483647
~~2147483649 // -2147483647
所以使用Math.floor();
答案 2 :(得分:2)
(我完全同意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
快乐的编码。