首頁 > web前端 > js教程 > 現代 JavaScript 最佳實務 - 第 1 部分

現代 JavaScript 最佳實務 - 第 1 部分

Patricia Arquette
發布: 2024-12-07 02:26:11
原創
287 人瀏覽過

Mejores Prácticas en JavaScript Moderno - Parte 1

毫無疑問,JavaScript 是世界上最常用的程式語言,對我們日常生活中最重要的技術之一:網路有著巨大的影響。這種力量伴隨著巨大的責任,而 JavaScript 生態系統一直在快速發展,因此很難跟上最佳實踐。

在本文中,我們將探索現代 JavaScript 中的一些最佳實踐,以編寫更清晰、可維護且高效的程式碼。

1、項目規則最重要

每個項目可能都有特定的規則來維護程式碼一致性。這些規則將始終優先於任何外部建議,包括本文中的建議。在專案中實施實踐之前,請確保它符合既定規則並且所有團隊成員都同意。

2.使用更新的JavaScript

自 1995 年創建以來,JavaScript 已經發生了巨大的發展。您在互聯網上找到的許多舊做法可能已經過時了。在實施技術之前,請先驗證它是否與該語言的當前版本相容。

3.使用let和const代替var

儘管 var 仍然有效,但它的使用被認為已過時,並且在許多情況下,由於其功能範圍,可能會引入難以追踪的錯誤。另一方面,let 和 const 給我們一個更可預測且安全範圍,僅限於聲明它們的區塊。

什麼時候用let,什麼時候用const?

  • 只要變數不更改其引用或值,就使用 const。這使您的程式碼更易於理解,並透過保護不可變值來減少錯誤。
  • 如果將來需要重新分配變數的值,請使用 let,但僅在必要的情況下。

黃金法則: 預設使用 const。如果稍後需要變更該值,請切換到 let。

實際例子

  1. const 表示常數值:
const PI = 3.14159;
console.log(PI); // 3.14159

PI = 3; // TypeError: Assignment to constant variable.
登入後複製
登入後複製
登入後複製
登入後複製
  1. let 用於更改值:
let count = 0;

for (let i = 1; i <= 3; i++) {
  count += i; 
}
console.log(count); // 6
登入後複製
登入後複製
登入後複製
登入後複製
  1. 範圍比較(let 與 var):
if (true) {
  let blockScoped = "Solo dentro del bloque";
  var functionScoped = "Disponible fuera también";
}

console.log(functionScoped); // "Disponible fuera también"
console.log(blockScoped); // ReferenceError: blockScoped is not defined
登入後複製
登入後複製
登入後複製
登入後複製
  1. 避免循環和回呼問題:

使用 var,你可能會在循環中出現意想不到的行為,尤其是在非同步函數中:

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // Imprime 3, 3, 3
}
登入後複製
登入後複製
登入後複製
登入後複製

讓我們解決這個問題:

const PI = 3.14159;
console.log(PI); // 3.14159

PI = 3; // TypeError: Assignment to constant variable.
登入後複製
登入後複製
登入後複製
登入後複製

用 let 和 const 取代 var 不僅是一個好的實踐,而且還有助於使你的程式碼更安全、更易讀、更容易調試。讓未來感謝你。

4. 選擇類別:JavaScript 的簡單性

在 JavaScript 中使用 Function.prototype 進行物件導向程式設計是一種較舊且經常容易出錯的方法。相反,ES6 中引入的 classes 提供了更直觀的語法,更接近其他物件導向語言,有利於程式碼的可讀性和可維護性。

類別範例(現代且清晰):

let count = 0;

for (let i = 1; i <= 3; i++) {
  count += i; 
}
console.log(count); // 6
登入後複製
登入後複製
登入後複製
登入後複製

與 Function.prototype 的比較(複雜且不太直觀):

if (true) {
  let blockScoped = "Solo dentro del bloque";
  var functionScoped = "Disponible fuera también";
}

console.log(functionScoped); // "Disponible fuera también"
console.log(blockScoped); // ReferenceError: blockScoped is not defined
登入後複製
登入後複製
登入後複製
登入後複製

如您所見,基於原型的方法需要更多步驟來定義方法,並且對於經驗不足的開發人員來說可能會更加混亂。類別不僅更容易閱讀,而且還可以促進更清晰、更模組化的程式碼。

為什麼要使用類別?

  • 更具可讀性且不易出錯。
  • 它們透過擴展和 super 的使用促進繼承。
  • 與現代工具和 ES6 標準更相容。

5. 在 JavaScript 中使用真正的私有字段

長期以來,JavaScript 開發人員使用下劃線 (_) 等約定來模擬類別中的私有欄位。然而,這只是一種視覺約定,因為仍然可以從類別外部存取這些屬性。現在,多虧了真正的私有欄位,我們可以保證某些屬性完全無法從外部存取。

⚠️ 注意:此功能在某些瀏覽器的控制台中可能無法使用。

