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 toStringrappresentazione null. Dobbiamo guardare Table 13 — ToString Conversionsnella 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.2e 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 ufa sì che i due lvengano 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!