什么是JavaScript中的“double tilde”(~~)运算符?

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

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; }; 

运算符是什么?

~~是一个双重NOT运算符。

它被用作Math.floor()一个更快的替代品 。

它隐藏了代码的意图。

这是两个单一的代字符运算符,所以它按位补(不按位)两次。 这些操作相互取消,所以剩下的唯一效果就是在应用第一个运算符之前完成的转换,即将该值转换为整数。

有些人使用它作为Math.floor一个更快的select,但速度差异并不那么显着,在大多数情况下,它只是微观优化。 除非你有一段真正需要优化的代码,否则应该使用描述它的代码,而不是使用非操作副作用的代码。

2011-08更新:

通过优化浏览器中的JavaScript引擎,操作员和function的性能发生了变化。 使用当前的浏览器,在某些浏览器中使用~~而不是Math.floor的速度要快一些,而在某些浏览器中的速度则不会更快。 如果您真的需要额外的性能,您需要为每个浏览器编写不同的优化代码。

请参阅: 波浪与地面

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

有关更多信息,请参阅:

差异很简单:

长版

如果你想有更好的可读性,使用Math.floor 。 但是如果你想尽量减less它,使用波浪线~~

互联网上有很多来源说Math.floor更快,但有时~~ 。 我不build议你考虑速度,因为在运行代码时不会被注意到。 也许在testing等,但没有人能看到这里的差异。 更快的是使用~~更快的加载时间。

短版

~~更短/占用更less的空间。 Math.floor提高了可读性。 有时候代字符比较快,有时Math.floor速度更快,但是并不明显。