2012-03-28 15 views
7

¿Puede alguien explicarme por qué esto devuelve una cadena vacía ("") en lugar de una booleana (falsa)?Javascript devolviendo la cadena en lo que debería ser una prueba booleana taquillera

var x = ""; 
alert(x && x.length > 0); 

... Aunque esto funciona como se espera, volviendo cierto:

var y = "abc"; 
alert(y && y.length > 0); 

Básicamente, estoy tratando de hacer una simple comprobación abreviada para ver si existe un valor en una variable (asegurando que no es cadena indefinida, nula o vacía).

Sé que puedo hacer cada prueba individualmente (x == nulo, typeof x == 'undefined', x == '') - Solo trato de entender por qué Javascript devuelve una cadena en lo que parece ser una prueba booleana.

+4

nota que se puede forzar el retorno de una '' boolean' utilizando !! (x) ' – ajax333221

+0

deberías poder acortar con algo más parecido a' alert (typeof x! = Undefined && x.length> 0) 'porque esos dos devuelven bools, aunque, si alguna vez x no está definido, puede arrojar un error (muy probablemente) porque el 1er argumento podría ser un error, sería mejor dividirlos en mini func o en línea – SpYk3HH

Respuesta

7

Cuando se cumple un operador condicional en JavaScript, devuelve el último valor evaluado.

var x = ""; 
alert(x && x.length > 0); 

Una cadena vacía es Falsey-, por lo que cuando se utiliza solo x en una condición, será falsa. Debido a que está usando &&, si el LHS es falso, entonces no hay razón para molestarse en verificar el RHS. Esto es short circuit evaluation. Por lo tanto, la última parte evaluada, la cadena vacía, se devuelve a alert().

var y = "abc"; 
alert(y && y.length > 0); 

una cadena no vacía es Truthy. Entonces, el LHS es true, y como es un &&, se evalúa el RHS (debe conocerse si la condición completa es true). El valor de retorno de y.length > 0 es true, por lo que se pasa a su alert().

+0

en caso de que esta información ayude a alguien leyendo th es decir, los valores de JS falsey son = '0," ", falso, nulo, indefinido, NaN' – ajax333221

+0

gracias a @alex, tiene perfecto sentido. – kman

0

Es cadena de retorno y vacía porque x ya está definido, solo está vacío.

Esto hace que la primera parte de su expresión alert(x) muestre una cadena vacía.

Si necesita comprobar una cadena nula/vacía, intente algo como esto.

String.isNullOrWhiteSpace = function (str) { 
    if (typeof str === "string") { 
     var isNullOrWhiteSpace = false; 

     // Check for null string 
     if (str == null || typeof str === "undefined") isNullOrWhiteSpace = true; 

     // Check for string with whitespace 
     if (str.replace(/\s/g, '').length < 1) isNullOrWhiteSpace = true; 

     return isNullOrWhiteSpace; 
    } 

    if (typeof str === "undefined" || str == null) { 
     return true; 
    } 
}; 
0

Las operaciones condicionales utilizando el (operador AND) && se detendrá cuando:

  • Una de las condiciones evaluadas a false
  • Se realizó con éxito hasta el final evaluando todo para true

El resultado de las operaciones condicionales será el último evaluado antes de detenerse (no es necesario riamente un boolean)

Para forzar el retorno de una verdadera todo lo boolean, se puede envolver alrededor de !!(...), ejemplo:

alert(typeof !!(...) === "boolean"); //will always be true no matter what conditions are inside 
Cuestiones relacionadas