JavaScript 是一種動態、以原型為基礎的語言。它只有少數幾種原始型別,其他一切都被視為物件。
JavaScript 最為人熟知的身分是網頁的腳本語言,但許多非瀏覽器環境也使用它,例如 Node.js。這門語言仍在積極發展中;由於具備多重範式的特性,它支援多種程式設計風格。JavaScript 是動態語言,支援物件導向、指令式與宣告式(例如函式程式設計)等風格。
在 JavaScript 中,要把值指定給名稱,主要有幾種方式:使用變數或常數。在 Exercism 上,變數一律以 camelCase 撰寫,常數則以 SCREAMING_SNAKE_CASE 撰寫。這件事並沒有官方指南可遵循,各家公司和組織也都有各自的風格指南。你愛怎麼寫變數都可以。按照練習準備的方式來寫,好處是它們在網頁介面與大多數 IDE 中會有不同的標示方式。
在 JavaScript 中,可以使用 const、let 或 var 關鍵字來定義變數。
使用let或var時,一個變數在其生命週期內可以參照不同的值。例如,myFirstVariable可以用賦值運算子=定義並重新定義許多次:
let myFirstVariable = 1;
myFirstVariable = 'Some string';
myFirstVariable = new SomeComplexClass();
和let與var不同,用const定義的變數只能賦值一次。在 JavaScript 中,這正是用來定義常數的方式。
const MY_FIRST_CONSTANT = 10;
// Can not be re-assigned.
MY_FIRST_CONSTANT = 20;
// => TypeError: Assignment to constant variable.
const關鍵字在變數與常數_兩者_中都會被提到。談到常數時,另一個常一起出現的概念是(不)可變性。
const關鍵字只能讓_綁定_本身不可變,也就是說,const變數只能被賦值一次。在 JavaScript 中,只有原始型別的值是不可變的。不過,非原始型別的值仍然可以被修改。
const MY_MUTABLE_VALUE_CONSTANT = { food: 'apple' };
// This is possible
MY_MUTABLE_VALUE_CONSTANT.food = 'pear';
MY_MUTABLE_VALUE_CONSTANT;
// => { food: "pear" }
一般來說,在 Exercism 以及許多其他組織和專案的風格指南中,不要修改看起來像const SCREAMING_SNAKE_CASE的值。嚴格來說,這些值_可以_被改變,但為了清楚起見,同時也為了管理 Exercism 上大家的預期,我們不鼓勵這麼做。當這件事_必須_強制執行時,請使用 Object.freeze(value)。
const MY_VALUE_CONSTANT = Object.freeze({ food: 'apple' });
// This silently fails
MY_VALUE_CONSTANT.food = 'pear';
MY_VALUE_CONSTANT;
// => { food: "apple" }
在實際的專案裡,不太可能看到整個程式碼庫到處都是Object.freeze,但「永遠不要修改SCREAMING_SNAKE_CASE的值」是個好規則,通常會透過 linter 之類的自動化分析來強制執行。
在 JavaScript 中,功能單位會封裝在_函式_裡,如果幾個函式屬於同一組,通常會把它們放在同一個檔案中。這些函式可以接受參數(引數),並能使用return關鍵字_回傳_值。呼叫函式時使用()語法。
function add(num1, num2) {
return num1 + num2;
}
add(1, 3);
// => 4
💡 在 JavaScript 中,宣告函式的方式_很多_。這些其他方式的寫法和使用
function關鍵字不同。這個 Track 會試著逐步介紹它們,但如果你已經知道這些方式,儘管使用任何一種。大多數情況下,用哪一種並沒有好壞之分。
export和import關鍵字是很強大的工具,能把一般的 JavaScript 檔案變成 JavaScript 模組。除了讓程式碼能選擇性地公開元件,例如函式、類別、變數和常數之外,它還帶來了一整系列的其他功能,例如:
一個具體的例子是 Exercism JavaScript Track 上測試的運作方式。每個練習至少有一個實作檔案,例如lasagna.js,而每個練習至少有一個測試檔案,例如lasagna.spec.js。實作檔案用export公開對外的 API,測試檔案則用import存取這些內容,這就是它測試實作結果的方式。
// file.js
export const MY_VALUE = 10;
export function add(num1, num2) {
return num1 + num2;
}
// file.spec.js
import { MY_VALUE, add } from './file';
add(MY_VALUE, 5);
// => 15