Innanzitutto, vorrei sottolineare che NaN
è un valore molto speciale: per definizione, non è uguale a se stesso. Ciò deriva dallo standard IEEE-754 su cui attingono i numeri JavaScript. Il valore "non un numero" non è mai uguale a se stesso, anche quando i bit corrispondono esattamente. (Che non sono necessariamente in IEEE-754, consente più valori diversi "non un numero"). Ecco perché anche questo viene fuori; tutti gli altri valori in JavaScript sono uguali a se stessi, NaN
è semplicemente speciale.
... mi manca un valore in JavaScript che restituirà true per x! == x e false per x! = x?
No non siete. L'unica differenza tra !==
e !=
è che quest'ultimo farà la coercizione dei tipi, se necessario, per far sì che i tipi degli operandi siano gli stessi. In x != x
, i tipi di operandi sono gli stessi, quindi è esattamente lo stesso di x !== x
.
Ciò è chiaro dall'inizio della definizione dell'operazione di uguaglianza astratta :
- ReturnIfAbrupt (x).
- ReturnIfAbrupt (y).
Se Tipo (x) è uguale a Tipo (y), allora
Restituisce il risultato dell'esecuzione del confronto sull'uguaglianza rigorosa x === y.
...
I primi due passaggi sono idraulici di base. Quindi, in effetti, il primo passo di ==
è vedere se i tipi sono gli stessi e, in tal caso, fare ===
invece. !=
e ne !==
sono solo versioni negate.
Quindi, se Flanagan ha ragione, ciò NaN
darà solo per il vero x !== x
, possiamo essere sicuri che è anche vero che solo il NaN
dare per il vero x != x
.
Molti programmatori JavaScript usano ===
e !==
per evitare alcune insidie attorno alla coercizione del tipo che fanno gli operatori liberi, ma in questo caso non c'è nulla da leggere sull'uso dell'operatore rigoroso rispetto a quello libero.
!==
controlli ai!=
controlli. Per quanto ne so non c'è altro valore dovex != x
. Ma ci sono due distinti gruppi di sviluppatori JavaScript: quelli che preferiscono!=
e quelli che preferiscono!==
, sia per velocità, chiarezza, espressività, ecc.