Bộ ảnh thú vị mô tả kể chuyện so sánh trong Javascript, vô tình lụm xem được cái hình này trên Reddit
Bạn có thể copy nguyên đoạn code này paste vào trình duyệt để xem kết quả
0 == '0'
0 == []
// Nguyên tắc bắt cầu có đúng?
'0' == []
Chuyện gì đã xảy ra vậy?
0 == '0' // => true
Với các ngôn ngữ lập trình khác thì chưa biết, nhưng với javascript ==
sẽ tự ý chuyển 2 giá trị muốn so sánh về cùng một kiểu, hay người ta vẫn gọi là ko quan tâm đến kiểu dữ liệu khi so sánh.
Trong nhiều trường hợp chúng ta cũng có thể sử dụng cách so sánh ==
để tiện, javascript tự động chuyển về một kiểu, tuy nhiên sẽ ko khuyến khích cách này
Theo như specify
Nếu x = Number, y = String, trả về x == ToNumber(y),
Nó đưa giá trị bên phải về number mà không báo cho ai biết hết
0 == [] // => true
Nếu x là String hoặc Number, y là Object, trả về x == ToPrimitive(y)
Đúng! Array trong javascript cũng là object
ToPrimitive(y) ở đây, JS sẽ gọi vào hàm .toString
để convert về kiểu primitive, trường hợp là array nó nối toàn bộ giá trị trong array thành chuỗi
[1, 2, 3].toString();
// => "1,2,3"
['hello','world'].toString();
// => "hello,world"
[].toString();
// => ""
Toàn bộ những điều vô lý này đã được đưa vào văn bản chính quy!
'0' == []
Cứ theo nguyên tắc đã quy định mà làm
Nếu x là String hoặc Number, y là Object, trả về x == ToPrimitive(y)
Bước một ToPrimitive([])
=> chúng ta sẽ trở thành so sánh '0' == ""
, khác nhau rõ ràng hé.
Initializing...