Po pierwsze, chciałbym zaznaczyć, że NaN
jest 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, NaN
są 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 != x
programie 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 NaN
da prawdę x !== x
, możemy być pewni, że prawdą jest również to, że tylko NaN
da 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.