In javascript, una stringa vuota è sempre falsa come booleana?


134

in javascript,

var a = '';
var b = (a) ? true : false;

var bsarà impostato su false.

è un comportamento definito su cui si può fare affidamento?


Sei sicuro, sto arrivando falsequi: jsfiddle.net/8CKbd
anubhava

Ho fatto un ulteriore passo avanti. La stringa con spazi è vera. if ('') {console.log ('!')} ma '' == 0 è vero.
Azat,

2
Credo che l'edizione @JonH è sbagliato, la stringa vuota ''viene valutata per falso in un contesto booleano, quindi se a = '';poi a ? false : true=> '' ? false : true=> false ? false : true=> true(perché è la valutazione per un valore falso). Penso che dovrebbe var b = (a) ? true : false;essere corretto con la prossima affermazione.
PhoneixS,

@PhoneixS modificato, spero che ora sia più significativo.
SwissCoder

1
@SwissCoder non era che non fosse leggibile ma che produce un'altra risposta. Ora l'ho corretto.
PhoneixS,

Risposte:


191

Sì. Javascript è un dialetto di ECMAScript e la specifica del linguaggio ECMAScript definisce chiaramente questo comportamento:

ToBoolean

Il risultato è falso se l'argomento è la stringa vuota (la sua lunghezza è zero); altrimenti il ​​risultato è vero

Citazione tratta da http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf


Aaaaand è deciso
Anthony

28
Un avvertimento è che new String("")è vero! Questo perché è un oggetto, mentre la forma abbreviata ""rappresenta la versione del valore primitivo. Lo stesso vale per new Number(0)e anche new Boolean(false). È una buona ragione per non usare le versioni degli oggetti nel tuo codice, e significa che if (str.length)gestisce questo caso limite mentre if (str)non lo farebbe.
Chris Middleton,

54

Sì. Tutti false, 0, stringhe vuote ''e "", NaN, undefined, e nullvengono sempre valutate come false; tutto il resto è true.

E nel tuo esempio, b è falsedopo la valutazione. (Penso che tu abbia scritto per errore true)


2
nullnon è false, né true, nullè null. jsfiddle.net/sq1Lkpg0
Bruno Finger

7
@Bruno, puoi eseguire lo stesso test con NaNe undefined. Non lo sono falsema sono falsi. È quello che è stato chiesto.
Joseph,

11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var bsarà impostato su true.

è un comportamento definito su cui si può fare affidamento?

Come precedentemente risolta, , cioè il comportamento definito di una stringa vuota in un condizionale (a ifespressione, ||, &&, ? :, ...). (Lo standard afferma che è necessario applicare l'operazione ToBoolean interna .)

La valutazione è diversa quando la stringa vuota viene utilizzata in un confronto (vedi Verità, Uguaglianza e JavaScript ), anche se i risultati sono sostanzialmente gli stessi :

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

Spiegazione: Sostanzialmente, quando gli operandi ==hanno tipi diversi, JavaScript si sforza di convertirli in numeri, in base al loro valore ( utilizzando le operazioni standard chiama ToNumber e ToPrimitive ) e quindi si applica internamente ===. Ma quando si utilizza ===direttamente, i tipi non vengono convertiti, quindi confrontare sempre una stringa con un valore booleano è sempre false.

In parole povere, test condizionali JavaScript ( ToBoolean ) per un valore definito, non nullo, non zero, non vuoto, non falso (una stringa vuota è ... vuota, i numeri -0 o +0 sono ... zero, NaN non è un numero definito, ma un oggetto vuoto apparentemente non è realmente vuoto), o come mi piace pensare, i condizionali testano una cosa (vera) , mentre ==confronta i valori apparenti, accuratamente convertiti ( ToPrimitive , ToNumber ) di i suoi operandi e ===cerca la stessa identicità .

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

Ci sono altri esempi in Verità, Uguaglianza e JavaScript in cui questa distinzione conta davvero, ad es. '0'È truein una condizione (lunghezza diversa da zero, o è una cosa ), ma falsein un ==confronto (il valore è zero). '1'di nuovo, è truein entrambi i casi (è una cosa e ha un valore diverso da zero).

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true


1
All'inizio ho pensato: "pssh, è eccessivo, questo ha già ricevuto una risposta". Ma era ben presentato e informativo. Grazie.
Marc L.

8

var bsarà impostato su true. Questo perché una stringa vuota conta come valore 'falsey' in JavaScript così come altri valori.

Si prega di consultare http://www.sitepoint.com/javascript-truthy-falsy/ per i valori falsi


Sbagli nella tua risposta. var bin realtà verrà impostato su trueperché è il contrario di var ase si osserva il codice.
Bombek,

@bombek Grazie - Sarò aggiornato. Sembra che la domanda originale sia stata modificata dopo la mia risposta (i valori sono stati scambiati)
Jonathon Bolster,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.