7 suggerimenti per gestire undefined in JavaScript
La maggior parte dei linguaggi moderni come Ruby, Python o Java hanno un singolo valore nullo (nil
o null
), che sembra un approccio ragionevole.
Ma JavaScript è diverso.
null
, ma anche undefined
, rappresentano valori vuoti in JavaScript. Allora qual è la differenza esatta tra loro?
La risposta breve è che linterprete JavaScript restituisce undefined
quando si accede a una variabile o a una proprietà di un oggetto non ancora inizializzata. Ad esempio:
Dallaltro lato, null
rappresenta un oggetto mancante riferimento. JavaScript non inizializza le variabili o le proprietà degli oggetti con null
.
Alcuni metodi nativi come String.prototype.match()
possono restituire null
per denotare un oggetto mancante. Dai unocchiata allesempio:
Poiché JavaScript è permissivo, gli sviluppatori hanno la tentazione di accedere a valori non inizializzati. Anchio sono colpevole di una cattiva pratica.
Spesso tali azioni rischiose generano undefined
errori correlati:
-
TypeError: "undefined" is not a function
-
TypeError: Cannot read property "<prop-name>" of undefined
- e simili errori di tipo.
Lo sviluppatore JavaScript può capire lironia di questo scherzo :
Per ridurre tali errori, devi comprendere i casi in cui undefined
viene generato. Esploriamo undefined
e il suo effetto sulla sicurezza del codice.
1. Cosa è indefinito
JavaScript ha 6 tipi primitivi:
E un tipo di oggetto separato: {name: "Dmitri"}
, .
Da 6 tipi primitivi undefined
è un valore speciale con il proprio tipo Undefined. Secondo la specifica ECMAScript:
Il valore primitivo non definito viene utilizzato quando a una variabile non è stato assegnato un valore.
Lo standard definisce chiaramente che riceverai undefined
quando accedi a variabili non inizializzate, proprietà di oggetti inesistenti, elementi di array inesistenti e simili.
Alcuni esempi:
Lesempio precedente dimostra che laccesso a:
- una variabile non inizializzata
number
- una proprietà oggetto non esistente
movie.year
- o un elemento array non esistente
movies
vengono valutati in undefined
.
La specifica ECMAScript definisce il tipo di valore undefined
:
Il tipo non definito è un tipo il cui unico valore è il
undefined
valore.
In questo senso, restituisce "undefined"
stringa per un valore undefined
:
Ovviamente typeof
funziona bene per verificare se una variabile contiene un valore undefined
:
2. Scenari che creano undefined
2.1 Variabile non inizializzata
Una variabile dichiarata ma non ancora assegnata con un valore (non inizializzato) è per impostazione predefinita
undefined
.
Chiaro e semplice:
myVariable
è dichiarato e non ancora assegnato con un valore. Laccesso alla variabile restituisce undefined
.
Un approccio efficiente per risolvere i problemi delle variabili non inizializzate è, quando possibile, assegnare un valore iniziale. Meno la variabile esiste in uno stato non inizializzato, meglio è.
Idealmente, dovresti assegnare un valore subito dopo la dichiarazione const myVariable = "Initial value"
. Ma non è sempre possibile.
Suggerimento 1. Aggiungi ai preferiti const
, altrimenti utilizza let
, ma saluta var
Secondo me, una delle migliori caratteristiche di ECMAScript 2015 è il nuovo modo di dichiarare le variabili usando const
e let
. È un grande passo avanti.
const
e let
hanno un ambito di blocco (contrariamente alla precedente funzione con ambito var
) ed esistono in una zona morta temporale fino alla riga della dichiarazione.
Raccomando la variabile const
quando il suo valore non cambierà. Crea unassociazione immutabile.
Una delle caratteristiche interessanti di const
è che devi assegnare un valore iniziale alla variabile const myVariable = "initial"
. La variabile non è esposta allo stato non inizializzato e laccesso a undefined
è impossibile.
Controlliamo la funzione che verifica se una parola è un palindromo:
length
e half
le variabili vengono assegnate con un valore una volta. Sembra ragionevole dichiararli come const
poiché queste variabili non cambieranno.
Usa la dichiarazione let
per le variabili il cui valore può cambiare. Quando possibile, assegnare subito un valore iniziale, ad es. let index = 0
.
E la vecchia scuola var
? Il mio suggerimento è di smettere di usarlo.
var
Il problema di dichiarazione è la variabile che si solleva nellambito della funzione. Puoi dichiarare una variabile var
da qualche parte alla fine dellambito della funzione, ma puoi comunque accedervi prima della dichiarazione: e otterrai un undefined
.
myVariable
è accessibile e contiene undefined
anche prima della riga della dichiarazione: var myVariable = "Initial value"
.
Al contrario, non è possibile accedere a una variabile const
o let
prima della riga di dichiarazione: la variabile si trova in una zona morta temporale prima della dichiarazione. Ed è utile perché hai meno possibilità di accedere a un undefined
.
Lesempio precedente aggiornato con let
(invece di var
) genera un ReferenceError
perché la variabile nella zona morta temporale non è accessibile.
Incoraggiare luso di const
per associazioni immutabili o let
garantisce altrimenti una pratica che riduce laspetto di chi non è inizializzato variabile.
Suggerimento 2: aumentare la coesione
La coesione caratterizza il grado di appartenenza degli elementi di un modulo (spazio dei nomi, classe, metodo, blocco di codice). La coesione può essere alta o bassa.
Un modulo ad alta coesione è preferibile perché gli elementi di tale modulo si concentrano esclusivamente su un singolo compito. Rende il modulo:
- Focalizzato e comprensibile: più facile da capire cosa fa il modulo
- Gestibile e più facile da refactoring: la modifica nel modulo influisce su meno moduli
- Riutilizzabile: essendo concentrato su una singola attività, rende il modulo più facile da riutilizzare
- Testabile: testeresti più facilmente un modulo focalizzato su una singola attività
Lalta coesione accompagnata da un accoppiamento lento è la caratteristica di un sistema ben progettato.
Un blocco di codice può essere considerato un piccolo modulo. Per trarre vantaggio dai vantaggi di unelevata coesione, mantenere le variabili il più vicino possibile al blocco di codice che le utilizza.
Ad esempio, se una variabile esiste esclusivamente per formare la logica dellambito del blocco, dichiarare e rendere attiva la variabile solo allinterno di quel blocco (utilizzando const
o let
dichiarazioni). Non esporre questa variabile allambito del blocco esterno, poiché il blocco esterno non dovrebbe preoccuparsi di questa variabile.
Un classico esempio della durata inutilmente estesa delle variabili è luso di for
ciclo allinterno di una funzione:
index
, item
e length
le variabili vengono dichiarate allinizio del corpo della funzione. Tuttavia, vengono utilizzati solo verso la fine. Qual è il problema con questo approccio?
Tra la dichiarazione in alto e lutilizzo nellistruzione for
le variabili index
, item
non sono inizializzati e sono esposti a undefined
. Hanno un ciclo di vita irragionevolmente lungo nellintero ambito della funzione.
Un approccio migliore è spostare queste variabili il più vicino possibile al loro luogo di utilizzo:
index
e esistono solo nellambito del blocco dellistruzione for
. Non hanno alcun significato al di fuori di for
.
length
anche la variabile è dichiarata vicina alla fonte del suo utilizzo.
Perché la versione modificata è migliore di quella iniziale? Vediamo:
- Le variabili non sono esposte a uno stato non inizializzato, quindi non hai alcun rischio di accedere a
undefined
- Spostando il variabili il più vicino possibile alla posizione di utilizzo aumenta la leggibilità del codice
- Pezzi di codice ad alta coesione sono più facili da refactoring ed estrarre in funzioni separate, se necessario
2.2 Accesso una proprietà non esistente
Quando si accede a una proprietà oggetto non esistente, JavaScript restituisce
undefined
.
Dimostriamolo in un esempio:
favoriteMovie
è un oggetto con una singola proprietà title
. Laccesso a una proprietà non esistente actors
utilizzando una funzione di accesso alla proprietà favoriteMovie.actors
restituisce undefined
.
Laccesso a una proprietà non esistente non genera un errore. Il problema si verifica quando si tenta di ottenere dati dalla proprietà inesistente, che è la undefined
trap più comune, riflessa nel noto messaggio di errore TypeError: Cannot read property <prop> of undefined
.
Modifichiamo leggermente lo snippet di codice precedente per illustrare un TypeError
lancio:
favoriteMovie
non ha la proprietà actors
, quindi favoriteMovie.actors
restituisce undefined
.
Di conseguenza, laccesso al primo elemento di un valore undefined
utilizzando lespressione favoriteMovie.actors
genera un TypeError
.
La natura permissiva di JavaScript che consente di accedere a proprietà inesistenti è una fonte di non determinismo: la proprietà può essere impostata o meno. Il modo migliore per aggirare questo problema è limitare loggetto in modo che abbia sempre definito le proprietà che detiene.
Sfortunatamente, spesso non hai il controllo sugli oggetti. Tali oggetti possono avere un diverso insieme di proprietà in diversi scenari. Quindi devi gestire tutti questi scenari manualmente.
Implementiamo una funzione append(array, toAppend)
che aggiunge allinizio e / o alla fine di un array di nuovi elementi. Il parametro toAppend
accetta un oggetto con proprietà:
-
first
: elemento inserito allinizio diarray
-
last
: elemento inserito alla fine diarray
.
La funzione restituisce una nuova istanza di array, senza alterare larray originale.
La prima versione di append()
, un po ingenua, potrebbe avere questo aspetto:
Perché toAppend
può omettere le proprietà first
o last
, è obbligatorio verificare se queste proprietà esistono in toAppend
.
Una funzione di accesso alla proprietà restituisce undefined
se la proprietà non esiste. La prima tentazione di verificare se sono presenti le proprietà first
o last
è verificarle con undefined
. Questa operazione viene eseguita nei condizionali if(toAppend.first){}
e if(toAppend.last){}
…
Non così velocemente. Questo approccio ha uno svantaggio. undefined
, nonché false
, null
, 0
, NaN
e ""
sono valori falsi.
Nellattuale implementazione di append()
, la funzione non consente di inserire elementi falsi:
I suggerimenti che seguono spiegano come controllare correttamente lesistenza della proprietà.
Suggerimento 3: controlla lesistenza della proprietà
Fortunatamente, JavaScript offre un sacco di modi per determinare se loggetto ha una proprietà specifica:
-
obj.prop !== undefined
: confronta conundefined
direttamente -
typeof obj.prop !== "undefined"
: verifica il tipo di valore della proprietà -
obj.hasOwnProperty("prop")
: verifica se il loggetto ha una proprietà propria -
"prop" in obj
: verifica se loggetto ha una proprietà propria o ereditata
Il mio consiglio è di utilizza loperatore in
. Ha una sintassi breve e dolce. La presenza delloperatore in
suggerisce un chiaro intento di verificare se un oggetto ha una proprietà specifica, senza accedere al valore effettivo della proprietà.
obj.hasOwnProperty("prop")
è anche una bella soluzione. È leggermente più lungo delloperatore in
e viene verificato solo nelle proprietà delloggetto.
Miglioriamo la funzione append(array, toAppend)
utilizzando in
operatore:
"first" in toAppend
(e "last" in toAppend
) è true
se esiste la proprietà corrispondente, false
altrimenti.
Loperatore in
risolve il problema con linserimento di elementi falsi 0
e false
. Ora, aggiungendo questi elementi allinizio e alla fine di si ottiene il risultato atteso
.
Suggerimento 4: destrutturazione per accedere alle proprietà degli oggetti
Quando si accede alla proprietà di un oggetto, a volte è necessario impostare un valore predefinito se la proprietà non esiste.
Puoi utilizzare in
accompagnato da un operatore ternario per ottenere ciò:
La sintassi degli operatori ternari diventa scoraggiante quando il numero di proprietà da controllare aumenta. Per ogni proprietà, devi creare una nuova riga di codice per gestire i valori predefiniti, aumentando un brutto muro di operatori ternari dallaspetto simile.
Per utilizzare un approccio più elegante, familiarizziamo con una grande funzionalità di ES2015 chiamata destrutturazione degli oggetti.
La destrutturazione degli oggetti consente lestrazione in linea dei valori delle proprietà degli oggetti direttamente nelle variabili e limpostazione di un valore predefinito se la proprietà non esiste. Una sintassi comoda per evitare di trattare direttamente con undefined
.
In effetti, lestrazione delle proprietà ora è precisa:
Per vedere le cose in azione, definiamo unutile funzione che racchiuda una stringa tra virgolette.
quote(subject, config)
accetta il primo argomento come stringa da avvolgere. Il secondo argomento config
è un oggetto con le proprietà:
Applicando i vantaggi della destrutturazione delloggetto, implementiamo quote()
:
const { char = """, skipIfQuoted = true } = config
lassegnazione destrutturante in una riga estrae le proprietà char
e skipIfQuoted
dalloggetto config
.
Se nelloggetto config
mancano alcune proprietà, lassegnazione di destrutturazione imposta i valori predefiniti : """
per char
e false
per skipIfQuoted
.
Fortunatamente, la funzione ha ancora margini di miglioramento.
Spostiamo lassegnazione destrutturante nella sezione dei parametri. E imposta un valore predefinito (un oggetto vuoto { }
) per il parametro config
, per saltare il secondo argomento quando le impostazioni predefinite sono sufficienti.
Lassegnazione destrutturante sostituisce il parametro config
nella firma della funzione. Mi piace: quote()
diventa una riga più corta.
= {}
sul lato destro dellassegnazione di destrutturazione assicura che venga utilizzato un oggetto vuoto se il secondo argomento non è specificato affatto quote("Sunny day")
.
La destrutturazione degli oggetti è una potente funzionalità che gestisce in modo efficiente lestrazione delle proprietà dagli oggetti. Mi piace la possibilità di specificare un valore predefinito da restituire quando la proprietà a cui si accede non esiste. Di conseguenza, eviti undefined
e il fastidio che lo circonda.
Suggerimento 5: riempire loggetto con proprietà predefinite
Se non è necessario creare variabili per ogni proprietà, come fa lassegnazione destrutturante, loggetto che manca di alcune proprietà può essere riempito con i valori predefiniti.
ES2015 Object.assign(target, source1, source2, ...)
copia i valori di tutte le proprietà enumerabili da uno o più oggetti di origine nelloggetto di destinazione. La funzione restituisce loggetto di destinazione.
Ad esempio, devi accedere alle proprietà delloggetto unsafeOptions
che non sempre contiene il suo set completo di proprietà.
Per evitare undefined
quando si accede a una proprietà non esistente da unsafeOptions
, apportiamo alcune modifiche:
- Definisci un oggetto
defaults
che contiene i valori di proprietà predefiniti - Chiama
Object.assign({ }, defaults, unsafeOptions)
per creare un nuovo oggettooptions
. Il nuovo oggetto riceve tutte le proprietà daunsafeOptions
, ma quelle mancanti vengono prese dadefaults
.
unsafeOptions
contiene solo la proprietà fontSize
. Loggetto defaults
definisce i valori predefiniti per le proprietà fontSize
e color
.
Object.assign()
accetta il primo argomento come oggetto di destinazione {}
. Loggetto di destinazione riceve il valore della proprietà fontSize
dalloggetto di origine unsafeOptions
. E il valore della proprietà color
dalloggetto sorgente defaults
, perché unsafeOptions
non contiene color
.
Lordine in cui sono enumerati gli oggetti sorgente è importante: le proprietà successive delloggetto sorgente sovrascrivono quelle precedenti.
Ora puoi accedere in sicurezza a qualsiasi proprietà delloggetto options
, incluso options.color
che non era disponibile in unsafeOptions
inizialmente.
Fortunatamente, esiste unalternativa più semplice per riempire loggetto con le proprietà predefinite.Consiglio di utilizzare le proprietà di diffusione negli inizializzatori di oggetti.
Invece di invocare Object.assign()
, usa la sintassi di diffusione delloggetto per copiare nelloggetto di destinazione tutte le proprietà enumerabili dagli oggetti di origine:
linizializzatore di oggetti diffonde le proprietà dagli oggetti sorgente defaults
e unsafeOptions
. Lordine in cui vengono specificati gli oggetti di origine è importante: le proprietà degli oggetti di origine successive sovrascrivono quelle precedenti.
Riempire un oggetto incompleto con i valori di proprietà predefiniti è una strategia efficiente per rendere il tuo codice sicuro e durevole. Indipendentemente dalla situazione, loggetto contiene sempre il set completo di proprietà: e undefined
non può essere generato.
Suggerimento bonus: coalescenza nullo
Loperatore coalescenza nullo restituisce un valore predefinito quando il suo operando è undefined
o null
:
Loperatore di coalescenza nullo è conveniente per accedere a una proprietà delloggetto pur avendo un valore predefinito quando questa proprietà è undefined
o null
:
styles
oggetto non ha la proprietà color
, quindi styles.color
La funzione di accesso alla proprietà è undefined
. styles.color ?? "black"
restituisce il valore predefinito "black"
.
styles.fontSize
è 18
, quindi loperatore di coalescenza nullo restituisce il valore della proprietà 18
.
2.3 Parametri della funzione
Limpostazione predefinita dei parametri della funzione è
undefined
.
Di solito una funzione definita con un numero specifico di parametri dovrebbe essere invocata con lo stesso numero di argomenti. Questo è il momento in cui i parametri ottengono i valori previsti:
Quando multiply(5, 3)
, i parametri a
e b
ricevono 5
e rispettivamente 3
valori. La moltiplicazione viene calcolata come previsto: 5 * 3 = 15
.
Cosa succede quando ometti un argomento durante linvocazione? Il parametro corrispondente allinterno della funzione diventa undefined
.
Modifichiamo leggermente lesempio precedente chiamando la funzione con un solo argomento:
Linvocazione multiply(5)
viene eseguito con un singolo argomento: come risultato a
parametro è 5
, ma il Il parametro b
è undefined
.
Suggerimento 6: usa il valore predefinito del parametro
A volte una funzione non richiede il set completo di argomenti al momento dellinvocazione. Puoi impostare i valori predefiniti per i parametri che non hanno un valore.
Ricordando lesempio precedente, facciamo un miglioramento. Se il parametro b
è undefined
, lascia che il valore predefinito sia 2
:
La funzione viene richiamata con un singolo argomento multiply(5)
. Inizialmente, il parametro a
è 2
e b
è undefined
.
Listruzione condizionale verifica se b
è undefined
. In tal caso, lassegnazione b = 2
imposta un valore predefinito.
Sebbene il modo fornito per assegnare i valori predefiniti funzioni, non consiglio di confrontare direttamente con undefined
. È dettagliato e sembra un hack.
Un approccio migliore consiste nellutilizzare la funzione dei parametri predefiniti di ES2015. È breve, espressivo e senza confronti diretti con undefined
.
Laggiunta di un valore predefinito al parametro b = 2
ha un aspetto migliore:
b = 2
nella firma della funzione si assicura che se b
è undefined
, il valore predefinito del parametro è 2
.
La funzione dei parametri predefiniti di ES2015 è intuitiva ed espressiva. Usalo sempre per impostare i valori predefiniti per i parametri opzionali.
2.4 Valore restituito dalla funzione
Implicitamente, senza
return
istruzione, una funzione JavaScript restituisceundefined
.
Una funzione che non dispone di return
restituisce implicitamente undefined
:
non restituisce alcun risultato di calcolo. Il risultato del richiamo della funzione è undefined
.
La stessa situazione si verifica quando è presente listruzione return
, ma senza unespressione nelle vicinanze:
return;
viene eseguita, ma non restituisce alcuna espressione. Anche il risultato della chiamata è undefined
.
Ovviamente, indicando vicino a return
lespressione da restituire funziona come previsto:
Ora il richiamo della funzione viene valutato in 4
, che è 2
al quadrato.
Suggerimento 7: non fidarsi dellinserimento automatico del punto e virgola
Il seguente elenco di istruzioni in JavaScript deve terminare con punto e virgola (;
) :
- istruzione vuota
-
let
,const
,var
,import
,export
dichiarazioni - dichiarazione di espressione
-
debugger
istruzione -
continue
istruzione,break
istruzione -
throw
istruzione -
return
istruzione
Se utilizzi una delle istruzioni precedenti, assicurati di indicare un punto e virgola alla fine:
Alla fine di entrambi let
dichiarazione e return
viene scritto un punto e virgola obbligatorio.
Cosa succede se non si desidera indicarli punto e virgola? In una tale situazione ECMAScript fornisce un meccanismo di inserimento automatico del punto e virgola (ASI), che inserisce per te i punti e virgola mancanti.
Con laiuto dellASI, puoi rimuovere i punti e virgola dallesempio precedente:
Il testo sopra è un codice JavaScript valido. I punti e virgola mancanti vengono inseriti automaticamente.
A prima vista sembra piuttosto promettente. Il meccanismo ASI ti consente di saltare i punti e virgola non necessari. Puoi rendere il codice JavaScript più piccolo e più facile da leggere.
Cè una piccola, ma fastidiosa trappola creata dallASI. Quando una nuova riga si trova tra return
e lespressione restituita return \n expression
, ASI inserisce automaticamente un punto e virgola prima della nuova riga return; \n expression
.
Cosa significa allinterno di una funzione avere listruzione return;
? La funzione restituisce undefined
. Se non conosci in dettaglio il meccanismo dellASI, il undefined
restituito inaspettatamente è fuorviante.
Ad esempio, studiamo il valore restituito di getPrimeNumbers()
invocazione:
Tra listruzione return
e lespressione letterale di matrice esiste una nuova riga. JavaScript inserisce automaticamente un punto e virgola dopo return
, interpretando il codice come segue:
Listruzione return;
fa in modo che la funzione getPrimeNumbers()
restituisca undefined
invece dellarray previsto.
Il problema viene risolto rimuovendo la nuova riga tra return
e larray literal:
La mia raccomandazione è di studiare come funziona esattamente linserimento automatico del punto e virgola per evitare tali situazioni.
Ovviamente, non inserire mai una nuova riga tra return
e lespressione restituita.
2.5 operatore void
void <expression>
valuta lespressione e restituisce undefined
indipendentemente dal risultato della valutazione.
Un caso duso delloperatore void
consiste nel sopprimere la valutazione dellespressione a undefined
, basandosi su alcuni effetti collaterali della valutazione.
3. undefined in array
Ottieni undefined
quando accedi a un elemento di array con un indice fuori limite.
colors
array ha 3 elementi, quindi gli indici validi sono 0
, 1
e 2
.
Poiché non sono presenti elementi di matrice negli indici 5
e -1
, le funzioni di accesso colors
e colors
sono undefined
.
In JavaScript, potresti incontrare i cosiddetti array sparsi. Le tesi sono array che presentano spazi vuoti, ovvero in alcuni indici non sono definiti elementi.
Quando si accede a uno spazio vuoto (noto anche come slot vuoto) allinterno di un array sparso, si ottiene anche un undefined
.
Lesempio seguente genera array sparsi e cerca di accedere ai loro slot vuoti:
sparse1
viene creato invocando un Array
costruttore con un primo argomento numerico.Dispone di 3 slot vuoti.
sparse2
viene creato con un array letterale con il secondo elemento mancante.
In uno qualsiasi di questi array sparsi, laccesso a uno slot vuoto restituisce undefined
.
Quando si lavora con gli array, per evitare undefined
, assicurarsi di utilizzare indici di array validi e impedire la creazione di array sparsi.
4. Differenza tra undefined e null
Qual è la principale differenza tra undefined
e null
? Entrambi i valori speciali implicano uno stato vuoto.
undefined
rappresenta il valore di una variabile che non è stata ancora inizializzata, mentrenull
rappresenta unassenza intenzionale di un oggetto.
Esploriamo la differenza in alcuni esempi.
La variabile number
è definita , tuttavia, non è assegnato con un valore iniziale:
number
variabile è undefined
, che indica una variabile non inizializzata.
Lo stesso concetto non inizializzato si verifica quando si accede a una proprietà di un oggetto non esistente:
Perché lastName
non esiste in obj
, JavaScript restituisce obj.lastName
a undefined
.
Daltra parte, sai che una variabile si aspetta un oggetto. Ma per qualche motivo non puoi istanziare loggetto. In tal caso null
è un indicatore significativo di un oggetto mancante.
Ad esempio, clone()
è una funzione che clona un semplice oggetto JavaScript. La funzione dovrebbe restituire un oggetto:
Tuttavia clone()
potrebbe essere invocato con un argomento non oggetto: 15
o null
. In tal caso, la funzione non può creare un clone, quindi restituisce null
– lindicatore di un oggetto mancante.
Loperatore typeof
fa la distinzione tra undefined
e null
:
Anche loperatore di qualità rigorosa ===
distingue correttamente undefined
da null
:
5. Conclusione
undefined
lesistenza è una conseguenza della natura permissiva di JavaScript che consente lutilizzo di:
- variabili non inizializzate
- proprietà o metodi di oggetti non esistenti
- indici fuori dai limiti per accedere agli elementi dellarray
- il risultato dellinvocazione di una funzione che non restituisce nulla
Il confronto diretto con undefined
non è sicuro perché ti affidi a una pratica consentita ma sconsigliata menzionata sopra.
Una strategia efficiente consiste nel ridurre al minimo laspetto della parola chiave undefined
nel codice applicando buone abitudini come:
- ridurre lutilizzo di variabili non inizializzate
- abbreviare il ciclo di vita delle variabili e avvicinarle alla fonte del loro utilizzo
- quando possibile assegnare valori iniziali alle variabili
- favor
const
, altrimenti utilizzalet
- utilizza valori predefiniti per parametri di funzione non significativi
- verifica le proprietà esistenza o riempire gli oggetti non sicuri con proprietà predefinite
- evitare luso di array sparsi
È bene che JavaScript abbia entrambi undefined
e null
per rappresentare valori vuoti?