大神你寫這么騷的代碼,不怕被揍么?
作者:布拉德特皮
來源:juejin.im/post/5e044eb5f265da33b50748c8

這世上,“只有魔法才能對抗魔法”,于是后來,翻閱各種“黑魔法”的秘籍,總結(jié)了一些比較實用的“騷操作”,讓我們裝X的同時,提升代碼運行的效率(請配合健身房一起使用)。

位運算
JavaScript 中最臭名昭著的 Bug 就是?0.1 + 0.2 !== 0.3,因為精度的問題,導(dǎo)致所有的浮點運算都是不安全的,具體原因可詳見《0.1 + 0.2不等于0.3?為什么JavaScript有這種“騷”操作?》。
因此,之前有大牛提出,不要在 JS 中使用位運算:
Javascript 完全套用了 Java 的位運算符,包括按位與
&、按位或|、按位異或^、按位非~、左移<<、帶符號的右移>>和用0補足的右移>>>。這套運算符針對的是整數(shù),所以對 JavaScript 完全無用,因為 JavaScript 內(nèi)部,所有數(shù)字都保存為雙精度浮點數(shù)。如果使用它們的話,JavaScript 不得不將運算數(shù)先轉(zhuǎn)為整數(shù),然后再進(jìn)行運算,這樣就降低了速度。而且"按位與運算符"&同"邏輯與運算符"&&,很容易混淆。
1. 使用左移運算符?<<?迅速得出2的次方
1?<< 2// 4, 即 2的2次方
????1?<< 10// 1024, 即 2的10次方
????
????// 但是要注意使用場景
????a = 2e9; // 2000000000
????a << 1; // -2949672962. 使用?^?切換變量 0 或 1
// --- before ---
????// if 判斷
????if?(toggle) {
????????toggle = 0;
????} else?{
????????toggle = 1;
????}
????// 三目運算符
????togle = toggle ? 0?: 1;
????
????// --- after ---
????toggle ^= 1;3. 使用?&?判斷奇偶性
偶數(shù) & 1 = 0
奇數(shù) & 1 = 1
console.log(7?& 1); // 1
console.log(8?& 1) ; // 04. 使用?!!?將數(shù)字轉(zhuǎn)為布爾值
所有非0的值都是true,包括負(fù)數(shù)、浮點數(shù):
console.log(!!7); //?true
console.log(!!0); //?false
console.log(!!-1); //?true
console.log(!!0.71); //?true5. 使用~、>>、<<、>>>、|來取整
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注意 >>> 不可對負(fù)數(shù)取整

6. 使用^來完成值交換
// --- before ---
????let?temp = a; a = b; b = temp; // 傳統(tǒng),但需要借助臨時變量
????b = [a, a = b][0] // 借助數(shù)組
????
????// --- after ---
????let?a = 7
????let?b = 1
????a ^= b
????b ^= a
????a ^= b
????console.log(a) // 1
????console.log(b) // 7
????
[a, b] = [b, a]; // ES6,解構(gòu)賦值7. 使用^判斷符號是否相同
(a ^ b) >= 0; //??true?相同; false?不相同
8. 使用^來檢查數(shù)字是否不相等
// --- before ---
????if?(a !== 1171) {...};
????
????// --- after ---
????if?(a ^ 1171) {...};
9.?n & (n - 1),如果為 0,說明 n 是 2 的整數(shù)冪

10. 使用?A + 0.5 | 0?來替代 Math.round()

-0.5
String
1. 使用toString(16)取隨機字符串
Math.random().toString(16).substring(2, 15);.substring() 的第二個參數(shù)控制取多少位 (最多可取13位)

2. 使用 split(0)
// --- before ---
????"alpha,bravo,charlie".split(",");
????
????// --- after ---
????"alpha0bravo0charlie".split(0);3. 使用.link()?創(chuàng)建鏈接
// --- before ---
????let?b = `"www.google.com">google`;
????
????// --- after ---
????let?b = google .link( www.google.com );
4. 使用?Array?來重復(fù)字符
// --- before ---
????for?(let?a = "", i = 7; i--;) a+= 0;
????
????// --- after ---
????let?b = Array(7).join(0); // "0000000"let c = Array(7).join( La ) // "LaLaLaLaLaLa"
????
????// ES6
????let?d = "0".repeat(7); // "0000000"其他一些花里胡哨的操作
1. 使用當(dāng)前時間創(chuàng)建一個隨機數(shù)
// --- before ---
????let?b = 0?| Math.random() * 100
????
????// --- after ---
????let?a;
????a = newDate % 100; // 兩位隨機數(shù)
????a = newDate % 1000; // 三位隨機數(shù)
????a = newDate % 10000; // 四位隨機數(shù)...依次類推
????// 不要在快速循環(huán)中使用,因為毫秒可能沒有變化;2. 一些可以替代?undefined?的操作
""._, 1.._?和 0[0]
void 0?會比寫?undefined?要快一些let?d = void?0;
console.log(d); // undefined
3. 使用?1/0?來替代?Infinity
// --- before ---
????[Infinity, -Infinity]
????
????// --- after ---
????[1/0, -1/0]4. 使用?Array.length = 0?來清空數(shù)組

5. 使用?Array.slice(0)?實現(xiàn)數(shù)組淺拷貝

6. 使用?!+"1"?快速判斷 IE8 以下的瀏覽器

IE 9(10,11):

IE 8(7,6,5):

7. for 循環(huán)條件的簡寫
// --- before ---
????for(let?i = 0; i < arr.length; i++) {...}
????
????// --- after ---
????for(let?i = arr.length; i--;) {...} // 注意 i-- 后面的分號別漏了結(jié)尾
(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]如果以后有人噴你的代碼,你就可以將此代碼發(fā)給他。
- END -
長按進(jìn)入小程序,進(jìn)行30天打卡 打卡第15期,20本新書,快來看看! (更多精彩值得期待……)
最近熱文: 20套Java實戰(zhàn)項目視頻,涉及SpringBoot、SSM、SpringCloud等等! 給IDEA換個酷炫的主題,這個有點哇塞??! 為啥計算機非得要自帶操作系統(tǒng)呢? 神器在手,變量命名從此變得高大上! 軟件過于強大,什么隱秘的功能都有~ 雙11秒殺場景設(shè)計,一看就懂! LeetCode1-80題匯總,速度收藏! 2T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,軟考,英語,等等。在公眾號內(nèi)回復(fù)「資源」,即可免費獲?。?span style="letter-spacing: 0.544px;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);font-weight: bolder;">回復(fù)「社群」,可以邀請你加入讀者群!回復(fù)「抽獎」,可以參與小米手機抽獎!


