JavaScript中的“双波浪”(~~)运算符是什么?

What is the “double tilde” (~~) operator in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
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;
};

~~操作员是做什么的?


~~是一个双非位运算符。

它被用作Math.floor()的快速替代品。


它隐藏了代码的意图。

它是两个单颚化符运算符,因此它执行两次按位补码(按位非)。这些操作相互抵消,所以唯一剩下的效果是在应用第一个运算符之前完成的转换,即将值转换为整数。

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

更新2011-08:

随着浏览器中javascript引擎的优化,操作人员和函数的性能会发生变化。在当前的浏览器中,在某些浏览器中使用~~而不是Math.floor的速度要快一些,在某些浏览器中根本不快。如果您真的需要额外的性能,您需要为每个浏览器编写不同的优化代码。

参见:Tilde vs Floor


1
2
3
4
~(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 )

有关详细信息,请参阅:

  • http://dreaminginjavascript.wordpress.com/2008/07/04/28/


区别很简单:

长版

如果您希望具有更好的可读性,请使用Math.floor。但如果你想把它最小化,可以使用tilde ~~

互联网上有很多消息称Math.floor更快,但有时~~。我不建议您考虑速度,因为在运行代码时不会注意到它。也许在测试等方面,但没有人能在这里看到不同之处。更快的方法是使用~~以更快的加载时间。

短版

~~较短/占用空间较小。Math.floor提高了可读性。有时蒂尔德更快,有时Math.floor更快,但不明显。