Primitive, object, coercion và equality algorithms
JavaScript có dynamic values nhưng semantics cụ thể; production bug thường đến từ implicit conversion, reference aliasing và numeric limits.
1. Primitive và object
Undefined, Null, Boolean, String, Symbol, Number và BigInt là primitive; Object giữ properties/internal slots. typeof null là legacy result; arrays và functions vẫn là objects. Primitive immutable, còn object variable giữ reference nên assignment/copy có thể alias cùng state.
2. ToPrimitive và implicit coercion
Operator có thể gọi ToPrimitive rồi ToString/ToNumber theo hint. + vừa numeric addition vừa string concatenation; boolean falsy set nhỏ, trong khi "0", [] và {} là truthy. Convert explicit tại boundary để code review nhìn thấy intent.
"5" + 1 // "51"
"5" - 1 // 4
Boolean("0") // true
Number.isNaN(value) // không ép kiểu ngầm
3. Equality algorithms
| Algorithm | Key behavior | Typical use |
|---|---|---|
=== | Không coerce; NaN khác chính nó; +0/-0 bằng | Default strict comparison |
Object.is | NaN bằng chính nó; phân biệt +0/-0 | Exact identity edge cases |
| SameValueZero | NaN bằng; +0/-0 bằng | Set/Map/includes semantics |
== | Abstract equality có conversion rules phức tạp | Chỉ dùng khi rule được intentional/documented |
4. Number, BigInt và precision
Number là IEEE-754 binary64; integer an toàn tới 2^53 - 1 và decimal rounding cần domain policy. BigInt không trộn trực tiếp với Number trong phép toán và không tự giải quyết decimal money; dùng integer minor units hoặc decimal library có quy tắc rounding/serialization rõ.
- Kiểm tra overflow/underflow và NaN/Infinity trước khi ghi persistence.
- JSON không có BigInt native; cần serialization contract.
- So sánh floating-point theo tolerance phù hợp domain, không dùng equality tuyệt đối tùy tiện.