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?
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
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
)
var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var
b
sera réglé surtrue
.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
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
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 )