|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2020-2-4 20:59 编辑
JavaScript 中最臭名昭著的 Bug 就是:
因为精度的问题,导致所有的浮点运算都是不安全的。
有一种观点不要在 JS 中使用位运算:
Javascript 完全套用了 Java 的位运算符,包括按位与 &、按位或 |、按位异或 ^、按位非 ~、左移 <<、带符号的右移 >> 和用 0 补足的右移>>>。
这套运算符针对的是整数,所以对 JavaScript 完全无用,因为 JavaScript 内部,所有数字都保存为双精度浮点数。
如果使用它们的话,JavaScript 不得不将运算数先转为整数,然后再进行运算,这样就降低了速度。
而且"按位与运算符"&同"逻辑与运算符"&&,很容易混淆。
个人觉得:
如果对 JS 的运用达到炉火纯青的地步,能避开各种小“坑”的话,偶尔用一下位运算符也无所谓,还能提升运算性能,毕竟直接操作的是计算机最熟悉的二进制。
接下来就是几个很骚的操作。
使用左移运算符 << 迅速得出 2 的次方
2 的 2 次方。
同理:
- 1 << 10 // 1024, 即 2的10次方// 但是要注意使用场景
- a = 2e9; // 2000000000a << 1; // -294967296
复制代码
使用 ^ 切换变量 0 或 1
接下来 3 段语句都是一样滴:
- // --- before ---// if 判断
- if (toggle) { toggle = 0;}
- else { toggle = 1;}
- // 三目运算符
- togle = toggle ? 0 : 1;
- // --- after ---
- toggle ^= 1;
复制代码
使用 & 判断奇偶性
偶数 & 1 = 0
奇数 & 1 = 1
代码:
- console.log(7 & 1); // 1
- console.log(8 & 1) ; // 0
复制代码
使用 !! 将数字转为布尔值
所有非 0 的值都是 true,包括负数、浮点数:
- console.log(!!7); // true
- console.log(!!0); // false
- console.log(!!-1); // true
- console.log(!!0.71); // true
复制代码
使用 ~、>>、<<、>>>、| 来取整
相当于使用了 Math.floor()
- 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
复制代码
注意:
若强行:
- -33.333 >>> 0 //4294967263
复制代码
使用 ^ 来完成值交换
介绍一些高级的用法,在 ES6 的解构赋值出来之前,用这种方式会更快(但必须是整数):
- // --- before ---
- let temp = a; a = b; b = temp; // 传统,但需要借助临时变量
- b = [a, a = b][0] // 借助数组
- // --- after ---
- let a = 7
- let b = 1
- a ^= bb ^= aa ^= b
- console.log(a) // 1
- console.log(b) // 7
- [a, b] = [b, a]; // ES6,解构赋值
复制代码
使用 ^ 判断符号是否相同
这个有点多此一举,还是列出来吧:
- (a ^ b) >= 0; // true 相同; false 不相同
复制代码
说完移位操作,再来介绍一些其他相似的吧。
使用 toString(16) 取随机字符串
- Math.random().toString(16).substring(2, 15);
复制代码
.substring() 的第二个参数控制取多少位 (最多可取 13 位)。
使用当前时间创建一个随机数
- // --- before ---
- let b = 0 | Math.random() * 100
- // --- after ---
- let a;a = new Date % 100; // 两位随机数
- a = new Date % 1000; // 三位随机数
- a = new Date % 10000; // 四位随机数
复制代码
不要在快速循环中使用,因为毫秒可能没有变化。
for 循环条件的简写
- // --- before ---
- for(let i = 0; i < arr.length; i++) {...}
- // --- after ---
- for(let i = arr.length; i--;) {...}
复制代码
注意 i-- 后面的分号别漏了!
最后,来一个彩蛋,如果以后有人喷你的代码,你就可以将此代码发给他。
在控制台输入:
- (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]
复制代码
猜猜结果是什么呢
如果喜欢,别忘了评分 :
这位鱼油,如果喜欢本系列Js帖子,请订阅 专辑☞( 传送门)( 不喜欢更要订阅 )
|
评分
-
查看全部评分
|