1、与运算符&
表达式1 & 表达式2
均转为二进制数据,同1取1,其他取0
如:2 & 2 ,结果是2
实际使用场景:
(1)可判断奇偶
var a = 1
var b = 2
a & 1 === 0 ? console.log('a是偶数') : ('a是奇数')
b & 1 === 0 ? console.log('b是偶数') : ('b是奇数')
(2)判断n是否为2的整数幂
var n = 64
if((n & (n - 1)) === 0) {
console.log('n是2的整数幂')
}
2、或运算符|
表达式1 | 表达式2
均转为二进制数据,同0取0,其他取1
如:2 | 1 ,结果是3
实际使用场景:
正数:使用 A + 0.5 | 0 来替代 Math.round()
负数:使用 A - 0.5 | 0 来替代 Math.round()
var a1 = 1.32
var a2 = 3
var a3 = 4.8
console.log(Math.floor(a1) === (a1 + 0.5 | 0)) // true
console.log(a1 + 0.5 | 0) // 1
console.log(a2 + 0.5 | 0) // 3
console.log(a3 + 0.5 | 0) // 5
3、非运算符~
~表达式
转为二进制数据,0取1,1取0
如: ~2 ,结果是-3
计算公式(取反,减1):~a = -a - 1
实际使用场景:待挖掘
4、异或运算符^
表达式1 ^ 表达式2
均转为二进制数据,不同为1,同为0
如:2 ^ 1,结果为3
实际使用场景:
(1)交换变量(个人感觉,不实用,建议使用es6的结构方法,更简单)
var a = 1
var b = 2
a = a ^ b
b = a ^ b
a = a ^ b
console.log(a, b)
// es6结构方法,交换变量
var aa = 1
var bb = 2
[aa, bb] = [bb, aa]
(2)切换变量0、1
var toggle = 0
// if判断
if (toggle) {
toggle = 0
} else {
toggle = 1
}
// 三元运算符
toggle = toggle ? 0 : 1
// 异或运算符
toggle ^= 1
(3)检查数字是否相等
var a = 2
var b = 3
// if判断
if (a !== b) {
console.log('a、b不相等')
}
// 异或运算符
if (a ^ b) {
console.log('a、b不相等')
}
5、左位移<<
表达式 << 位数
转为二进制数据,向左移动n位
计算公式:a << n = a * (2 ^ n)
实际使用场景:待挖掘
6、右位移>>
表达式 >> 位数
转为二进制数据,向右移动n位
计算公式:a >> n = a / (2 ^ n)
实际使用场景:待挖掘
7、全右位移>>>
表达式 >>> 位数
转为二进制数据,向右移动n位,符号位也会跟着移动
实际使用场景:进制转换,如 十进制和二进制之间的转换
// 十进制转为二进制
function tenToTwo(value) {
return (value >>> 0).toString(2)
}
// 二进制转为十进制
function twoToTen(value) {
return parseInt(value, 2).toString(10)
}
console.log(tenToTwo(8)) // '1000'
console.log(twoToTen(1101)) // '13'
8、其他
(1)使用Array来重复字符
var str = Array(10).join('2') // '2222222222'
// es6的写法
var str1 = '2'.repeat(10)
(2)写void 0会比undefined快
var a = void 0
console.log(a) // undefined
(3)写Array.length = 0 可清空数组
(4)写Array.slice(0)可浅拷贝数组