每天學習10個實用JavaScript代碼片段,加深對 JavaScript 語法的理解,積累代碼優化經驗。

1、FizzBuzz

下面代碼用于實現經典的 FizzBuzz 問題,將1100的數字遍歷,如果是3的倍數則輸出 Fizz ,如果是5的倍數則輸出 Buzz,如果既是3的倍數又是5的倍數則輸出 FizzBuzz

const fizzBuzz = () => {
    for (let i = 1; i <= 100; )
        console.log((i % 3 ? "" : "Fizz") + (i % 5 ? "" : "Buzz") || i), i++;
};
console.log(fizzBuzz());

2、斐波那契數列

斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家萊昂納多·斐波那契(Leonardo Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、…… 在數學上,斐波那契數列以如下被以遞推的方法定義:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),在現代物理、準晶體結構、化學等領域,斐波那契數列都有直接的應用

斐波那契數列通常是面試常見的問題,下面代碼是用一個非常簡短的遞歸函數,返回斐波那契數列中第n個數字的值。

const fib = (n) => (n <= 2 ? 1 : fib(n - 1) + fib(n - 2));

const createFibNumber = (count = 10) => {
    const arrayFibs = [];
    for (let i = 0; i < count; i++) {
        arrayFibs.push(fib(i));
    }
    return arrayFibs;
};

console.log(createFibNumber(10)); // [ 1, 1,  1,  2,  3, 5, 8, 13, 21, 34 ]

3、快速排序

下面代碼實現了快速排序,通過遞歸將數組分割成較小和較大的兩個子數組,最終將它們合并以獲得排序的結果。

const quickSort = (arrayNums) =>
    arrayNums.length
        ? [
              ...quickSort(arrayNums.slice(1).filter((x) => x <= arrayNums[0])),
              arrayNums[0],
              ...quickSort(arrayNums.slice(1).filter((x) => x > arrayNums[0])),
          ]
        : [];

const arrayNumbers = [1, 3, 5, 6, 2, 4, 11, 30, 100, 40];
console.log(quickSort(arrayNumbers)); // [ 1,  2,  3,  4,   5, 6, 11, 30, 40, 100 ]

4、判斷是否為回文

下面代碼用于判斷一個字符串是否為回文,它將字符串轉換為一個字符數組并翻轉它,然后將它們重新連接起來,并將其與原字符串進行比較。

const isPalindrome = (str) => str == str.split("").reverse().join("");

console.log(isPalindrome("deved")); // true
console.log(isPalindrome("devedev")); // false

5、數組去重

下面代碼用于對一個數組進行去重操作,使用ES6中的Set數據結構,將數組轉換為一個Set,然后再將其轉換為一個數組。

const unique = (arr) => [...new Set(arr)];

const arrayNumbers = [1, 2, 3, 4, 2, 1];
console.log(unique(arrayNumbers)); // [ 1, 2, 3, 4 ]

6、打印九九乘法表

下面代碼可以打印出九九乘法表,它通過兩個嵌套的for循環遍歷每個數字,然后打印出相應的乘法表達式及其結果。

const createNumbers = () => {
    const array = [];
    for (let i = 1; i <= 9; i++)
        for (let j = 1; j <= i; j++)
            array.push(`${j}*${i}=${j * i}${j === i ? "\n" : "  "}`);
    return array.join("");
};
console.log(createNumbers());

輸出結果如下:

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12  4*4=16
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

7、數組求和

下面代碼用于對一個數組中的數字進行求和,使用 reduce 方法將數組中的所有數字相加起來,并返回最終的結果。

const sum = (arr) => arr.reduce((acc, current) => acc + current, 0);
console.log(sum([1, 3, 5, 7, 9, 10])); // 35

8、獲取URL參數

下面代碼用于從URL中獲取特定的參數值,使用 URLSearchParams API來獲取URL查詢參數,并使用get方法獲取特定的參數值。

const getParam = (url, name) =>
    new URLSearchParams(new URL(url).search).get(name);

console.log(getParam("http://www.zlot.com.cn?name=devpoint", "name")); // devpoint

9、判斷一個數字是否為質數

下面代碼用于判斷一個數字是否為質數,使用一個for循環遍歷2到數字的平方根之間的所有數字,并檢查它們是否可以整除該數字。

const isPrime = (n) => {
    if (n <= 1) return false;
    for (let i = 2; i <= Math.sqrt(n); i++) {
        if (n % i === 0) return false;
    }
    return true;
};
console.log(isPrime(1)); // false
console.log(isPrime(2)); // true
console.log(isPrime(3)); // true

10、數組扁平化

下面代碼用于將一個嵌套的數組扁平化為一個一維數組,使用 reduce 方法遞歸地遍歷嵌套數組,并將其合并為一個新的數組。

const flatten = (arr) =>
    arr.reduce(
        (acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val),
        []
    );

console.log(flatten([1, [1, 3], [4, 5, 6], [7, [8, [9]]]])); // [ 1, 1, 3, 4, 5, 6, 7, 8, 9 ]

11、階乘

下面代碼用于計算一個數字的階乘,使用遞歸方法,將數字乘以它減一的階乘。

const factorial = (n) => (n < 2 ? 1 : n * factorial(n - 1));
console.log(factorial(4)); // 24

總結

閱讀開源項目是學習提升編碼能力最快捷的方式,當然現在可能可以借助 ChatGPT 來生成一些函數,其生成的函數技巧性也很高。