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

时间:2011-05-11 23:18:15

标签: 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;
};

~~运营商做了什么?

4 个答案:

答案 0 :(得分:621)

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

它用作faster substitute for Math.floor()

答案 1 :(得分:153)

它隐藏了代码的意图。

它是两个单个波形符号运算符,因此它按位补码(按位不是)两次。这些操作相互取出,因此唯一剩下的效果是在应用第一个操作符之前完成的转换,即将值转换为整数。

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

更新2011-08:

通过在浏览器中优化JavaScript引擎,运算符和函数的性能会发生变化。对于当前的浏览器,在某些浏览器中使用~~代替Math.floor会更快,而在某些浏览器中则不会更快。如果您确实需要额外的性能,则需要为每个浏览器编写不同的优化代码。

请参阅:tilde vs floor

答案 2 :(得分:115)

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

有关详细信息,请参阅:

答案 3 :(得分:18)

差异非常简单:

长版

如果您想要更好的可读性,请使用Math.floor。但如果您想最小化它,请使用代字号~~

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

简短版

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