>>和<<都是位运算符,对二进制数进行移位操作:
// <<是左移,是将10的二进制左移5位,相当于原数10*2*2*2*2*2,故结果是320
console.log(10 << 5);
// <<是左移,是将12的二进制左移2位,相当于原数12*2*2,故结果是48
console.log(12 << 2);
//>>是右移,右移一位相当于除以2,4/2,故结果为2,如果>>右边不满足条件,结果为0
console.log(4 >> 1);
??双问号,空值合并运算符以及||,两者的区别:
//只要??前面不为null或undefined就取前面的值,否则就取后面的值
console.log(1 ?? 2);//1
console.log(12 ?? 3);//12
console.log(null ?? 2);//2
console.log(undefined ?? 13);//13
//0和""在||里被认为false,执行符号后面的结果,null和undefined也是执行后面的结果
console.log(0 || 2);//2
console.log("" || 3);//3
console.log(null || 4);//4
console.log(undefined || 5);//5
//在??里却执行前面的,这是??和||的区别
console.log("" ?? 3);//""
console.log(0 ?? 4);//0
?.可选链操作符:
const obj = { a: { b: [{ name: "张三" }] } }
// 原始写法
console.log(obj && obj.a && obj.a.b && obj.a.b[0].name);//张三
//可选连写法
console.log(obj?.a?.b[0]?.name);//张三
^异或符的使用:
console.log(10 ^ 3);//9
console.log(1 ^ 2);//3
console.log(12 ^ 6);//10
console.log(6 ^ 3);//5
console.log(32 ^ 16);//48
//两二进制上下比较只有位不相等时才取1,否则取零
//14 二进制1110
//15 二进制1111
//^与后的结果 0001=>结果是1
console.log(14 ^ 15);//1
//相同的数异或为0:n^n=>0
console.log(3 ^ 3);//0
console.log(10 ^ 10);//0
console.log(100 ^ 100);//0
//交换律:a^b^c <=> a^c^b
console.log(2 ^ 3 ^ 2 ^ 4 ^ 4);//2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^3 => 3
//任何数为0异或任何数:0^n=>n
console.log(0 ^ 6);//6
console.log(120 ^ 0);//120