DanLevy.net

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.

parseInt("123,456.00")

In generale, parseInt interrompe l’analisi quando incontra un carattere non numerico. Qui si ferma alla virgola, quindi viene restituito solo 123.

0.1 + 0.2 === 0.3

A 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 * 2

Poiché 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.)

Qual è il problema qui?

parseInt('0xFF', 16)

parseInt con una base esadecimale (16) converte "FF" in 255 in decimale. Potresti averlo visto nei codici colore RGB/Hex di CSS.

[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)).

[24, 'Twenty1', 0o42].map(Number)

Number converte i valori in un tipo numerico in modo più rigoroso di parseInt. Qui, 'Twenty1' diventa NaN, mentre 0o42 viene riconosciuto come letterale ottale e convertito in 34.

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

FunzioneparseIntparseFloatNumberBigInt
Ignora spazi bianchi
.map(FN)☑️
Supporta argomento radix
Letterali binari/ottali/esadecimali
Caratteri non validi 42 oh no4242NaNSyntaxError

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! 💪