一些’奇技淫巧’




  • 将一个小数与0进行二进制或运算,等同于对该数去除小数部分,即取整数位
1
2
b = -2.9 | 0;
console.log(b);

结果为-2


  • 对一个整数连续两次二进制否运算,得到它自身。对一个小数连续进行两次二进制否运算,也能达到取整效果(使用二进制否运算取整,是所有取整方法中最快的一种。)
1
2
3
4
c = ~~-7;
console.log(c);
d = ~~-3.14;
console.log(d);

结果为-7,-3


  • “异或运算”有一个特殊运用,连续对两个数x和y进行三次异或运算,x^=y; y^=x; x^=y;,可以互换它们的值。这意味着,使用“异或运算”可以在不引入临时变量的前提下,互换两个变量的值。(这是Js里互换两个变量的值最快的方法。)
1
2
3
4
5
6
7
8
x = 10;
y = 99;

x ^= y;
y ^= x;
x ^= y;

console.log(x,y);

结果为99,10

异或运算也可以用来取整

1
2
f = 12.9 ^ 0;
console.log(f);

结果为12


  • 左移运算符(<<)表示将一个数的二进制值向左移动指定的位数,尾部补0,最后的结果(统一转换为十进制来表示),等于其十进制数乘以2的指定次方
  • 右移运算符(>>)表示将一个数的二进制值向右移动指定的位数。如果是正数,头部全部补0;如果是负数,头部全部补1。右移运算符基本上相当于除以2的指定次方(最高位即符号位参与移动)。
  • 头部补零的右移运算符(>>>)与右移运算符(>>)只有一个差别,就是一个数的二进制形式向右移动时,头部一律补零,而不考虑符号位。所以,该运算总是得到正值。对于正数,该运算的结果与右移运算符(>>)完全一致,区别主要在于负数。

一些’坑’
  • ‘5’ + ‘1’ 结果为6
  • ‘5’ + 1 结果为’51’,而不是6;
  • ‘5’ + true为’5true’而不是6



  • true - 1为0
  • ‘5’ * []为0
  • null + 1为1
  • undefined + 1 为NaN