JavaScript 中的“双波浪号”(~~) 运算符是什么?
What is the "double tilde" (~~) operator in 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;
};
~~
操作员是做什么的?
该~~
是一个双按位 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
更快,但并不明显。
- 这是什么 ==- javascript 运算符
- 这是什么??!Javascript中的运算符
- 在Javascript中,变量前面的+运算符是什么
- JavaScript中的%运算符是什么
- 使用扩展运算符和析构函数运算符修改不可变对象的最短方法是什么
- JavaScript 中加号运算符的域是什么?
- JavaScript - 这些值赋值(使用 |= 作为运算符)是什么意思
- 在 JavaScript 中,条件语句中 OR 运算符的正确语法是什么?我错过了什么
- 在 Javascript 中模拟“IN”运算符以简化冗余逻辑 OR 的最佳解决方案是什么?
- Node.js:在模块作用域中使用“this”运算符的上下文是什么
- JavaScript 中的 '/=' 运算符是什么意思?
- 使用 === 运算符测试未定义而不是使用 == 运算符有什么好处
- Javascript中添加的最新运算符是什么?
- 原因是什么?运算符或使用字符串
- 这个运算符是什么意思<<=&”;
- 在本例中使用new运算符的目的是什么
- 这个运算符是什么:&=
- “铸造”的目的是什么?布尔运算符的返回值
- JS中布尔运算符的优先顺序是什么?
- JavaScript 中的“双波浪号”(~~) 运算符是什么?