什么是“双波浪”;(~~)操作符在JavaScript?

我在一些代码中看到了这一点,我不知道它是做什么的:

var jdn = function(y, m, d) {
var tmp = (m <= 2 ? -1 : 0);
return ~~((1461 * (y + 4800 + tmp)) / 4) +
~~((367 * (m - 2 - 12 * tmp)) / 12) -
~~((3 * ((y + 4900 + tmp) / 100)) / 4) +
d - 2483620;
};

~~操作符是做什么的?

189282 次浏览

~~是一个双NOT位操作符。

它被用作更快代替Math.floor()积极的数字。对于负数,它不会返回与Math.floor()相同的结果,因为它只是去掉了小数后面的部分(有关示例,请参阅其他答案)。

~(5.5)   // => -6
~(-6)    // => 5
~~5.5    // => 5  (same as Math.trunc(5.5) and Math.floor(5.5))
~~(-5.5) // => -5 (same as Math.trunc(-5.5) but NOT the same as Math.floor(-5.5), which would give -6 )

更多信息,请参见:

它隐藏了代码的意图。

它是两个波浪号操作符,所以它按位补(不按位补)两次。这些操作相互抵消,因此唯一剩下的影响是在应用第一个操作符之前完成的转换,即将值转换为整数。

有些人使用它作为Math.floor的更快替代品,但速度差异并不是那么显著,在大多数情况下,这只是微观优化。除非有一段代码确实需要优化,否则应该使用描述其功能的代码,而不是使用非操作副作用的代码。

更新2011 - 08:

随着浏览器中JavaScript引擎的优化,操作符和函数的性能发生了变化。在当前的浏览器中,使用~~而不是Math.floor在某些浏览器中会稍微快一些,而在某些浏览器中则一点也不快。如果你真的需要额外的性能,你需要为每个浏览器编写不同的优化代码。

看到:# EYZ0

区别很简单:

长版本

如果你想要更好的可读性,使用Math.floor。但如果你想最小化它,使用波浪号~~

互联网上有很多来源说Math.floor更快,但有时~~更快。我不建议您考虑速度,因为在运行代码时它不会被注意到。也许在测试等中,但没有人能在这里看到区别。更快的方法是使用~~来获得更快的加载时间。

短的版本

~~更短/占用更少的空间。Math.floor提高了可读性。有时波浪号更快,有时Math.floor号更快,但并不明显。