毫無疑問,JavaScript 是世界上最常用的程式語言,對我們日常生活中最重要的技術之一:網路有著巨大的影響。這種力量伴隨著巨大的責任,而 JavaScript 生態系統一直在快速發展,因此很難跟上最佳實踐。
在本文中,我們將探索現代 JavaScript 中的一些最佳實踐,以編寫更清晰、可維護且高效的程式碼。
每個項目可能都有特定的規則來維護程式碼一致性。這些規則將始終優先於任何外部建議,包括本文中的建議。在專案中實施實踐之前,請確保它符合既定規則並且所有團隊成員都同意。
自 1995 年創建以來,JavaScript 已經發生了巨大的發展。您在互聯網上找到的許多舊做法可能已經過時了。在實施技術之前,請先驗證它是否與該語言的當前版本相容。
儘管 var 仍然有效,但它的使用被認為已過時,並且在許多情況下,由於其功能範圍,可能會引入難以追踪的錯誤。另一方面,let 和 const 給我們一個更可預測且安全範圍,僅限於聲明它們的區塊。
黃金法則: 預設使用 const。如果稍後需要變更該值,請切換到 let。
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
使用 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 不僅是一個好的實踐,而且還有助於使你的程式碼更安全、更易讀、更容易調試。讓未來感謝你。
在 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
如您所見,基於原型的方法需要更多步驟來定義方法,並且對於經驗不足的開發人員來說可能會更加混亂。類別不僅更容易閱讀,而且還可以促進更清晰、更模組化的程式碼。
為什麼要使用類別?
長期以來,JavaScript 開發人員使用下劃線 (_) 等約定來模擬類別中的私有欄位。然而,這只是一種視覺約定,因為仍然可以從類別外部存取這些屬性。現在,多虧了真正的私有欄位,我們可以保證某些屬性完全無法從外部存取。
⚠️ 注意:此功能在某些瀏覽器的控制台中可能無法使用。
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 計數器完全免受外部訪問,這保證了其值不會被不當操縱。
箭頭函數是用 JavaScript 寫函數的一種現代而優雅的方式。它們提供更短的語法,並且與傳統函數不同, 自動繼承 this 的上下文,這避免了物件導向程式設計中的常見問題。
它們在高階函數中特別有用,例如map、filter和reduce,我們需要將函數作為參數傳遞。
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 }
當我們在事件中使用箭頭函數時,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 變更為箭頭函數,您將遺失其上下文。
讓我們改進該部分!我添加了一些上下文、更清晰的解釋和一些額外的示例,使其更加完整和有用。
空合併運算子 (??) 是邏輯運算子 || 的更精確替代方案分配預設值。而||認為「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中文網其他相關文章!