Perché non || sembra funzionare come un operatore di coalizione / predefinito in JavaScript?

StackOverflow https://stackoverflow.com/questions/302993

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top