Quiz: Puoi contare su JavaScript?
Sai distinguere parseInt da parseFloat?
parseInt(" 123456.00")La funzione parseInt ignora gli spazi e analizza la sequenza iniziale di cifre come un intero. Qui si ferma al punto decimale, quindi viene restituito solo 123456.
0.1 + 0.2 === 0.3A causa degli errori di precisione dei numeri in virgola mobile, 0.1 + 0.2 non è esattamente uguale a 0.3. A causa del modo in cui i numeri in virgola mobile sono memorizzati in memoria, il risultato è 0.30000000000000004. Lo standard IEEE 754 per la gestione dell’aritmetica in virgola mobile è il colpevole: non può rappresentare alcuni numeri esattamente. Questo è un problema comune in tutti i linguaggi di programmazione. Prima o poi ti imbatterai in un decimale infinitamente ripetuto, e indipendentemente dal linguaggio, il computer deve semplicemente smettere di inseguire cifre infinitamente ripetute.
Alcuni linguaggi come Python e Java hanno Decimal o BigDecimal per gestire questo problema, ma non è integrato in JavaScript. Puoi usare librerie come big.js o decimal.js per gestire questi casi.
(Nota: Alcuni linguaggi sono progettati per gestire frazioni, numeri immaginari, ecc. a un livello logico superiore, preservando le espressioni letterali. Ma devono comunque affrontare gli stessi problemi di precisione in virgola mobile a livello hardware.)
Number.MAX_VALUE * 2Poiché Number.MAX_VALUE è il più grande numero regolare rappresentabile in JavaScript, superare il suo limite causerà rapidamente un overflow - fondamentalmente potresti vedere risultati privi di significato. Moltiplicarlo per 2 restituisce Infinity.
Sai, a volte JavaScript è così.
Cosa potrebbe fare?
5..toFixed(2).toFixed(2) restituisce una rappresentazione in stringa di 5 con due decimali, quindi il risultato è "5.00".
Il doppio punto (5..toFixed(2)) è un ‘trucco’ per accedere al modello a oggetti dei letterali numerici.
parseInt("42") === parseFloat("42")In JavaScript, sia parseInt che parseFloat interpretano la stringa "42" come il numero 42. Pertanto, il confronto parseInt("42") === parseFloat("42") restituisce true. Mentre parseInt smette di analizzare al primo carattere non numerico, parseFloat continua ad analizzare fino a quando incontra un carattere che non fa parte di un numero a virgola mobile. Tuttavia, poiché non ci sono punti decimali o altri caratteri non numerici in "42", entrambe le funzioni restituiscono lo stesso valore.
BigInt("42") === parseInt("42")BigInt è un tipo diverso da number, quindi parseInt("42") (un numero regolare) non è strettamente uguale a BigInt("42"). Per confrontarli, devi convertire entrambi allo stesso tipo: BigInt(parseInt("42")) === BigInt("42").
Quale sarà il risultato?
parseInt("0x2A") === parseInt("2a", 16)Qualsiasi stringa di input che inizia con 0x viene automaticamente trattata come esadecimale (radice 16).
È quindi equivalente a passare una radice di 16. Quindi, parseInt("0x2A") è uguale a parseInt("2a", 16). (Non fa distinzione tra maiuscole e minuscole.)
[24, 'One', 42].map(parseInt)Il secondo argomento di parseInt (il radix) si allinea con l’argomento index dei metodi degli array. Questo porta a risultati inaspettati, poiché parseInt("One", 1) restituisce NaN a causa dell’input non valido.
Il primo elemento, 24, viene interpretato come 24 in base 0 (rilevamento automatico), quindi rimane 24. Il secondo elemento, 'One', viene interpretato come NaN in base 1. Il terzo elemento, 42, viene interpretato usando la base 2. In base 2, '42' è NaN, quindi il risultato è [24, NaN, NaN].
Questo è un errore comune con parseInt e map. Se vuoi convertire un array di stringhe in numeri, l’unico metodo “built-in” sicuro è .map(Number) o aggiungere un callback/closure .map(x => parseInt(x, 10)).
Quale sarà il risultato di questo codice?
console.log(parseInt(null), Number(null))parseInt converte l’input in una stringa, quindi null diventa "null". Poiché "null" non ha caratteri validi in base 10 (numeri regolari), restituirà NaN.
Number(null) restituisce 0, perché a JS piace tenerti sulle spine.
Perché? Beh, potrei approfondire se c’è interesse.
Quale sarà il risultato di questo incantesimo?
parseInt(null, 36)Poiché parseInt converte sempre l’input in una stringa, null diventa la stringa "null".
In base 36 (esatrigesimale, se stai seguendo), la stringa "null" rappresenta 1112745.
I valori sequenziali di nulk, null e nulm sono rispettivamente 1112744, 1112745 e 1112746 in base 36.
Tabella di confronto
| Funzione | parseInt | parseFloat | Number | BigInt |
|---|---|---|---|---|
| Ignora spazi bianchi | ✅ | ✅ | ✅ | ✅ |
.map(FN) | ❌ | ☑️ | ✅ | ✅ |
| Supporta argomento radix | ✅ | ❌ | ❌ | ❌ |
| Letterali binari/ottali/esadecimali | ✅ | ❌ | ✅ | ✅ |
Caratteri non validi 42 oh no | 42 | 42 | NaN | SyntaxError |
Come te la sei cavata? 🧐
Cerchi una pausa dopo così tanto binario?
Pftt, ricorda: pausa dopo le competenze!
Vai nella mia palestra per affrontare altre sfide! 💪