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?


Ê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


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)


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


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.