Po pierwsze, chciałbym zaznaczyć, że NaNjest to bardzo szczególna wartość: z definicji nie jest sobie równa. Wynika to ze standardu IEEE-754, z którego korzystają numery JavaScript. Wartość „nie jest liczbą” nigdy nie jest równa sobie, nawet jeśli bity są dokładnie zgodne. (Które niekoniecznie w IEEE-754, zezwala na wiele różnych wartości „nie jest liczbą”). Dlatego właśnie to się pojawia; wszystkie inne wartości w JavaScript są sobie równe, NaNsą po prostu wyjątkowe.
... czy brakuje mi jakiejś wartości w JavaScript, która zwróci prawdę dla x! == x i fałsz dla x! = x?
Nie, nie jesteś. Jedyna różnica między !==i !=polega na tym, że ten ostatni wykona wymuszenie typu, jeśli to konieczne, aby uzyskać takie same typy operandów. W x != xprogramie typy operandów są takie same, więc jest dokładnie takie samo, jak x !== x.
Jest to jasne od początku definicji Operacji Abstrakcyjnej Równości :
- ReturnIfAbrupt (x).
- ReturnIfAbrupt (y).
Jeśli Type (x) jest taki sam jak Type (y), to
Zwróć wynik wykonywania Ścisłego porównania równości x === y.
...
Pierwsze dwa kroki to podstawowa instalacja hydrauliczna. W efekcie pierwszym krokiem ==jest sprawdzenie, czy typy są takie same, a jeśli tak, to ===zamiast tego zrobić . !=i !==są po prostu zanegowanymi wersjami tego.
Więc jeśli Flanagan ma rację, że tylko NaNda prawdę x !== x, możemy być pewni, że prawdą jest również to, że tylko NaNda prawdę x != x.
Wielu programistów JavaScript domyślnie używa ===i !==unika pewnych pułapek związanych z wymuszaniem typów, jakie stosują operatory loose, ale nie ma nic do czytania w używaniu przez Flanagana operatora ścisłego i luźnego w tym przypadku.
!==czeki od!=czeków. O ile mi wiadomo, nie ma innej wartości, w którejx != x. Ale są dwie odrębne grupy programistów JavaScript: ci, którzy wolą!=i ci, którzy wolą!==, czy to ze względu na szybkość, przejrzystość, ekspresję itp.