Họ đang đo gì
Bạn có biết ngôn ngữ có góc tối và bạn xử lý chúng bằng công cụ nào.
Trả lời ngắn~30 giây
=== so sánh không ép kiểu; == ép kiểu theo một bảng quy tắc khá rối trước khi so. NaN === NaN là false vì theo IEEE 754, NaN không bằng chính nó — muốn kiểm tra thì dùng Number.isNaN() hoặc Object.is(). Quy ước thực hành: dùng === mọi lúc, trừ đúng một trường hợp x == null để bắt cả null và undefined.
Giải thích sâu
Chỗ đáng nói là === cũng không phải “bằng nhau theo trực giác”. Nó sai với NaN như trên, và nó coi +0 === -0 là true dù hai giá trị này phân biệt được — chia cho chúng ra Infinity và -Infinity. Object.is() sinh ra để xử lý đúng hai ca này, và đó là cách so sánh mà React dùng khi quyết định state có đổi hay không.
Với ==, thứ khiến nó nguy hiểm không phải là nó ép kiểu, mà là bảng quy tắc không bắc cầu: '' == 0 đúng, '0' == 0 đúng, nhưng '' == '0' sai. Một phép so sánh mà A bằng B, B bằng C nhưng A khác C thì không thể suy luận được, nên tránh hẳn rẻ hơn là học thuộc.
NaN === NaN // false
Number.isNaN(NaN) // true
Object.is(NaN, NaN) // true
0 === -0 // true
Object.is(0, -0) // false
'' == 0 // true
'0' == 0 // true
'' == '0' // false <- không bắc cầu
null == undefined // true <- trường hợp duy nhất nên dùng ==
null === undefined // falseCâu hỏi tiếp theo họ sẽ hỏi
?isNaN() và Number.isNaN() khác gì?
isNaN() ép kiểu tham số trước, nên isNaN('abc') trả true dù 'abc' không phải NaN. Number.isNaN() không ép kiểu và chỉ đúng với NaN thật. Luôn dùng cái sau.
Trả lời thế này là mất điểm
- Nói
==“so sánh giá trị” còn===“so sánh cả kiểu”. Câu này nghe được nhưng không giải thích nổi vì sao'' != '0'.