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

134

en javascript,

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

var bsera défini sur false.

est-ce un comportement défini sur lequel on peut se fier?

cc jeune
la source
Êtes-vous sûr, j'arrive falseici: jsfiddle.net/8CKbd
anubhava
Je suis allé plus loin. La chaîne avec des espaces est vraie. if ('') {console.log ('!')} mais le '' == 0 est vrai.
Azat
2
Je pense que l'édition @JonH est fausse, la chaîne vide ''est évaluée à false dans un contexte booléen, donc si a = '';alors a ? false : true=> '' ? false : true=> false ? false : true=> true(car est l'évaluation d'une fausse valeur). Je pense que cela devrait être var b = (a) ? true : false;correct avec la prochaine déclaration.
PhoneixS
@PhoneixS édité, j'espère que c'est plus significatif maintenant.
SwissCoder
1
@SwissCoder ce n'est pas que ce n'est pas lisible mais qu'il produit une autre réponse. Maintenant je l'ai corrigé.
PhoneixS

Réponses:

191

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 tirée de http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Arenielle
la source
Aaaaand c'est réglé
Anthony
28
Une mise en garde est que new String("")c'est la vérité! C'est parce qu'il s'agit d'un objet, alors que la forme courte ""représente la version de valeur primitive. La même chose vaut pour new Number(0)et même new Boolean(false). C'est une bonne raison de ne pas utiliser les versions d'objet dans votre code, et cela signifie que if (str.length)cela gère ce cas de bord alors que if (str)ce ne serait pas le cas.
Chris Middleton
54

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

Et dans votre exemple, b est falseaprès évaluation. (Je pense que tu as écrit par erreur true)

Hossein
la source
2
nulln'est pas false, ni true, nullest null. jsfiddle.net/sq1Lkpg0
Bruno Finger
7
@Bruno, vous pouvez effectuer le même test avec NaNet undefined. Ils ne le sont pas, falsemais ils sont faux. C'est ce qui a été demandé.
Joseph
11

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

var bsera défini sur true.

est-ce un comportement défini sur lequel on peut se fier?

Comme ci - dessus répondu, oui , c'est le comportement défini d'une chaîne vide dans une condition (une ifexpression, ||, &&, ? :, ...). (La norme dit que l' opération ToBoolean interne 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 les résultats sont pour la plupart les mêmes :

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

Explication: Essentiellement, lorsque les opérandes de ==ont des types différents, JavaScript s'efforce de les convertir en nombres, en fonction de leur valeur , (à l' aide d' opérations que le standard appelle ToNumber et ToPrimitive ), puis il s'applique en interne ===. Mais lorsque vous utilisez ===directement, les types ne sont pas convertis, donc comparer une chaîne à un booléen l'est toujours false.

En gros, les conditions JavaScript ( ToBoolean ) testent une valeur définie, non nulle, non nulle, non vide, non fausse (une chaîne vide est ... vide, les nombres -0 ou +0 sont ... zéro, NaN n'est pas un nombre défini, mais un objet vide n'est apparemment pas vraiment vide), ou comme j'aime à le penser, les conditions testent une chose (vraie) , tandis que ==compare les valeurs apparentes et soigneusement converties ( 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 d' autres exemples dans la vérité, l' égalité et JavaScript où cette distinction est vraiment important, par exemple , '0'est truedans une condition (longueur non nulle, ou, il est une chose ), mais falsedans une ==comparaison (la valeur est égale à zéro). '1'encore une fois, c'est truedans les deux cas (c'est une chose et a une valeur non nulle).

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

Orafu
la source
1
Au début, j'ai pensé, "pssh, c'est exagéré, c'était déjà bien répondu." Mais c'était bien présenté et instructif. Merci.
Marc L.
8

var bsera défini sur true. En effet, une chaîne vide compte comme une valeur «falsey» dans JavaScript, tout comme certaines autres valeurs.

Veuillez consulter http://www.sitepoint.com/javascript-truthy-falsy/ pour des valeurs fausses

Jonathon Bolster
la source
Vous vous trompez dans votre réponse. var bsera en fait défini sur trueparce que c'est l'opposé de var asi vous regardez le code.
bombek
@bombek Merci - Je vais mettre à jour On dirait que la question d'origine a été modifiée après ma réponse (les valeurs ont été permutées)
Jonathon Bolster
5

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

Marcel Jackwerth
la source