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

2022-08-29 22:38:09

我在一些代码中看到了这一点,我不知道它有什么作用:

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

操作员是做什么的?~~


答案 1

这是一个双不按位运算符。~~

它被用作Math.floor()的更快替代品。它不会返回与负数相同的结果,因为它只是切掉小数点后的部分(有关此示例,请参阅其他答案)。Math.floor()


答案 2

它隐藏了代码的意图。

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

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

2011-08年更新:

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

请参见: 波浪号与地板