En javascript, ¿una cadena vacía siempre es falsa como booleana?

134

en javascript,

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

var bse ajustará a false.

¿Es este un comportamiento definido en el que se puede confiar?

cc joven
fuente
¿Estás seguro? Estoy llegando falseaquí: jsfiddle.net/8CKbd
anubhava
Lo llevé un paso más allá. Cadena con espacios es cierto. if ('') {console.log ('!')} pero el '' == 0 es verdadero.
Azat
2
Creo que la edición @JonH está mal, la cadena vacía ''se evalúa a falso en un contexto booleano así que si a = '';entonces a ? false : true=> '' ? false : true=> false ? false : true=> true(porque es la evaluación de un valor falso). Creo que debería ser var b = (a) ? true : false;correcto con la siguiente declaración.
PhoneixS
@PhoneixS editado, espero que sea más significativo ahora.
SwissCoder
1
@SwissCoder no es que no sea legible, sino que genera otra respuesta. Ahora lo he corregido.
PhoneixS

Respuestas:

191

Si. Javascript es un dialecto de ECMAScript, y la especificación del lenguaje ECMAScript define claramente este comportamiento:

ToBoolean

El resultado es falso si el argumento es la cadena vacía (su longitud es cero); de lo contrario el resultado es verdadero

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

Arenielle
fuente
Aaaa y está resuelto
Anthony
28
¡Una advertencia es que new String("")es verdad! Esto se debe a que es un objeto, mientras que la forma corta ""representa la versión de valor primitivo. Lo mismo vale para new Number(0)e incluso new Boolean(false). Es una buena razón para no usar las versiones de objetos en su código, y eso significa que if (str.length)maneja este caso límite mientras if (str)que no lo haría.
Chris Middleton
54

Si. Todo false, 0, cadenas vacías ''y "", NaN, undefined, y nullsiempre se evalúan como false; todo lo demás es true.

Y en su ejemplo, b es falsedespués de la evaluación. (Creo que escribiste por error true)

Hossein
fuente
2
nullno es false, tampoco true, nulles null. jsfiddle.net/sq1Lkpg0
Bruno Finger
77
@ Bruno, puede realizar la misma prueba con NaNy undefined. No lo son falsepero son falsas. Que es lo que se le pidió.
Joseph
11

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

var bse establecerá en true.

¿Es este un comportamiento definido en el que se puede confiar?

Como la explicación anterior, , ese es el comportamiento definido de una cadena vacía en un condicional (una ifexpresión, ||, &&, ? :, ...). (El estándar dice que se debe aplicar la operación interna ToBoolean ).

La evaluación es diferente cuando se utiliza la cadena vacía en una comparación (ver Verdad, Igualdad y JavaScript ), aunque los resultados son en su mayoría los mismos :

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

Explicación: Esencialmente, cuando los operandos de ==tienen diferentes tipos, JavaScript se esfuerza por convertirlos a Números, de acuerdo con su valor , ( usando operaciones que las llamadas estándar ToNumber y ToPrimitive ), y luego se aplica internamente ===. Pero cuando se usa ===directamente, los tipos no se convierten, por lo que siempre se compara una cadena con un booleano false.

En términos generales, la prueba de condicionales de JavaScript ( ToBoolean ) para un valor definido, no nulo, no cero, no vacío, no falso (una cadena vacía está ... vacía, los números -0 o +0 son ... cero, NaN no es un número definido, pero un Objeto vacío aparentemente no está realmente vacío), o como me gusta pensar, los condicionales prueban una cosa (verdadera) , mientras ==compara los valores aparentes, cuidadosamente convertidos ( ToPrimitive , ToNumber ) de sus operandos, y ===busca la similitud exacta .

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?

Hay más ejemplos en Verdad, Igualdad y JavaScript en los que esta distinción realmente importa, por ejemplo, '0'es truecondicional (longitud distinta de cero, o es una cosa ), pero falseen una ==comparación (el valor es cero). '1'de nuevo, es trueen ambos casos (es una cosa y tiene un valor distinto de cero).

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
fuente
1
Al principio pensé, "pssh, eso es exagerado, esto ya fue bien respondido". Pero eso fue bien presentado e informativo. Gracias.
Marc L.
8

var bse ajustará a true. Esto se debe a que una cadena vacía cuenta como un valor 'falsey' en JavaScript al igual que otros valores.

Mire http://www.sitepoint.com/javascript-truthy-falsy/ para ver los valores falsos

Jonathon Bolster
fuente
Estás equivocado en tu respuesta. var ben realidad se establecerá en trueporque es lo opuesto a var asi nos fijamos en el código.
bombek
@bombek Gracias, me voy a levantar. Parece que la pregunta original fue editada después de mi respuesta (los valores fueron intercambiados)
Jonathon Bolster
5

Ejemplos de expresiones que se pueden convertir a falso son aquellas que se evalúan como nulas, 0, la cadena vacía ("") o indefinida. (ver referencia de MDN )

Marcel Jackwerth
fuente