Che cos’è esattamente la coercizione di tipo in Javascript?

Che cos’è esattamente la coercizione di tipo in Javascript?

Ad esempio, sull’uso di == invece di === ?

La coercizione di tipo significa che quando gli operandi di un operatore sono di tipo diverso, uno di essi verrà convertito in un valore “equivalente” del tipo dell’altro operando. Ad esempio, se lo fai:

 boolean == integer 

l’operando booleano verrà convertito in un intero: false diventa 0 , true diventa 1. Quindi i due valori vengono confrontati.

Tuttavia, se si utilizza l’operatore di confronto senza conversione === , non si verifica tale conversione. Quando gli operandi sono di tipi diversi, questo operatore restituisce false e confronta solo i valori quando sono dello stesso tipo.

Iniziamo con una breve introduzione per digitare sistemi che penso possano aiutarti a capire l’idea generale della coercizione di tipo.

Il sistema di tipi di un linguaggio definisce regole che ci dicono quali tipi di dati esistono in quella lingua e come possono essere combinati usando operatori diversi. Ad esempio, una regola di questo tipo potrebbe specificare che l’operatore più (+) agisce solo sui numeri. Queste regole esistono principalmente per impedirti di spararti ai piedi. Ma cosa succede quando il programmatore rompe quella regola nel programma? Non c’è nulla che impedisca al programmatore di digitare {} + {} o “hello” + 5 in un programma anche se la lingua non ritiene che tali espressioni abbiano alcun senso.

Ciò che in definitiva accade in quelle situazioni dipende dalla rigidità del linguaggio rispetto alle sue regole di tipo.

Un sistema di tipo linguistico spesso contiene una delle due posizioni su di te che infrange le sue regole:

  1. Dì “Ehi, non è bello!” E fai subito un crash del tuo programma.
  2. Dì “Non posso fare nulla con {} … ma posso fare qualcosa con i numeri” e provare a convertire {} in un numero.

Le lingue con sistemi di tipi che prendono la prima posizione riguardo alle sue regole sono colloquialmente denominate lingue “fortemente tipizzate”. Sono severi nel non lasciarti infrangere le sue regole. Quelli che adottano il secondo approccio (come JavaScript) sono indicati come lingue “debolmente tipizzate” o “non tipizzate”. Certo, puoi infrangere le regole, ma non sorprenderti quando converte il tipo di dati che hai descritto nel tuo programma con la forza per rispettare le sue regole. Quel comportamento è noto come … (rullo di tamburi) … tipo coercizione .

Ora diamo un’occhiata ad alcuni esempi in JavaScript. Innanzitutto, iniziamo con un’espressione che non porta alla forzatura di tipo.

 5 + 5 

Usare l’operatore + con due numeri che è perfettamente valido. Il programma tratterà + per significare “aggiungi” e aggiungerà felicemente i due numeri. Nessuna conversione necessaria

Ma per quanto riguarda …

 [] + 5 

Uh Oh. In JavaScript, + può significare aggiungere due numeri o concatenare due stringhe. In questo caso, non abbiamo né due numeri né due stringhe. Abbiamo solo un numero e un object. Secondo le regole del tipo di JavaScript, questo non ha alcun senso logico. Dal momento che ti perdona di aver infranto le sue regole, invece di schiantarsi cerca comunque di dargli un senso. Che cosa fa JavaScript? Bene, sa come concatenare le stringhe, quindi converte sia [] che 5 in stringhe e il risultato è il valore stringa “5”.

Qual è l’accordo con gli operatori di confronto == e === ? Perché ci sono due operatori di confronto?

== non è immune al comportamento di conversione del tipo di JavaScript. Espressioni come 5 == “5” valgono come true perché JavaScript tenterà di convertire uno di essi in modo che confronti lo stesso tipo di dati.

In molti casi, ciò non è auspicabile perché probabilmente vuoi sapere se alcuni dati a cui stai confrontando sono di un tipo diverso in modo che tu possa decidere cosa fare al riguardo. È qui che entra in gioco l’operatore === . Quando si utilizza === , non verrà eseguita alcuna conversione del tipo. Pertanto, l’espressione 5 === “5” valuterà come falso.

In Python se provi ad aggiungere, ad esempio, stringhe e interi, ottieni un errore:

 >>> "hi" + 10 Traceback (most recent call last): File "", line 1, in  TypeError: cannot concatenate 'str' and 'int' objects 

Eppure in JavaScript, non lo fai. Il 10 viene convertito in una stringa:

 > "hi" + 10 "hi10" 

“Tipo di coercizione” è solo un malinteso di fantasia per quanto sopra. In realtà, nessuno dei due linguaggi ha “tipi” nel senso di Java o C o di altri linguaggi con sistemi di tipi statici. Il modo in cui le lingue trattano le interazioni tra i vari valori non tipizzati staticamente è una questione di scelta e di convenzione.

lasciatemi spiegare la coercizione di tipo con il seguente esempio

Type Coercion significa che Javascript automaticamente (al volo) converte una variabile da un tipo di dati a un altro

Es: 123 + "4" generalmente genera un errore ma in Javascript a causa della coercizione di tipo, risulta 1234 una stringa

 if(23 == "23"){ console.log(" this line is inside the loop and is executed "); } 

Nel codice precedente, a causa della coercizione di tipo – JavaScript ritiene che 23 (numero) e "23" (stringa) siano la stessa cosa. questo rende vera la condizione e stampa console.log

Nell’altro caso

 if(23 === "23"){ console.log(" this line is inside the loop and is NOT executed"); } 

Nel caso === , Javascript non esegue Type Coercion, e poiché 23 è un numero e "23" è String e a causa di === questi due tipi di dati sono diversi e ciò porta alla condizione di false. Non stampa console.log

In parole semplici

In questo caso = è un operatore di assegnazione – che assegna valori come var a = 3; , eccetera

(sotto gli operatori sono per il confronto)

In questo caso == JavaScript converte / costruisce il tipo di dati in un altro e poi lo confronta.

In questo caso === Javascript non converte / costruisce il tipo di dati

Al fine di evitare bug e per scopi di debug === è principalmente usato

Per favore fatemi sapere la precisione delle informazioni di cui sopra.

a == b significa che javascript valuterà a contro b base a se i valori possono essere valutati allo stesso modo. Ad esempio, false == 0 valuterà true perché 0 è anche il valore di Boolean false. Tuttavia, false === 0 valuterà il valore falso perché confrontando strettamente, 0 non è lo stesso valore fisico di falso. Un altro esempio è false == '' Quindi confronto fondamentalmente sciolto rispetto al confronto rigoroso, perché javascript è un linguaggio generico. Vale a dire, javascript tenterà di convertire la variabile in base al contesto del codice, e questo ha l’effetto di rendere le cose uguali se non sono strettamente confrontate. php ha anche questo comportamento.

 var str = 'dude'; console.log(typeof str); // "string" console.log(!str); // false console.log(typeof !str); // "boolean" 

Esempio di una variabile che viene inizialmente dichiarata come una stringa forzata in valore booleano con! operatore

Se il tipo di dati non è uguale tra loro, allora Coercion Happen. come 3 == “3” o boolen == intero