~~和Math.floor()之间的区别

Afs*_*ani 3 javascript math performance floor

正如我在示例中看到的,if ~~和的功能Math.floor相同。他们俩都向下舍入一个数字(我认为正确吗?)

我还要提一下,根据此测试,~~它比Math.floorjsperf.com/math-round-vs更快

所以我想知道~~和之间有什么区别Math.floor吗?

Dav*_*ing 9

是的,按位运算符通常不能很好地处理负数。外汇:

~~-6.8 == -6 // doesn’t round down, simply removes the decimals

Math.floor(-6.8) == -7
Run Code Online (Sandbox Code Playgroud)

而且您也得到0而不是NaN,例如:

~~'a' == 0

Math.floor('a') == NaN
Run Code Online (Sandbox Code Playgroud)


a--*_*--m 5

除了大卫的回答:

我注意到 JavaScript 中的按位运算的一件事是它可以方便地处理较小的值,但并不总是适用于较大的值。出现这种情况的原因是,按位运算符仅适用于可以完全以 32 位有符号格式表示的操作数。换句话说,使用按位运算只会产生 -2147483648 (-231) 到 2147483647 (231 – 1) 范围内的数字。此外,如果使用的操作数之一在该范围之外,则将使用数字的最后 32 位而不是指定的数字。

使用 Date 时很容易发现此限制,假设您对毫秒值进行四舍五入:

Math.floor(1559125440000.6) // 1559125440000
~~1559125440000.6           // 52311552
Run Code Online (Sandbox Code Playgroud)