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

I'm seeing this in some code, and I have no idea what it does:

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

What's the ~~ operator do?

ItachiEva2020/03/12 15:42:15
~(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 )

有关更多信息,请参见:

逆天西里2020/03/12 15:42:15

区别很简单:

长版

如果要提高可读性,请使用Math.floor但是,如果要将其最小化,请使用tilde ~~

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

精简版

~~较短/占用较少的空间。Math.floor提高了可读性。有时波浪号会更快,有时Math.floor会更快,但并不引人注意。

蛋蛋Itachi2020/03/12 15:42:15

它隐藏了代码的意图。

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

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

2011-08更新:

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

另请:波浪线与地板

阿飞神无2020/03/12 15:42:15

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

用作的更快替代品Math.floor()