2015-08-13 23 views
5

Oggi mi sono imbattuto in uno strano comportamento in Javascript. Di seguito è il codiceJavascript: comportamento strano `stringa vuota` AND` false` restituisce stringa vuota

return "" && false 

restituisce "".

Perché si comporta così?

+2

'falsy1 && falsy2' restituisce' falsy1 '- valutazione pigra. – georg

+0

perché 'Boolean (" ") === false' – Hacketo

+0

Sapevo già questo concetto di valutazione lazy, ma ho pensato che tutte le espressioni di confronto restituirebbero solo il valore booleano. Grazie per avermi corretto. –

risposta

2

Poiché

La LogicalANDExpression produzione: LogicalANDExpression & & BitwiseORExpression è valutata come segue:

  1. Sia Lref essere il risultato della valutazione LogicalANDExpression.
  2. Lasciare lval essere GetValue (lref).
  3. Se ToBoolean (lval) è false, restituisce lval.
  4. Lasciare che rref sia il risultato della valutazione di BitwiseORExpression.
  5. Restituire GetValue (rref).

ECMAScript 5.1

Questo significa:

ritorno il primo valore se è falsy, restituire il secondo valore se il primo è truthy.


Questo è anche il comportamento visto se si fa:

return false && true 

Si ottiene false.

questo significa anche che questo

return 23 && "Hello" 

darebbe "Ciao"

+0

voglio solo aggiungere che a causa di tale comportamento è possibile assegnare facilmente il valore predefinito al parametro funzione nel caso in cui non è stato passato, come questo: '' 'function setName (name) {name = name || "nome predefinito"; } '' ' – tytyryty

+1

@tytyryty Mentre questo è naturalmente possibile, ES6 ci fornisce un modo molto più semplice per farlo:' function setName (name = "default name") {... '. Ma per i non-ES6 hai ragione, ovviamente. – idmean

+0

buon punto, @idmean, grazie! – tytyryty

0

Il LHS viene eseguito prima e il ritorno si esce dalla funzione