# 你没用过的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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
使用^判断符号是否相同
!(4 ^ 4)
!(4 ^ 5)
1
2
3
2
3
# 非位(~)
“~”运算符(位非)用于对一个二进制操作数逐位进行取反操作。
- 第 1 步:把运算数转换为 32 位的二进制整数。
- 第 2 步:逐位进行取反操作。
- 第 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
2
# 右移(>>)
# (>>>)
# 非 !
使用 !! 将数字转为布尔值
console.log(!!7); // true
console.log(!!0); // false
console.log(!!-1); // true
console.log(!!0.71); // true
1
2
3
4
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
2
3
4
5
6
# toString(16)
使用toString(16)取随机字符串
Math.random().toString(16).substring(2, 15);
1
2
3
2
3
# link()
使用.link() 创建链接
let b = 'google'.link('www.google.com');
1
# 1/0
1/0 Infinity
1