en javascript,
var a = '';
var b = (a) ? true : false;
var b
se ajustará a false
.
¿Es este un comportamiento definido en el que se puede confiar?
javascript
string
boolean
cc joven
fuente
fuente
false
aquí: jsfiddle.net/8CKbd''
se evalúa a falso en un contexto booleano así que sia = '';
entoncesa ? false : true
=>'' ? false : true
=>false ? false : true
=>true
(porque es la evaluación de un valor falso). Creo que debería servar b = (a) ? true : false;
correcto con la siguiente declaración.Respuestas:
Si. Javascript es un dialecto de ECMAScript, y la especificación del lenguaje ECMAScript define claramente este comportamiento:
Cita tomada de http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
fuente
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 paranew Number(0)
e inclusonew Boolean(false)
. Es una buena razón para no usar las versiones de objetos en su código, y eso significa queif (str.length)
maneja este caso límite mientrasif (str)
que no lo haría.Si. Todo
false
,0
, cadenas vacías''
y""
,NaN
,undefined
, ynull
siempre se evalúan comofalse
; todo lo demás estrue
.Y en su ejemplo, b es
false
después de la evaluación. (Creo que escribiste por errortrue
)fuente
null
no esfalse
, tampocotrue
,null
esnull
. jsfiddle.net/sq1Lkpg0NaN
yundefined
. No lo sonfalse
pero son falsas. Que es lo que se le pidió.Como la explicación anterior, sí , ese es el comportamiento definido de una cadena vacía en un condicional (una
if
expresió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 :
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 booleanofalse
.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 .Hay más ejemplos en Verdad, Igualdad y JavaScript en los que esta distinción realmente importa, por ejemplo,
'0'
estrue
condicional (longitud distinta de cero, o es una cosa ), perofalse
en una==
comparación (el valor es cero).'1'
de nuevo, estrue
en ambos casos (es una cosa y tiene un valor distinto de cero).fuente
var b
se ajustará atrue
. 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
fuente
var b
en realidad se establecerá entrue
porque es lo opuesto avar a
si nos fijamos en el código.fuente