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

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()相同的结果,因为它只是去掉了小数后面的部分(有关示例,请参阅其他答案)。


~(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 )

更多信息,请参见:

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


它隐藏了代码的意图。

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

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

更新2011 - 08:

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

看:波浪线vs地板


区别很简单:

长版本

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

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

短的版本

~~更短/占用空间更少。数学。地板提高了可读性。有时波浪法更快,有时数学更快。地板更快,但不明显。