Is 'isNaN' 'un design errato o un design non disponibile con compromessi?

2

Il mio primo linguaggio di programmazione è python. E recentemente sto imparando C e javascript.
In javascript, c'è un design che mi ha confuso molto, di default la funzione isNaN .

Metti da parte le sue strane eccezioni nella specifica (che è difficile da trovare), come isNaN("") , isNaN(["22"]) .
La cosa più frustrante è che il risultato di isNaN consuma la mia energia di pensiero, anche se un po 'ogni volta, prima di stabilire un'intuizione a riguardo (che richiede un bel po' di sforzi)

Ma amico, siamo pigri. E questo design non segue l'istinto umano.
Gli esempi seguenti riportano come funziona il mio cervello quando vedo i due tipi di espressioni in python e javascript:

isNaN(n)
false

# THOUGHTS:
# The result of isNaN(n) is false, what does it mean?
# it means n is not a number is false.
# OK, let me think for a while..
# So, I assume it is a number(with hesitation)


type(n) == int
False

# THOUGHTS:
# type(n) == int returns False, what does it mean?
# So it tells us that 'the type of n equals int' is false
# So the type of n is not equal to int!
# I think n is not a int.

Penso che gli esseri umani abbiano la tendenza a presumere che tutto sia Vero all'inizio Quindi più livelli negativi su affermazione aumenteranno i nostri costi di riconoscimento.
In questa vista, il design di isNaN è negativo e isN (isNumber) è una soluzione migliore per la comprensione umana.
Ma da scettico, mi chiedo se possa esserci qualche storia di fondo su questo progetto, per raggiungere una funzionalità importante, l'autore ha scelto questo design come compromesso? C'era una buona ragione, o si tratta solo di una carenza progettuale (nel senso di umanità)?

    
posta Zen 19.10.2015 - 13:13
fonte

3 risposte

12

Lo scopo di isNaN non è controllare se un valore è nummeric o no. Lo scopo effettivo è verificare se un numero in virgola mobile ha il valore speciale di NaN . Il valore speciale NaN è assegnato ai risultati di operazioni matematicamente impossibili, come la divisione 0/0 o la conversione di una stringa alfabetica in un numero.

Tuttavia, quando si tenta di utilizzare isNaN su un valore che non è un numero a virgola mobile, Javascript prima tenta di convertirlo in un numero e quindi controlla se quel numero ha il valore speciale NaN . Per rendere le cose più confuse, undefined è anche trattato come NaN da Javascript, quindi quando il valore non può essere convertito in un numero, viene considerato NaN .

Per proteggersi dal mal di testa, usa isNaN solo quando stai veramente cercando il valore NaN a virgola mobile.

Quando vuoi sapere se una variabile è un numero, usa typeof variable == 'number' (il valore di NaN è anche di tipo numero, a proposito). Quando vuoi sapere se una stringa può essere convertita in un numero, usa isNaN(Number(variable)) .

    
risposta data 19.10.2015 - 13:39
fonte
9

"Not a Number" (NaN) ha le sue radici in qualcosa di molto più grande di JavaScript. Devi tornare indietro al 1985 e lo standard IEEE-754 per la matematica in virgola mobile per comprenderlo. I NaN si verificano in diversi modi durante operazioni matematiche ( per esempio , divisione di 0 per 0) e le funzioni isNaN() servono a determinare quando un numero presunto non è in realtà un numero. L'implementazione particolare di isNaN() di JavaScript è, sfortunatamente, un sottoprodotto della sua volontà di trattare valori che non sono ovviamente numeri come numeri.

    
risposta data 19.10.2015 - 13:26
fonte
3

Il isNaN di Javascript è un po 'complicato sul concetto di ciò che rappresenta un numero non significativo. L'intento di NaN è di rappresentare forme numeriche indeterminate come 0/0 o ∞ / ∞, e di rappresentare il risultato di calcoli numerici fuori range come sqrt(-1) e asin(2) . La versione ES6 di ECMAScript risolve questo problema aggiungendo la funzione Number.isNaN . Questa nuova funzione non costringe un valore non numerico in un valore numerico prima del test. Il risultato di chiamare Number.isNaN con un valore non numerico è falso. Ciò rende più chiaro che lo scopo di isNaN è di verificare un valore numerico che non rappresenta un valore numerico.

C'è una cosa buffa dei NaN: i confronti aritmetici che coinvolgono un NaN devono sempre restituire false. Anche x == x (o x===x in javascript) restituirà false nel caso speciale in cui x è un NaN. Tutto ciò che non è un NaN sarà paragonabile a se stesso, dando un modo criptico di verificare se qualcosa è un NaN. L'utilizzo di isNaN(x) fa un lavoro molto migliore di intento di trasmissione rispetto a !(x==x) .

    
risposta data 19.10.2015 - 15:46
fonte