Ignacio Vazquez-Abrams è corretto, ma vediamo esattamente come funziona ...
Da 15.1.2.2 parseInt (string , radix)
:
Quando viene chiamata la funzione parseInt, vengono eseguite le seguenti operazioni:
- Lascia che inputString sia ToString (stringa).
- Sia S una sottostringa appena creata di inputString costituita dal primo carattere che non è StrWhiteSpaceChar e da tutti i caratteri che seguono quel carattere. (In altre parole, rimuovere lo spazio bianco iniziale.)
- Lascia che il segno sia 1.
- Se S non è vuoto e il primo carattere di S è un segno meno -, lascia che il segno sia −1.
- Se S non è vuoto e il primo carattere di S è un segno più + o un segno meno -, quindi rimuovere il primo carattere da S.
- Sia R = ToInt32 (radix).
- Lascia che stripPrefix sia vero.
- Se R ≠ 0, quindi a. Se R <2 o R> 36, restituisce NaN. b. Se R ≠ 16, lasciare stripPrefix essere falso.
- Altrimenti, R = 0 a. Lascia R = 10.
- Se stripPrefix è true, quindi a. Se la lunghezza di S è almeno 2 e i primi due caratteri di S sono “0x” o “0X”, quindi rimuovere i primi due caratteri da S e lasciare R = 16.
- Se S contiene un carattere che non è una cifra radix-R, allora lascia che Z sia la sottostringa di S costituita da tutti i caratteri prima del primo carattere del genere; altrimenti, lascia che Z sia S.
- Se Z è vuoto, restituisce NaN.
- Sia mathInt il valore intero matematico rappresentato da Z nella notazione radix-R, usando le lettere AZ e az per le cifre con valori da 10 a 35. (Tuttavia, se R è 10 e Z contiene più di 20 cifre significative, ogni significativo una cifra dopo la ventesima può essere sostituita da una cifra 0, a scelta dell'implementazione; e se R non è 2, 4, 8, 10, 16 o 32, allora matematica può essere un'approssimazione dipendente dall'implementazione all'intero matematico valore rappresentato da Z nella notazione radix-R.)
- Lascia che number sia il valore Number per mathInt.
- Segno di ritorno × numero.
NOTA parseInt può interpretare solo una porzione iniziale di stringa come valore intero; ignora tutti i caratteri che non possono essere interpretati come parte della notazione di un numero intero e non viene fornita alcuna indicazione che tali caratteri siano stati ignorati.
Ci sono due parti importanti qui. Li ho messi in grassetto entrambi. Quindi, prima di tutto, dobbiamo scoprire qual è la toString
rappresentazione null
. Dobbiamo guardare Table 13 — ToString Conversions
nella sezione 9.8.0 per quelle informazioni:
Fantastico, quindi ora sappiamo che fare toString(null)
internamente produce una 'null'
stringa. Fantastico, ma come gestisce esattamente le cifre (caratteri) che non sono valide all'interno della radice fornita?
Guardiamo sopra 15.1.2.2
e vediamo la seguente osservazione:
Se S contiene un carattere che non è una cifra radix-R, allora lascia che Z sia la sottostringa di S costituita da tutti i caratteri prima del primo carattere del genere; altrimenti, lascia che Z sia S.
Ciò significa che gestiamo tutte le cifre PRIMA del radix specificato e ignoriamo tutto il resto.
Fondamentalmente, fare parseInt(null, 23)
è la stessa cosa di parseInt('null', 23)
. Questo u
fa sì che i due l
vengano ignorati (anche se fanno parte del radix 23). Pertanto, possiamo solo analizzare n
, rendendo l'intera dichiarazione sinonimo di parseInt('n', 23)
. :)
Ad ogni modo, ottima domanda!