JS位移运算
-
1、<< 左移
-
2、>>>无符号右移
-
3、>>有符号位移
“<<”运算符
运行原理:“<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。
console.log(5 << 2); //20
“>>”运算符
运行原理:“>>”运算符执行有符号右移位运算。与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。
conosle.log(1000>>8); //3
-
console.log(-1000 >> 8) //-4
“>>>”运算符
运行原理:“>>>”运算符执行五符号右移位运算。它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。
console.log(1000 >> 8); //返回值3 console.log(1000 >>> 8); //返回值3
console.log(-1000 >> 8); //返回值 -4 console.log(-1000 >>> 8); //返回值 16777212
JS交换两个不同值的几种方式
一、开辟一个临时空间
底层原理:声明多一个临时变量tmp
,进行数据交换过程中的缓存
-
优点:直观,易懂
-
缺点:会增加内存的使用
var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp;
二、算术运算
底层原理:通过算术运算过程中的技巧,可以巧妙地将两个值进行互换
缺点:存在溢出的问题
注意:JavaScript能存储数字的精度范围是-2^53到2^53,加法会存在溢出的问题
var a = 1, b = 2; a = a + b; // a = 3, b = 2 b = a - b; // a = 3, b = 1 a = a - b; // a = 2, b = 1
三、异或运算
底层原理:利用 a ^ b ^ b == a
的特点,进行数值交换,避免了使用算术运算带来的弊端,不会发生溢出问题。
-
优点:不会内存溢出
var a = 1, // 二进制:0001 b = 2; // 二进制:0010 a = a ^ b; // 计算结果:a = 0011, b = 0010 b = a ^ b; // 计算结果:a = 0011, b = 0001 a = a ^ b; // 计算结果:a = 0010, b = 0001
四、ES6解构
底层原理:用解构的语法特性,一次性解决,简单暴力
-
优点:解构语法还适用于其他类型的变量进行互换。所以,用解构可以很easy地进行互换。
let a = 1, b = 2; [a, b] = [b, a];
五、利用数组特性进行交换
var a = 1, b = 2; a = [a, b]; b = a[0]; a = a[1];
六、运用对象
a = {a:1,b:2}; b = a.a; a = a.b;
七、JS解构
[a,b] = [b,a];