JS có 5 primitive type: undefined, null, boolean, string, number (và symbol, bigint ES6+). Còn lại là object.
Primitive boolean, string, number có **wrapper object**: Boolean, String, Number.
Lấy primitive từ wrapper: .valueOf()
console.log(typeof true); // "boolean"
console.log(typeof new Boolean(true)); // "object"
console.log(typeof new Boolean(true).valueOf()); // "boolean"
console.log(typeof "abc"); // "string"
console.log(typeof new String("abc")); // "object"
console.log(typeof new String("abc").valueOf()); // "string"
console.log(typeof 123); // "number"
console.log(typeof new Number(123)); // "object"
console.log(typeof new Number(123).valueOf()); // "number"
Auto-coercion
JS tự chuyển primitive ↔ object khi cần (ví dụ: "abc".length → wrap String → truy cập length → unwrap).
Lưu ý: valueOf() dùng nội bộ. Hiếm khi gọi trực tiếp trừ khi debug type.