寫了這么多年 JavaScript ,竟然還不知道這些技巧?


不少人有五年的 JavaScript 經驗,但實際上可能只是一年的經驗重復用了五次而已。完成同樣的邏輯和功能,有人可以寫出意大利面條一樣的代碼,也有人兩三行簡潔清晰的代碼就搞定了。簡潔的代碼不但方便閱讀,還能減少復雜邏輯和出錯的可能性。本文就介紹一些常用的JavaScript簡化技巧,日常開發都用得上。

1. 簡化條件表達式

經常碰到這種情況,要判斷某個變量是否為指定的某些值,用常規的邏輯表達式會很長。我的做法是把這些值放進數組里:

// 太長的邏輯表達式
if (x === 'abc' || x === 'def' || x === 'ghi' || x ==='jkl') {
    //其他邏輯
}
// 簡寫
if (['abc', 'def', 'ghi', 'jkl'].includes(x)) {
   //其他邏輯
}

2. 簡化 if ... else

if...else太常用了,以至於很多人都忘了其實還有其他方式來判斷條件。比如簡單的變量賦值,完全沒必要用這種冗長的語句,一行表達式就搞定了:

// 新手的寫法
let test= boolean;
if (x > 100) {
    test = true;
} else {
    test = false;
}
// 簡寫表達式
let test = (x > 10) ? true : false;
// 更直接的
let test = x > 10;
console.log(test);

三元表達式可以做復雜的條件分支判斷,不過犧牲了一些可讀性:

let x = 300,
let test2 = (x > 100) ? 'greater 100' : (x < 50) ? 'less 50' : 'between 50 and 100';
console.log(test2); // "greater than 100"

3. 判空並賦默認值

Code Review 的時候我經常看到這樣的代碼,判斷變量不是nullundefined''的時候賦值給第二個變量,否則給個默認值:

if (first !== null || first !== undefined || first !== '') {
    let second = first;
}
// 簡寫
let second = first || '';

4. 簡寫循環遍歷

for 循環是最基本的,但是有點繁瑣。可以用for...infor...of或者forEach代替:

// Longhand
for (var i = 0; i < testData.length; i++)

// Shorthand
for (let i in testData) or  for (let i of testData)

數組遍歷:

function testData(element, index, array) {
  console.log('test[' + index + '] = ' + element);
}

[11, 24, 32].forEach(testData);
// 打印輸出: test[0] = 11, test[1] = 24, test[2] = 32

4. 簡化 switch

這個技巧也很常用,把switch 轉換成對象的key-value形式,代碼簡潔多了:

// Longhand
switch (data) {
  case 1:
    test1();
  break;

  case 2:
    test2();
  break;

  case 3:
    test();
  break;
  // And so on...
}

// Shorthand
var data = {
  1: test1,
  2: test2,
  3: test
};

data[anything] && data[anything]();

5. 簡化多行字符串拼接

如果一個字符串表達式過長,我們可能會拆成多行拼接的方式。不過隨着 ES6 的普及,更好的做法是用模板字符串:

//longhand
const data = 'abc abc abc abc abc abc\n\t'
    + 'test test,test test test test\n\t'
//shorthand
const data = `abc abc abc abc abc abc
         test test,test test test test`

6. 善用箭頭函數簡化 return

ES6 的箭頭函數真是個好東西,當函數簡單到只需要返回一個表達式時,用箭頭函數最合適不過了,return都不用寫:

Longhand:
//longhand
function getArea(diameter) {
  return Math.PI * diameter
}
//shorthand
getArea = diameter => (
  Math.PI * diameter;
)

7. 簡化分支條件語句

又是你,if...else if...else!跟switch類似,也可以用key-value形式簡化:

// Longhand
if (type === 'test1') {
  test1();
}
else if (type === 'test2') {
  test2();
}
else if (type === 'test3') {
  test3();
}
else if (type === 'test4') {
  test4();
} else {
  throw new Error('Invalid value ' + type);
}
// Shorthand
var types = {
  test1: test1,
  test2: test2,
  test3: test3,
  test4: test4
};

var func = types[type];
(!func) && throw new Error('Invalid value ' + type); func();

8. 重復字符串 N 次

有時候出於某種目的需要將字符串重復 N 次,最笨的方法就是用for循環拼接。其實更簡單的方法是用repeat

//longhand 
let test = ''; 
for(let i = 0; i < 5; i ++) { 
  test += 'test '; 
} 
console.log(str); // test test test test test 
//shorthand 
'test '.repeat(5);

9. 指數運算

//longhand
Math.pow(2,3); // 8
//shorthand
2**3 // 8

10. 數字分隔符

這是比較新的語法,ES2021 提出來的,大數字在書寫的時候可以用下划線分割,提高了可讀性:

// 舊語法
let number = 98234567

// 新語法
let number = 98_234_567

總結

沒啥好總結的,拿去用就是了。

這個圖的信息量太大了,你們猜猜是什么


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM