<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          大神你寫這么騷的代碼,不怕被揍么?

          共 3365字,需瀏覽 7分鐘

           ·

          2020-11-10 20:29

          作者:布拉德特皮

          來源:juejin.im/post/5e044eb5f265da33b50748c8

          曾經(jīng),我接手了一份大神的代碼,里面充滿了各種“騷操作”,還不加注釋那種,短短幾行的函數(shù)花了很久才弄懂。

          這世上,“只有魔法才能對抗魔法”,于是后來,翻閱各種“黑魔法”的秘籍,總結(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)行運算,這樣就降低了速度。而且"按位與運算符"&同"邏輯與運算符"&&,很容易混淆。

          但是在我看來,如果對 JS 的運用達(dá)到爐火純青的地步,能避開各種“Feature”的話,偶爾用一下位運算符也無所謂,還能提升運算性能,畢竟直接操作的是計算機最熟悉的二進(jìn)制。

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

          1?<< 2// 4, 即 2的2次方
          ????1?<< 10// 1024, 即 2的10次方
          ????
          ????// 但是要注意使用場景
          ????a = 2e9; // 2000000000
          ????a << 1; // -294967296


          2. 使用?^?切換變量 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) ; // 0



          4. 使用?!!?將數(shù)字轉(zhuǎn)為布爾值


          所有非0的值都是true,包括負(fù)數(shù)、浮點數(shù):


          console.log(!!7); //?true
          console.log(!!0); //?false
          console.log(!!-1); //?true
          console.log(!!0.71); //?true



          5. 使用~、>>、<<、>>>、|來取整


          相當(dāng)于使用了 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


          注意 >>> 不可對負(fù)數(shù)取整


          6. 使用^來完成值交換


          這個符號的用法前面提到過,下面介紹一些高級的用法,在 ES6 的解構(gòu)賦值出來之前,用這種方式會更快(但必須是整數(shù)):

          // --- 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()



          如果是負(fù)數(shù),只需要-0.5


          String

          1. 使用toString(16)取隨機字符串


          Math.random().toString(16).substring(2, 15);

          .substring() 的第二個參數(shù)控制取多少位 (最多可取13位)



          2. 使用 split(0)


          使用數(shù)字來做為 split 的分隔條件可以節(jié)省2字節(jié)

          // --- before ---
          ????"alpha,bravo,charlie".split(",");
          ????
          ????// --- after ---
          ????"alpha0bravo0charlie".split(0);


          3. 使用.link()?創(chuàng)建鏈接


          一個鮮為人知的方法,可以快速創(chuàng)建 a 標(biāo)簽

          // --- 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é)尾


          雖然上述操作能在一定程度上使代碼更簡潔,但會降低可讀性。在目前的大環(huán)境下,機器的性能損失遠(yuǎn)比不上人力的損失,因為升級機器配置的成本遠(yuǎn)低于維護(hù)晦澀代碼的成本,所以請謹(jǐn)慎使用這些“黑魔法”。就算要使用,也請加上注釋,畢竟,這世上還有很多“麻瓜”需要生存。
          還有一些其他騷操作,可以參考這位大神總結(jié)的 《Byte-saving Techniques》,有些很常見,有些使用環(huán)境苛刻,這里就不一一列出了。
          最后,來一個彩蛋,在控制臺輸入:

          (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]


          如果以后有人噴你的代碼,你就可以將此代碼發(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ù)「抽獎」,可以參與小米手機抽獎!

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  大鸡吧av网站 | 蜜芽尤物在线 | 日本高清视频一区二区三区 | 麻豆人妻无码 | 欧美成人免费在线观看视频 |