鱼C论坛

 找回密码
 立即注册
查看: 1762|回复: 5

[庖丁解牛] 0 2 4 3 ★ 牛X到很骚的 JS 移位操作|【只有魔法才能对抗魔法】

[复制链接]
发表于 2020-1-25 21:09:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2020-2-4 20:59 编辑




                               
登录/注册后可看大图


277a1094eff041c28cb51dec44c29e0f.jpeg


JavaScript 中最臭名昭著的 Bug 就是:
0.1 + 0.2 !== 0.3
因为精度的问题,导致所有的浮点运算都是不安全的。

有一种观点不要在 JS 中使用位运算:

Javascript 完全套用了 Java 的位运算符,包括按位与 &、按位或 |、按位异或 ^、按位非 ~、左移 <<、带符号的右移 >> 和用 0 补足的右移>>>。

这套运算符针对的是整数,所以对 JavaScript 完全无用,因为 JavaScript 内部,所有数字都保存为双精度浮点数。

如果使用它们的话,JavaScript 不得不将运算数先转为整数,然后再进行运算,这样就降低了速度

而且"按位与运算符"&同"逻辑与运算符"&&,很容易混淆。

个人觉得:

如果对 JS 的运用达到炉火纯青的地步,能避开各种小“坑”的话,偶尔用一下位运算符也无所谓,还能提升运算性能,毕竟直接操作的是计算机最熟悉的二进制。


接下来就是几个很骚的操作。


使用左移运算符 << 迅速得出 2 的次方
1 << 2

Snip20200126_32.png


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);

Snip20200126_33.png


.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帖子,请订阅 专辑&#9758;传送门)(不喜欢更要订阅

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +6 收起 理由
LuckyTiger66 + 5 + 5 + 3 鱼C有你更精彩^_^
HoneyAhu + 5 + 5 + 3 无条件支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-25 21:14:01 | 显示全部楼层
哇塞,好骚好喜欢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-26 21:29:51 | 显示全部楼层
JavaScript 中最臭名昭著的 Bug 就是:
0.1 + 0.2 !== 0.3


不仅是 JS,所有语言都是这样。

例如 Python:

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 12:22:33 | 显示全部楼层
zltzlt 发表于 2020-1-26 21:29
不仅是 JS,所有语言都是这样。

例如 Python:

20000000000%的同意
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-2 16:07:08 | 显示全部楼层
哇塞,好骚好喜欢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 06:45:31 | 显示全部楼层
本帖最后由 LuckyTiger66 于 2020-3-17 07:20 编辑

哇塞,好骚好喜欢
if (toggle) {    toggle = 0;}
else {    toggle = 1;}
//toggle == 1  或 true 時,反而是0,比較不直觀。

這一串SB??
(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表