Trước hết tôi muốn nói rằng tôi biếtisNaN()
Và Số.isNaN()
Công việc. Tôi đang đọc tác phẩm của David Flanagan Hướng dẫn xác định, anh ấy đưa ra một ví dụ về cách kiểm tra xem một giá trị có phải là NaN
:
x !== x
Điều này sẽ dẫn đến ĐÚNG VẬY
nếu và chỉ nếu x
Đúng NaN
.
Nhưng bây giờ tôi có một câu hỏi: tại sao anh ấy lại dùng phép so sánh chặt chẽ? Bởi vì có vẻ như
x != x
Cư xử theo cùng một cách. Sử dụng cả hai phiên bản có an toàn không hay tôi đang thiếu thứ gì đó trong JavaScript sẽ trả về ĐÚNG VẬY
giá trị cho x !== x
Và SAI
vì x != x
?
Đầu tiên, hãy để tôi chỉ ra NaN
là một giá trị rất đặc biệt: theo định nghĩa, nó không bằng chính nó. Điều này xuất phát từ tiêu chuẩn IEEE-754 làm cơ sở cho các số JavaScript. Giá trị "không phải số" không bao giờ bằng chính nó, ngay cả khi các bit khớp chính xác. (Chúng không nhất thiết phải có trong IEEE-754, cho phép nhiều giá trị "không phải số" khác nhau.) Đó là lý do tại sao điều này xảy ra; tất cả các giá trị khác trong JavaScript đều bằng chính chúng,NaN
Chỉ đặc biệt thôi.
...tôi có bỏ lỡ giá trị nào trong JavaScript sẽ trả về true cho x !== x và false cho x != x không?
Không, bạn không phải vậy. !==
Và !=
Sự khác biệt duy nhất là cái sau sẽ thực hiện ép kiểu khi cần thiết để tạo ra các toán hạng cùng loại. hiện hữu x != x
trong , các loại toán hạng giống nhau, vì vậy và x !== x
Hoàn toàn giống nhau.
Điều này bắt đầu từ Phép toán Trừu tượng Bình đẳng Định nghĩa của nó là rõ ràng ngay từ đầu. :
- Trả vềNếuĐột ngột(x).
- Trả vềNếuĐột ngột(y).
Nếu Type(x) giống với Type(y), thì
Trả về kết quả thực hiện So sánh đẳng thức nghiêm ngặt x === y.
...
Hai bước đầu tiên là hệ thống ống nước cơ bản. Vì vậy, thực sự,==
Bước đầu tiên là xem các loại có giống nhau không và nếu có, hãy thực hiện thay thế ===
。 !=
Và !==
Chỉ là một phiên bản tiêu cực của nó.
Vì vậy, nếu Flanagan đúng thì chỉ NaN
对 x !== x
là đúng, chúng ta có thể chắc chắn rằng chỉ NaN
sẽ được x != x
Mang lại giá trị đích thực.
Theo mặc định, nhiều lập trình viên JavaScript sử dụng ===
Và !==
Để tránh một số cạm bẫy của việc ép kiểu do các toán tử lỏng lẻo thực hiện, không có gì cần đọc về việc Flanagan sử dụng các toán tử chặt chẽ và lỏng lẻo trong trường hợp này.
Tôi là một lập trình viên xuất sắc, rất giỏi!