Tìm hiểu sự khác biệt giữa strict equality vs. loose equality operators trong JavaScript, và tại sao nó quan trọng.
Trong JavaScript, bạn có thể dùng hai toán tử so sánh bằng để so sánh giá trị: loose equality operator == (dấu bằng kép) và strict equality operator === (dấu bằng ba). Chúng trông giống nhau bề ngoài, nhưng không, và việc hiểu sự khác biệt rất quan trọng vì nếu không, bạn có thể gặp bug.
Thử chạy mã sau trong console:
let a = 4 // number let b = "4" // string console.log(a == b) // output: true
Tại sao JavaScript nói trên là true khi nó không phải? Chúng ta có giá trị kiểu number so sánh với giá trị kiểu string — làm sao chúng có thể bằng nhau?
Đó là vì khi dùng loose equality operator == nó chuyển đổi các toán hạng sang cùng kiểu (nếu chưa cùng kiểu), rồi so sánh giá trị.
Quá trình này gọi là type coercion (ép kiểu — khi hai giá trị được so sánh sau khi cố gắng chuyển đổi chúng sang kiểu chung).
Vì vậy, trong ví dụ trên, kết quả true là đúng, vì trước khi so sánh, kiểu giá trị của chúng được chuyển đổi thành giống nhau.
Wow, đó là ngu ngốc!
Tôi đồng ý, nhưng thực tế là vậy. Điều quan trọng là bạn nhận ra "đặc điểm" bất tiện này của JavaScript.
Và đó là lúc strict equality operator === xuất hiện và cứu vãn tình hình vì nó không chuyển đổi kiểu giá trị, nó nghiêm ngặt so sánh kiểu giá trị trước rồi mới kiểm tra bằng nhau:
let a = 4 let b = "4" console.log(a === b) // output: false
Giờ ra false, vì dù cả hai biến (a & b) chứa giá trị "4", nhưng toán hạng khác kiểu giá trị (a là number, b là string).
Khác với toán tử non-strict ==, toán tử strict === cho kết quả dự đoán được, đó là lý do hầu hết lập trình viên khuyên không dùng ==.
Có bao giờ lý do tốt để dùng toán tử so sánh non-strict trong JavaScript?
Hiếm khi, nhưng tôi chắc bạn tìm được ví dụ. Theo quy tắc chung, mặc định dùng strict === equality operator, trừ khi có lý do rõ ràng phải dùng non-strict ==. Cách này giúp loại trừ bug do dùng sai toán tử so sánh, và đó luôn là lợi ích.