Type coercion là việc JavaScript tự đổi kiểu khi phép toán nhận hai kiểu khác nhau.
Hai luật chi phối gần hết các trường hợp:
1. + ưu tiên chuỗi — chỉ cần một toán hạng là chuỗi thì thành nối chuỗi.
2. Mọi toán tử số học khác ép về số.
javascript
'5' + 3 // '53' — nối chuỗi
'5' - 3 // 2 — ép về số
'5' * '2' // 10
true + 1 // 2 — true → 1
null + 1 // 1 — null → 0
undefined + 1 // NaN — undefined → NaN
[] + {} // '[object Object]'Với object, JS gọi Symbol.toPrimitive → valueOf() → toString() cho tới khi được giá trị nguyên thuỷ:
javascript
const money = {
amount: 50000,
valueOf() { return this.amount },
toString() { return `${this.amount}đ` },
}
money + 1000 // 51000 — dùng valueOf
`${money}` // '50000đ' — template string dùng toStringCách phòng: dùng ===, và ép kiểu tường minh khi cần — Number(x), String(x), Boolean(x).
Riêng chuỗi sang số nên dùng Number() chứ không parseInt() nếu muốn chuỗi rác bị từ chối: Number('12abc') ra NaN, còn parseInt('12abc') ra 12.