為什麼要使用真正的私有欄位?

  1. 真實封裝:保護您的資料並確保它無法在類別上下文之外被存取或修改。
  2. 可讀性:使用 # 前綴可以明確哪些屬性是私有的,從而提高程式碼理解能力。
  3. 資料安全性:防止意外錯誤或無意存取內部屬性。

基本範例:

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // Imprime 3, 3, 3
}
登入後複製
登入後複製
登入後複製
登入後複製

進階範例:受保護的計數器

想像一下,您想要建立一個類別來記錄頁面的造訪次數,但您不希望任何人能夠直接操作該計數器。

const PI = 3.14159;
console.log(PI); // 3.14159

PI = 3; // TypeError: Assignment to constant variable.
登入後複製
登入後複製
登入後複製
登入後複製

在這種情況下,#visits 計數器完全免受外部訪問,這保證了其值不會被不當操縱。

注意事項

  • 私有欄位即使是子類別也無法存取。
  • 如果您需要與繼承中的私有資料交互,請考慮使用受保護的方法而不是私有欄位。

6.使用箭頭功能

箭頭函數是用 JavaScript 寫函數的一種現代而優雅的方式。它們提供更短的語法,並且與傳統函數不同, 自動繼承 this 的上下文,這避免了物件導向程式設計中的常見問題。

它們在高階函數中特別有用,例如map、filter和reduce,我們需要將函數作為參數傳遞。

為什麼要使用箭頭函數?

  1. 更短、更清晰的語法:非常適合保持程式碼更具可讀性。
  2. 此自動的上下文: 完美避免回呼或方法中的錯誤。
  3. 在內聯函數中的理想用途: 就像我們在地圖、過濾器或事件中使用的函數一樣。

實際例子

1.用map來變換數組

let count = 0;

for (let i = 1; i <= 3; i++) {
  count += i; 
}
console.log(count); // 6
登入後複製
登入後複製
登入後複製
登入後複製

2.帶過濾器的濾芯

if (true) {
  let blockScoped = "Solo dentro del bloque";
  var functionScoped = "Disponible fuera también";
}

console.log(functionScoped); // "Disponible fuera también"
console.log(blockScoped); // ReferenceError: blockScoped is not defined
登入後複製
登入後複製
登入後複製
登入後複製

3.用reduce來加值

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // Imprime 3, 3, 3
}
登入後複製
登入後複製
登入後複製
登入後複製

4. 在 DOM 事件中(注意上下文!)

當我們在事件中使用箭頭函數時,this 上下文不會改變,這很有用:

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // Imprime 0, 1, 2
}
登入後複製
登入後複製

提示:何時使用它們

雖然箭頭函數很棒,但它們並不適合所有情況。在需要存取函數上下文本身的情況下,例如使用動態 this 的函數中或需要在原型中編寫方法時,請避免使用它們。

普通函數更好的範例

class Persona {
  constructor(nombre) {
    this.nombre = nombre;
  }

  obtenerNombre() {
    return this.nombre;
  }
}

const persona = new Persona('Juan');
console.log(persona.obtenerNombre()); // 'Juan'
登入後複製

如果將 print 變更為箭頭函數,您將遺失其上下文。

讓我們改進該部分!我添加了一些上下文、更清晰的解釋和一些額外的示例,使其更加完整和有用。

7. 空合併運算子 (??)

空合併運算子 (??) 是邏輯運算子 || 的更精確替代方案分配預設值。而||認為「falsy」是諸如0、false或「」之類的值,運算子?? 僅將 null 或 undefined 評估為「缺失」值。 這使其在許多情況下成為更安全、更具體的選項。

主要區別是什麼?

使用||,任何「假」值都會被預設值取代。

與??,替換為空或未定義的值。這允許您保留“假”值,例如 0 或“”(如果它們在您的上下文中有效)。

基本範例:

const PI = 3.14159;
console.log(PI); // 3.14159

PI = 3; // TypeError: Assignment to constant variable.
登入後複製
登入後複製
登入後複製
登入後複製

另一方面,使用 ||:

let count = 0;

for (let i = 1; i <= 3; i++) {
  count += i; 
}
console.log(count); // 6
登入後複製
登入後複製
登入後複製
登入後複製

實際案例與??

  • 設定預設值而不覆蓋有效值:
if (true) {
  let blockScoped = "Solo dentro del bloque";
  var functionScoped = "Disponible fuera también";
}

console.log(functionScoped); // "Disponible fuera también"
console.log(blockScoped); // ReferenceError: blockScoped is not defined
登入後複製
登入後複製
登入後複製
登入後複製
  • 驗證選用設定:

假設您有一個允許您自訂選項的系統:

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // Imprime 3, 3, 3
}
登入後複製
登入後複製
登入後複製
登入後複製
  • 使用選用屬性時避免錯誤:
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100); // Imprime 0, 1, 2
}
登入後複製
登入後複製

以上是現代 JavaScript 最佳實務 - 第 1 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板