web-dev-qa-db-fra.com

En javascript, une chaîne vide est-elle toujours fausse comme un booléen?

en javascript,

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

var b sera réglé sur false.

s'agit-il d'un comportement défini sur lequel on peut compter?

122
cc young

Oui. Javascript est un dialecte d'ECMAScript, et la spécification du langage ECMAScript définit clairement ce comportement:

ToBoolean

Le résultat est faux si l'argument est la chaîne vide (sa longueur est égale à zéro); sinon le résultat est vrai

Citation extraite de http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

171
Arenielle

Oui. Tous false, 0, chaînes vides '' et "", NaN, undefined et null sont toujours évalués comme false; tout le reste est true.

Et dans votre exemple, b est false après évaluation. (Je pense que vous avez écrit à tort true)

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

var b sera réglé sur true.

s'agit-il d'un comportement défini sur lequel on peut compter?

Comme indiqué ci-dessus, yes , c’est le comportement défini d’une chaîne vide dans un conditionnel (une expression if, ||, &&, ? :, ...). (Le standard dit que l'opération interne ToBoolean doit être appliquée.)

L'évaluation est différente lorsque la chaîne vide est utilisée dans une comparaison (voir Vérité, Égalité et JavaScript ), même si le les résultats sont presque identiques :

// 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

Explanation: Essentiellement, lorsque les opérandes de == ont différents types, JavaScript s'efforce de les convertir en nombres, en fonction de leur valeur , ( singopérations les appels standard ToNumber et ToPrimitive ), et alors il applique en interne ===. Mais quand vous utilisez === directement, les types ne sont pas convertis, comparer une chaîne à un booléen est donc toujours false.

En gros, JavaScript conditionnel ( ToBoolean ) teste un valeur définie, non nulle, non nulle, non vide, non fausse (une chaîne vide est ... vide, les nombres -0 ou +0 are ... zero, NaN n'est pas un nombre défini, mais un objet vide n'est apparemment pas vraiment vide), ou comme je me plais à le penser, conditionnel tester pour une (vraie) chose , tandis que == compare le apparent, soigneusement converti valeurs ( ToPrimitive , ToNumber ) de ses opérandes et === recherche la similitude exacte .

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?

Il y a plus d'exemples dans Vérité, Égalité et JavaScript où cette distinction compte vraiment, par exemple. '0' est true dans un conditionnel (longueur non nulle, ou c'est une chose), mais false dans un == comparaison (la valeur est égale à zéro). '1' encore _ est true dans les deux cas (c’est une chose et sa valeur est différente de zéro).

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
9
Orafu

var b sera réglé sur true. En effet, une chaîne vide compte comme une valeur "falsey" en JavaScript, à l'instar d'autres valeurs.

S'il vous plaît regardez http://www.sitepoint.com/javascript-truthy-falsy/ pour les valeurs fausses

8
Jonathon Bolster

Des exemples d'expressions pouvant être converties en false sont celles qui ont la valeur null, 0, la chaîne vide ("") ou indéfinie. (voir Référence MDN )

5
Marcel Jackwerth