ES6+ 語法與設計模式
2025年7月1日
ES5 vs ES6+
語法項目 | ES5 | ES6+ |
---|---|---|
變數宣告 | var | let , const |
函式定義 | function () {} | () => {} |
字串拼接 | 'Hi ' + name | `Hi ${name}` |
var / let / const 比較
項目 | var | let | const |
---|---|---|---|
作用域 | 函式作用域 | 區塊作用域 | 區塊作用域 |
可重新指定值 | ✔ | ✔ | ✘(但可改物件內容) |
可重複宣告 | ✔ | ✘ | ✘ |
變數提升 | ✔(初始為 undefined) | ✘(TDZ) | ✘(TDZ) |
為什麼不要用 var
?
1. 沒有區塊作用域(block scope)
使用 var
宣告的變數不會限制在區塊範圍內,容易造成變數污染:
if (true) {
var name = "Lan";
}
console.log(name); // "Lan"
2. 存在「變數提升」(Hoisting)
變數會被提升至作用域頂端,但不包含賦值,容易誤會為可用:
console.log(score); // undefined
var score = 100;
改用 let
/ const
的好處
關鍵字 | 特性 |
---|---|
let | 有區塊作用域、無提升、可重新賦值 |
const | 有區塊作用域、無提升、不可重新賦值(適合常數) |
if (true) {
let username = "Lan";
const age = 25;
}
console.log(username); // ReferenceError
補充:那為什麼有時還是看到 var
?
- 出現在舊教學或歷史專案中
- 舊瀏覽器或不支援 ES6 的執行環境
- 開發者個人習慣(不建議)
實戰建議
使用情境 | 建議關鍵字 |
---|---|
可變資料 | let |
常數(不可變) | const |
任何情況 | 不要用 var |
常見設計模式範例
單例模式(Singleton Pattern)
class Singleton {
static instance: Singleton
private constructor() {}
static getInstance() {
if (!Singleton.instance) {
Singleton.instance = new Singleton()
}
return Singleton.instance
}
}
const a = Singleton.getInstance()
const b = Singleton.getInstance()
console.log(a === b) // true
工廠模式(Factory Pattern)
function createUser(type: string) {
if (type === 'admin') return { role: 'admin', permission: 'all' }
return { role: 'user', permission: 'read' }
}
const admin = createUser('admin')
const user = createUser('user')
觀察者模式(Observer Pattern)
class Subject {
observers: Function[] = []
subscribe(fn: Function) {
this.observers.push(fn)
}
notify(data: any) {
this.observers.forEach(fn => fn(data))
}
}
const subject = new Subject()
subject.subscribe(data => console.log('Received:', data))
subject.notify('Hello')
Javascript 進階?參考: TypeScript 的泛型與條件型別應用