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

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

本文关键字:运算符 是什么 双波浪号 中的 JavaScript      更新时间:2023-09-26

>我在某些代码中看到了这一点,但我不知道它的作用:

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

它隐藏了代码的意图。

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

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

2011-08 更新:

随着浏览器中 JavaScript 引擎的优化,运算符和函数的性能会发生变化。对于当前的浏览器,在某些浏览器中使用 ~~ 而不是 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/

差异非常简单:

长版本

如果要获得更好的可读性,请使用 Math.floor 。但是,如果要将其最小化,请使用 波浪号 ~~ .

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

短版本

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