JavaScript có 7 kiểu nguyên thuỷ: string, number, boolean, null, undefined, symbol, bigint.
Đặc điểm chung: bất biến và sao chép theo giá trị.
javascript
let a = 5
let b = a // copy giá trị
b = 10
console.log(a) // 5 — a không bị ảnh hưởng
const o1 = { n: 5 }
const o2 = o1 // copy THAM CHIẾU
o2.n = 10
console.log(o1.n) // 10 — cùng một objectKhông phải nguyên thuỷ: object, array, function, Date, Map, Set — tất cả đều là object và sao chép theo tham chiếu.
javascript
typeof 'a' // 'string'
typeof 1n // 'bigint'
typeof Symbol() // 'symbol'
typeof null // 'object' ← lỗi lịch sử của JS, không sửa được vì phá code cũ
typeof undefined // 'undefined'Hay bị hỏi tiếp: "nguyên thuỷ không có method, sao 'abc'.toUpperCase() chạy được?" — JS tự bọc tạm giá trị vào object wrapper (String) khi gọi method, xong thì bỏ.
Vì vậy gán thuộc tính lên nguyên thuỷ không có tác dụng:
javascript
const s = 'abc'
s.foo = 1 // sloppy: lặng lẽ bỏ qua; strict/module: TypeError
console.log(s.foo) // undefined (sloppy) — wrapper đã bị huỷ