# 你没用过的JS

# 位与(&)

对应位数的值都是1才是1

12 & 5 = 4

0000 0000 0000 0000 0000 0000 0000 1100 // 12

0000 0000 0000 0000 0000 0000 0000 0101 // 5

0000 0000 0000 0000 0000 0000 0000 0100 //4

使用 & 判断奇偶性

偶数 & 1 = 0
奇数 & 1 = 1

console.log(7 & 1);    // 1
console.log(8 & 1) ;   // 0
1
2
3
4
5

# 位或(|)

对应位数的值只要是1就是1

0000 0000 0000 0000 0000 0000 0000 1100 // 12

0000 0000 0000 0000 0000 0000 0000 0101 // 5

0000 0000 0000 0000 0000 0000 0000 1101 // 13

# 位异或(^)

对应位数只要是相同就返回0,如果数位是不同的则返回 1:

0000 0000 0000 0000 0000 0000 0000 1100 // 12

0000 0000 0000 0000 0000 0000 0000 0101 // 5

0000 0000 0000 0000 0000 0000 0000 1001 // 9

使用 ^ 切换变量 0 或 1

 var toggle = 1

 toggle ^=0
1
2
3

使用^来完成值交换

 // --- before ---
 var a = 7
 var b = 1
 var temp = a; a = b; b = temp; // 传统,但需要借助临时变量
 b = [a, a = b][0] // 借助数组

 // --- after ---

 a ^= b
 b ^= a
 a ^= b
 console.log(a)   // 1
 console.log(b)   // 7

 [a, b] = [b, a]; // ES6,解构赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

使用^判断符号是否相同

!(4 ^ 4)
!(4 ^ 5)

1
2
3

# 非位(~)

“~”运算符(位非)用于对一个二进制操作数逐位进行取反操作。

  1. 第 1 步:把运算数转换为 32 位的二进制整数。
  2. 第 2 步:逐位进行取反操作。
  3. 第 3 步:把二进制反码转换为十进制浮点数。
 ~ 12 === -13
1

# 左移运算符 <<

使用左移运算符 << 迅速得出2的次方

1<<24 就是表示1左移24位 ,二进制表示为 1 0000 0000 0000 0000 0000 0000 ,转换为10进制则是 1 * 2^24 + 0 * 2^23 + 0 * 2^22 +... +0 * 2^0 = 16777216

1 << 2  // 4, 即 2的2次方 二进制 100 = 1 * 2^2 + 0 * 2^1 + 0 *2^0
1 << 4 // 16, 即 2的4次方 二进制 10000 = 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0
1
2

# 右移(>>)

# (>>>)

# 非 !

使用 !! 将数字转为布尔值

console.log(!!7);       // true
console.log(!!0);       // false
console.log(!!-1);      // true
console.log(!!0.71);    // true
1
2
3
4

# 使用~、>>、<<、>>>、|来向下取整

console.log(~~11.71)     // 11
console.log(11.71 >> 0)  // 11
console.log(11.71 << 0)  // 11
console.log(11.71 | 0)   // 11
console.log(11.71 >>> 0) // 11
>>> 不可用于负数
1
2
3
4
5
6

# toString(16)

使用toString(16)取随机字符串


Math.random().toString(16).substring(2, 15);

1
2
3

使用.link() 创建链接

let b = 'google'.link('www.google.com');
1

# 1/0

1/0 Infinity
1

# 参考

JavaScript 位运算符 (opens new window)