Perché non || sembra funzionare come un operatore di coalizione / predefinito in JavaScript?
-
08-07-2019 - |
Domanda
Ho visto un paio di pagine web dire che " a = b || 'Bla' " dovrebbe assegnare "blah" a a se b non è definito o nullo. Ma se lo digito in Firebug o lo uso nel codice, si lamenta che b non è definito, nell'elenco su FF3 / win. Qualche suggerimento?
Modifica: sto cercando il caso in cui b potrebbe non esistere affatto. Ad esempio, un nodo DOM senza un ID.
Soluzione
Penso che tu stia cercando questo:
var a = typeof b == 'undefined' ? 'blah' : b;
Altri suggerimenti
Se b esisteva ed era falso, nullo, ecc., allora funziona nel modo previsto. Tutto quello che devi fare è sulla riga sopra, inserisci var b = null
;
Questo ha senso se ci pensi. Praticamente fa qualcosa del genere ...
a = function(){ if(b){return b;} else{ return 'blah' } }();
Nota che sta verificando che il valore di b sia veritiero ... se b non esiste, ottieni un'eccezione.
Riguardo alle variabili non definite
" Definire " in javascript non significa 'variabile non esiste'. Significa " il valore della variabile è il valore speciale di undefined
" ;. Esempio:
alert(nosuchvariable);
=> throws exception
var somevariable; // note it's never assigned
alert(somevariable);
=> This alerts with 'undefined'
Riguardo a Verifica se esistono variabili.
Quindi se proviamo a leggere b
e non esiste una variabile come b, otteniamo un'eccezione. Se stiamo cercando di scoprire se b è definito, questo non è utile.
Puoi vedere se esistono variabili globali controllando l'oggetto finestra
di livello superiore. Tutte le variabili globali sono in realtà solo campi nell'oggetto window
. Esempio:
foo = 'Hello';
alert( window.foo );
=> alerts 'Hello'
Poiché sai che l'oggetto finestra esiste già, puoi controllare i suoi campi.
Controllare i campi che non esistono in JavaScript ti darà undefined
e non si arresta in modo anomalo, quindi puoi fare la coalescenza o mettere il undefined
in una variabile o qualunque sia
Per le variabili locali (cose dichiarate con var
), non puoi verificarne l'esistenza. non " live " ; ovunque nel modo in cui le variabili globali "vivono" nell'oggetto window e qualsiasi normale tentativo di fare riferimento a uno provocherà un'eccezione: ad esempio:
alert(a);
=> exception because a is meaningless
alert(d45pwiu4309m9rv43);
=> exception because that is equally meaningless
Esiste tuttavia un'eccezione (che conosco, grazie a J c nei commenti), l'operatore typeof
. Se provi a ottenere il tipo di qualcosa che non esiste, non va in crash, restituirà la stringa " undefined "
.
Questo ti dà un modo per controllare le variabili locali inesistenti. ad esempio:
if( typeof(djfsd) === "undefined" )
alert('no such variable');
Riguardo agli elementi DOM che non esistono
Ci sono stati diversi commenti che menzionavano elementi DOM senza ID e così via ...
Il fatto che sia un elemento DOM non è molto rilevante. Pensa al DOM come un database o un file e un elemento come una riga in quel database o parola in quel file. Per fare qualsiasi cosa con esso, devi cercare nel database, trovare la riga giusta ed estrarne i dati. I dati vengono inseriti in un oggetto JavaScript. Quindi puoi accedervi manipolando quell'oggetto e magari inserendo l'oggetto in una variabile, se lo desideri. Esempio:
document.getElementById('foo');
questo va nel dom e cerca un elemento con un ID di "pippo". Se ne trova uno, mette alcune informazioni su quell'elemento in un oggetto javascript, e poi ti restituisce quell'oggetto. Se non riesce a trovare l'elemento, ti restituirà null
, ma restano comunque valide tutte le regole normali (puoi applicare null
in una variabile, o altro) .
Non influisce affatto sulla coesione.
||
è l'operatore logico OR in cortocircuito in Javascript, proprio come in C, C ++, Java, C #, Perl, PHP, ecc ...
Secondo Wikipedia , se metti le parentesi attorno a b, esso funzionerà come previsto.
var a = (b) || 'blah';
Ma se lo digito in Firebug o lo uso nel codice, si lamenta che b non è definito, nell'elenco su FF3 / win
Che cosa vuoi dire, "non è definito"? Vuoi dire che Javascript non conosce la variabile? Quindi puoi usare window.b
come " window " è l'oggetto di livello superiore, o prima dichiara b con var b;
; ma solo se è una variabile.
Se si tratta di un elemento DOM, potrebbe essere necessario provare a cercarlo prima, ad esempio con document.getElementById
:
a = document.getElementById('b') || 'blah'
funziona per me.