24個實用JavaScript 開發技巧
1. 初始化數組
如果想要初始化一個指定長度的一維數組,並指定默認值,可以這樣:
const array = Array(6).fill(''); // ['', '', '', '', '', '']
如果想要初始化一個指定長度的二維數組,並指定默認值,可以這樣:
const matrix = Array(6).fill(0).map(() => Array(5).fill(0)); // [[0, 0, 0, 0, 0], // [0, 0, 0, 0, 0], // [0, 0, 0, 0, 0], // [0, 0, 0, 0, 0], // [0, 0, 0, 0, 0], // [0, 0, 0, 0, 0]]
2. 數組求和、求最大值、最小值
const array = [5,4,7,8,9,2];
數組求和:
array.reduce((a,b) => a+b);
數組最大值:
array.reduce((a,b) => a > b ? a : b);
Math.max(...array)
數組最小值:
array.reduce((a,b) => a < b ? a : b); Math.min(...array)
使用數組的reduce
方法可以解決很多數組的求值問題。
3. 過濾錯誤值
如果想過濾數組中的false、0、null、undefined等值,可以這樣:
const array = [1, 0, undefined, 6, 7, '', false]; array.filter(Boolean); // [1, 6, 7]
4. 使用邏輯運算符
如果有一段這樣的代碼:
if(a > 10) { doSomething(a) }
可以使用邏輯運算符來改寫:
a > 10 && doSomething(a)
這樣寫就會簡潔很多,如果邏輯與&&操作符前面的值為假,就會發生短路操作,直接結束這一句的執行;如果為真,就會繼續執行&&後面的代碼,並返回後面代碼的返回值。使用這種方式可以減少很多if…else判斷。
5. 判斷簡化
如果有下面的這樣的一個判斷:
if(a === undefined || a === 10 || a=== 15 || a === null) { //... }
就可以使用數組來簡化這個判斷邏輯:
if([undefined, 10, 15, null].includes(a)) { //... }
這樣代碼就會簡潔很多,並且便於擴展,如果還有需要等於a的判斷,直接在數組中添加即可。
6. 清空數組
如果想要清空一個數組,可以將數組的length置於0:
let array = ["A", "B", "C", "D", "E", "F"] array.length = 0 console.log(array) // []
7. 計算代碼性能
可以使用以下操作來計算代碼的性能:
const startTime = performance.now(); // 某些程序 for(let i = 0; i < 1000; i++) { console.log(i) } const endTime = performance.now(); const totaltime = endTime - startTime; console.log(totaltime); // 30.299999952316284
8. 拼接數組
如果我們想要拼接幾個數組,可以使用擴展運算符:
const start = [1, 2] const end = [5, 6, 7] const numbers = [9, ...start, ...end, 8] // [9, 1, 2, 5, 6, 7 , 8]
或者使用數組的concat()方法:
const start = [1, 2, 3, 4] const end = [5, 6, 7] start.concat(end); // [1, 2, 3, 4, 5, 6, 7]
但是使用concat()
方法時,如果需要合並的數組很大,那麼concat()
函數會在創建單獨的新數組時消耗大量內存。這時可以使用以下方法來實現數組的合並:
Array.push.apply(start, end)
通過這種方式就能在很大程度上較少內存的使用。
9. 對象驗證方式
如果我們有一個這樣的對象:
const parent = { child: { child1: { child2: { key: 10 } } } }
很多時候我們會這樣去寫,避免某一層級不存在導致報錯:
parent && parent.child && parent.child.child1 && parent.child.child1.child2
這樣代碼看起來就會很臃腫,可以使用JavaScript的可選鏈運算符:
parent?.child?.child1?.child2
這樣實現和效果和上面的一大長串是一樣的。
可選鏈運算符同樣適用於數組:
const array = [1, 2, 3]; array?.[5]
可選鏈運算符允許我們讀取位於連接對象鏈深處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。在引用為空(null 或者 undefined) 的情況下不會引起錯誤,該表達式短路返回值是 undefined
。與函數調用一起使用時,如果給定的函數不存在,則返回 undefined
。
10. 驗證undefined和null
如果有這樣一段代碼:
if(a === null || a === undefined) { doSomething() }
也就是如果需要驗證一個值如果等於null
或者undefined
時,需要執行一個操作時,可以使用空值合並運算符來簡化上面的代碼:
a ?? doSomething()
這樣,隻有a是undefined
或者null時,才會執行控制合並運算符後面的代碼。空值合並操作符(??)是一個邏輯操作符,當左側的操作數為 null 或者 undefined
時,返回其右側操作數,否則返回左側操作數。
11. 數組元素轉化為數字
如果有一個數組,想要把數組中的元素轉化為數字,可以使用map方法來實現:
const array = ['12', '1', '3.1415', '-10.01']; array.map(Number); // [12, 1, 3.1415, -10.01]
通過這種方式,map
會在遍歷數組時,對數組的每個元素執行Number構造函數並返回結果。
12. 類數組轉為數組
可以使用以下方法將類數組arguments轉化為數組:
Array.prototype.slice.call(arguments);
除此之外,還可以使用擴展運算符來實現:
[...arguments]
13. 對象動態聲明屬性
如果想要給對象動態聲明屬性,可以這樣:
const dynamic = 'color'; var item = { brand: 'Ford', [dynamic]: 'Blue' } console.log(item); // { brand: "Ford", color: "Blue" }
14. 縮短console.log()
每次進行調試時書寫很多console.log()就會比較麻煩,可以使用以下形式來簡化這個代碼:
const c = console.log.bind(document) c(996) c("hello world")
這樣每次執行c方法就行瞭。
15. 獲取查詢參數
如果我們想要獲取URL中的參數,可以使用window對象的屬性:
window.location.search
如果一個URL為www.baidu.com?project=js&type=1 那麼通過上面操作就會獲取到?project=js&type=1。如果在想獲取到其中某一個參數,可以這樣:
let type = new URLSearchParams(location.search).get('type');
16. 數字取整
如果有一個數字包含小數,我們想要去除小數,通過會使用math.floor
、math.ceil
或math.round
方法來消除小數。其實可以使用~~運算符來消除數字的小數部分,它相對於數字的那些方法會快很多。
~~3.1415926 // 3
其實這個運算符的作用有很多,通常是用來將變量轉化為數字類型的,不同類型的轉化結果不一樣:
- 如果是數字類型的字符串,就會轉化為純數字;
- 如果字符串包含數字之外的值,就會轉化為0;
- 如果是佈爾類型,true會返回1,false會返回0;
除瞭這種方式之外,我們還可以使用按位與來實現數字的取整操作,隻需要在數字後面加上|0即可:
23.9 | 0 // 23 -23.9 | 0 // -23
這個操作也是直接去除數字後面的小數。這個方法和上面方法類似,使用起來性能都會比JavaScript
的的API好很多。
17. 刪除數組元素
如果我們想刪除數組中的一個元素,我們可以使用delete來實現,但是刪除完之後的元素會變為undefined
,並不會消失,並且執行時會消耗大量的時間,這樣多數情況下都不能滿足我們的需求。所以可以使用數組的splice()
方法來刪除數組元素:
const array = ["a", "b", "c", "d"] array.splice(0, 2) // ["a", "b"]
18. 檢查對象是否為空
如果我們想要檢查對象是否為空,可以使用以下方式:
Object.keys({}).length // 0 Object.keys({key: 1}).length // 1
Object.keys()
方法用於獲取對象的 key,會返回一個包含這些key值的數組。如果返回的數組長度為0,那對象肯定為空瞭。
19. 使用 switch case 替換 if/else
switch case
相對於 if/else 執行性能更高,代碼看起來會更加清晰。
if (1 == month) {days = 31;} else if (2 == month) {days = IsLeapYear(year) ? 29 : 28;} else if (3 == month) {days = 31;} else if (4 == month) {days = 30;} else if (5 == month) {days = 31;} else if (6 == month) {days = 30;} else if (7 == month) {days = 31;} else if (8 == month) {days = 31;} else if (9 == month) {days = 30;} else if (10 == month) {days = 31;} else if (11 == month) {days = 30;} else if (12 == month) {days = 31;}
使用switch…case來改寫:
switch(month) { case 1: days = 31; break; case 2: days = IsLeapYear(year) ? 29 : 28; break; case 3: days = 31; break; case 4: days = 30; break; case 5: days = 31; break; case 6: days = 30; break; case 7: days = 31; break; case 8: days = 31; break; case 9: days = 30; break; case 10: days = 31; break; case 11: days = 30; break; case 12: days = 31; break; default: break; }
看起來相對來說簡潔瞭一點。可以根據情況,使用數組或對象來改寫if…else。
20. 獲取數組中的最後一項
如果想獲取數組中的最後一項,很多時候會這樣來寫:
const arr = [1, 2, 3, 4, 5]; arr[arr.length - 1] // 5
其實我們還可以使用數組的slice方法來獲取數組的最後一個元素:
arr.slice(-1)
當我們將slice方法的參數設置為負值時,就會從數組後面開始截取數組值,如果我們想截取後兩個值,參數傳入-2即可。
21. 值轉為佈爾值
在JavaScript
中,以下值都會在佈爾值轉化時轉化為false,其他值會轉化為true:
- undefined
- null
- 0
- -0
- NaN
- “”
通常我們如果想顯式的值轉化為佈爾值,會使用Boolean()
方法進行轉化。其實我們可以使用!!運算符來將一個值轉化我佈爾值。我們知道,一個!是將對象轉為佈爾型並取反,兩個!是將取反後的佈爾值再取反,相當於直接將非佈爾類型值轉為佈爾類型值。這種操作相對於Boolean()
方法性能會快很多,因為它是計算機的原生操作:
!!undefined // false !!"996" // true !!null // false !!NaN // false
22. 格式化 JSON 代碼
相信大傢都使用過JSON.stringify
方法,該方法可以將一個 JavaScript
對象或值轉換為 JSON 字符串。他的語法如下:
JSON.stringify(value, replacer, space)
它有三個參數:
value
:將要序列化成 一個 JSON 字符串的值。replacer
可選:如果該參數是一個函數,則在序列化過程中,被序列化的值的每個屬性都會經過該函數的轉換和處理;如果該參數是一個數組,則隻有包含在這個數組中的屬性名才會被序列化到最終的 JSON 字符串中;如果該參數為 null 或者未提供,則對象所有的屬性都會被序列化。space
可選:指定縮進用的空白字符串,用於美化輸出(pretty-print);如果參數是個數字,它代表有多少的空格;上限為10。該值若小於1,則意味著沒有空格;如果該參數為字符串(當字符串長度超過10個字母,取其前10個字母),該字符串將被作為空格;如果該參數沒有提供(或者為 null),將沒有空格。
通常情況下,我們都寫一個參數來將一個 JavaScript 對象或值轉換為 JSON 字符串。可以看到它還有兩個可選的參數,所以我們可以用這倆參數來格式化JSON代碼:
console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, '\t'));
輸出結果如下:
23. 避免使用eval()和with()
with()
會在全局范圍內插入一個變量。因此,如果另一個變量具有相同的名稱,則可能會導致混淆並覆蓋該值。eval()
是比較昂貴的操作,每次調用它時,腳本引擎都必須將源代碼轉換為可執行代碼。
24. 函數參數使用對象而不是參數列表
當我們使用參數列表給函數傳遞參數時,如果參數較少還好,如果參數較多時,就會比較麻煩,因為我們必須按照參數列表的順序來傳遞參數。如果使用TypeScript
來寫,那麼寫的時候還需要讓可選參數排在必選參數的後面。
如果我們的函數參數較多,就可以考慮使用對象的形式來傳遞參數,對象的形式傳遞參數時,傳遞可選參數並不需要放在最後,並且參數的順序不在重要。與參數列表相比,通過對象傳遞的內容也更容易閱讀和理解。
下面來看一個例子:
function getItem(price, quantity, name, description) {} getItem(15, undefined, 'bananas', 'fruit')
下面來使用對象傳參:
function getItem(args) { const {price, quantity, name, description} = args } getItem({ name: 'bananas', price: 10, quantity: 1, description: 'fruit' })
到此這篇關於24個實用JavaScript 開發技巧的文章就介紹到這瞭,更多相關JavaScript 開發技巧內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript小技巧帶你提升你的代碼技能
- JavaScript的11個小技巧整理
- JavaScript數組常用方法解析及數組扁平化
- 梳理總結25JavaScript數組操作方法實例
- JavaScript字符串操作的四個實用技巧