JS中位運算符的一些妙用
前言:
Javascript 完全套用了 Java 的位運算符,包括按位與&、按位或|、按位異或^、按位非~、左移<<、帶符號的右移>>和用0補足的右移>>>。這套運算符針對的是整數(shù),所以對 JavaScript 完全無用,因為 JavaScript 內部,所有數(shù)字都保存為雙精度浮點數(shù)。如果使用它們的話,JavaScript 不得不將運算數(shù)先轉為整數(shù),然后再進行運算,這樣就降低了速度。而且"按位與運算符"&同"邏輯與運算符"&&,很容易混淆。
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. 使用 & 判斷奇偶性
console.log(7 & 1); // 1 console.log(8 & 1) ; // 0
4. 使用 !! 將數(shù)字轉為布爾值
所有非0的值都是true,包括負數(shù)、浮點數(shù):
console.log(!!7); // true console.log(!!0); // false console.log(!!-1); // true console.log(!!0.71); // true
5. 使用~、>>、<<、>>>、|來取整
相當于使用了 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
注意 >>> 不可對負數(shù)取整
6. 使用^來完成值交換
在 ES6 的解構賦值出來之前,用這種方式會更快(但必須是整數(shù)):
// --- before --- let temp = a; a = b; b = temp; // 傳統(tǒng),但需要借助臨時變量 b = [a, a = b][0] // 借助數(shù)組 // --- after --- 只能用于整數(shù) 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,解構賦值
7. 使用^判斷符號是否相同
只能應用與整數(shù)
(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()
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 標簽
// --- before --- let b = `<a herf="www.google.com">google</a>`; // --- after --- let b = google .link( www.google.com );
4. 使用 Array 來重復字符
// --- 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. 使用當前時間創(chuàng)建一個隨機數(shù)
// --- before --- let b = 0 | Math.random() * 100 // --- after --- let a; a = new Date % 100; // 兩位隨機數(shù) a = new Date % 1000; // 三位隨機數(shù) a = new Date % 10000; // 四位隨機數(shù)...依次類推 // 不要在快速循環(huán)中使用,因為毫秒可能沒有變化;
2. 一些可以替代 undefined 的操作
3. 使用 Array.length = 0 來清空數(shù)組
4. 使用 Array.slice(0) 實現(xiàn)數(shù)組淺拷貝
5. 使用 !+“1” 快速判斷 IE8 以下的瀏覽器
6. for 循環(huán)條件的簡寫
// --- before --- for(let i = 0; i < arr.length; i++) {...} // --- after --- for(let i = arr.length; i--;) {...} // 注意 i-- 后面的分號別漏了
總結
到此這篇關于JS中位運算符的一些妙用的文章就介紹到這了,更多相關JS位運算符妙用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
asp錯誤 '80040e21' 多步 OLE DB&nbs
今天在寫asp入庫操作的時候提示Microsoft OLE DB Provider for ODBC Drivers 錯誤 80040e21 多步 OLE DB 操作產(chǎn)生錯誤,請檢查每個 OLE DB 狀態(tài)值,經(jīng)測試時函數(shù)定義文件沒有加載導致類型不對,所以無法入庫2023-05-05JavaScript中的call和apply的用途以及區(qū)別
本文主要介紹了JavaScript中的call和apply的用途以及區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧2017-01-01支付寶小程序實現(xiàn)類似微信多行輸入功能(思路詳解)
這篇文章主要介紹了支付寶小程序實現(xiàn)類似微信多行輸入功能,輸入超過 8 行的時候會出現(xiàn)滾動,這樣做的好處就是輸入框不會直接頂?shù)巾撁孀铐敳?支付寶小程序實現(xiàn)多行輸入框:使用textarea多行輸入框實現(xiàn),感興趣的朋友一起看看吧2024-02-02JS中innerHTML和pasteHTML的區(qū)別實例分析
這篇文章主要介紹了JS中innerHTML和pasteHTML的區(qū)別,結合實例形式較為詳細的分析了innerHTML和pasteHTML的具體功能與使用區(qū)別,需要的朋友可以參考下2016-06-06使用Function.apply()的參數(shù)數(shù)組化來提高 JavaScript程序性能的技巧
這篇文章主要介紹了使用Function.apply()的參數(shù)數(shù)組化來提高 JavaScript程序性能的技巧,對js function apply相關知識感興趣的朋友一起學習吧2015-12-12EasyUi中的Combogrid 實現(xiàn)分頁和動態(tài)搜索遠程數(shù)據(jù)
jquery easyui中的combogrid比較特殊,算是combo和grid的組合,combogrid結合一個可編輯的文本框和下拉數(shù)據(jù)網(wǎng)格面板,可以讓用戶迅速找到并選擇,又可以進行搜索,展示與當前輸入的字符相匹配的數(shù)據(jù)。下面給大家介紹EasyUi中的Combogrid 實現(xiàn)分頁和動態(tài)搜索遠程數(shù)據(jù)2016-04-04