iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
JavaScript

JavaScript 基礎:端開發的第一步系列 第 30

JavaScript 開發最佳實踐

  • 分享至 

  • xImage
  •  

遵循一些最佳實踐不僅能提升程式的可維護性,還能提高程式的效率和穩定性。以下是一些 JavaScript 開發中的最佳實踐,涵蓋從語法使用到性能優化的各個方面。


1. 使用 constlet 代替 var

var 具有功能範圍(function scope),容易導致變數提升(hoisting)和範圍問題。使用 constlet 來取代 var,可以避免這些問題:

  • const 用來宣告不可重新賦值的變數。
  • let 用來宣告會被重新賦值的變數,且具有區塊範圍(block scope)。
const PI = 3.14159;
let age = 25;
age = 26; // 這是允許的

2. 保持代碼模塊化

將程式劃分為小而可重複使用的函數或模塊,這樣可以提高程式的可維護性和可測試性。每個函數應只做一件事,並且應該盡量避免冗長的函數。

function calculateArea(radius) {
  return Math.PI * radius * radius;
}

function printArea(radius) {
  console.log(`Area: ${calculateArea(radius)}`);
}

3. 避免全局變數

全局變數會污染全局命名空間,增加命名衝突的風險。應盡可能將變數限制在它們所需要的範圍內,避免全局範圍。

// 壞的做法
var counter = 0;

// 好的做法
function incrementCounter() {
  let counter = 0;
  counter++;
}

4. 使用嚴格模式 (use strict)

在程式的開頭加入 'use strict';,可以強制 JavaScript 在更嚴格的條件下運行,幫助開發者及早發現潛在的錯誤,並防止一些不安全的語法。

'use strict';

function myFunction() {
  // 嚴格模式下的代碼
}

5. 正確處理異步操作

使用 Promiseasync/await 來處理非同步操作,避免傳統回呼地獄(callback hell)。這樣可以使代碼結構更加清晰,並且減少陷入回呼的層級問題。

// 使用 Promise
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

// 使用 async/await
async function getData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

6. 保持代碼風格一致

  • 使用自動格式化工具(如 Prettier)保持一致的代碼格式和縮排。
  • 遵循一致的命名規則,如駝峰式命名法(camelCase)用於變數和函數命名。
let userAge = 25;  // 駝峰式命名
const MAX_LIMIT = 100;  // 常量通常使用全大寫

7. 使用箭頭函數 (Arrow Functions)

箭頭函數語法更加簡潔,並且它們的 this 關鍵字會綁定到定義時的上下文,而非執行時的上下文,這對於非同步代碼和回呼函數特別有用。

// 傳統函數
const numbers = [1, 2, 3];
const squares = numbers.map(function (num) {
  return num * num;
});

// 箭頭函數
const squaresArrow = numbers.map(num => num * num);

8. 錯誤處理

應在適當的地方使用 try/catch 來捕獲可能的錯誤,特別是在進行非同步操作或處理可能失敗的外部資源時(如 API 請求)。

try {
  // 可能會拋出錯誤的代碼
  let result = riskyOperation();
} catch (error) {
  console.error('捕獲錯誤:', error);
} finally {
  console.log('無論成功或失敗都會執行');
}

9. 善用解構賦值

解構賦值可以讓你快速從物件或陣列中提取值,簡化代碼並提升可讀性。

const person = { name: 'Alice', age: 30 };

// 解構賦值
const { name, age } = person;
console.log(name, age); // 輸出 'Alice', 30

const numbers = [1, 2, 3];
const [first, second] = numbers;
console.log(first, second); // 輸出 1, 2

10. 避免不必要的重繪和重排

在操作 DOM 時,應避免頻繁重繪和重排(reflow/repaint),這樣可以提高性能。例如,對 DOM 進行大量修改時,應該先將修改封裝到 documentFragment 中,再一次性加入 DOM。

const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
  const div = document.createElement('div');
  div.textContent = `Item ${i}`;
  fragment.appendChild(div);
}
document.body.appendChild(fragment);

11. 防止內存洩漏

避免因閉包、事件監聽器或計時器而導致的內存洩漏。當你不再需要使用的物件時,應主動解除引用或移除事件監聽器。

let element = document.getElementById('myElement');
element.addEventListener('click', handleClick);

// 移除監聽器
element.removeEventListener('click', handleClick);
element = null; // 釋放內存

12. 寫單元測試

為你的代碼寫單元測試,確保代碼在修改後不會破壞已有功能。常見的測試框架包括 JestMocha


13. 優化迭代器和回圈

當處理大量資料時,盡量使用較為高效的迭代器(如 map()forEach()),而避免使用 for 回圈,尤其是針對陣列長度較大的情況,這樣可以優化性能。


14. 使用 === 而不是 ==

使用 ===(嚴格相等)來比較值,因為它會檢查值和類型,而 == 則會自動進行類型轉換,可能導致意想不到的結果。

console.log(0 == ''); // true,因為 == 會進行類型轉換
console.log(0 === ''); // false,因為 === 不會進行類型轉換

良好的 JavaScript 開發實踐有助於提高代碼的可讀性、可維護性和性能。


上一篇
實戰練習 - 編寫一個使用回呼函數的小應用程式
系列文
JavaScript 基礎:端開發的第一步30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言