双位 NOT(~~)
按位运算符 ~~ 表示否定:
~~something;
按位NOT运算符(~)将获取其操作数,将其转换为 32 位整数,并将反转每个位,例如:
00000000000000000000000000001001
...becomes
11111111111111111111111111110110
如果操作数是一个数字,并且它不是 NaN 或者 Infinity
那么~~具有将其四舍五入为零的效果(Math.ceil表示负数,Math.floor表示正数)。如果它不是数字,那么内部函数会将其转换为零。
以下是双位 NOT 操作的一些示例:
~~null; // => 0
~~undefined; // => 0
~~0; // => 0
~~{}; // => 0
~~[]; // => 0
~~(1/0); // => 0
~~false; // => 0
~~true; // => 1
~~1.2543; // => 1
~~4.9; // => 4
~~(-2.999); // => -2
~~的地板功能(flooring )使其成为更好的选择,如果您知道自己正在处理正数——它速度更快,占用的字符更少。虽然它的可读性不太好,但我希望它能慢慢成为 JS 领域非常知名的技术,这样我们都可以使用它而不必担心受到指责。Math.floor
~~
这对于规范化您期望为整数的参数非常有用。以 MDC 建议提供给不支持的浏览器为例:
/*Array.prototype.indexOf = function...*/
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
/* 在去:~~ */
/*Array.prototype.indexOf = function...*/
var from = ~~arguments[1];