基礎

基礎 在 JavaScript

3 個練習

關於 基礎

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 模組。除了讓程式碼能選擇性地公開元件,例如函式、類別、變數和常數之外,它還帶來了一整系列的其他功能,例如:

  • 重新命名匯出與匯入,讓你能避免命名衝突,
  • 動態匯入,會視需求載入程式碼,
  • Tree shaking,透過移除沒有副作用的模組,甚至移除_沒有用到_的模組內容,來縮小最終程式碼的大小,
  • 匯出即時綁定,讓你能匯出一個值,當原始值改變時,所有匯入該值的地方也會跟著改變。

一個具體的例子是 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
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 基礎