¿Cuáles son los valores en JavaScript que son 'Falsey-' , lo que significa que se evalúan como falso en expresiones como if(value)
, value ?
y !value
?
Ya hay algunas discusiones sobre el propósito de los valores de falsey en Stack Overflow , pero no hay una respuesta completa exhaustiva que enumere cuáles son todos los valores de falsey.
No pude encontrar ninguna lista completa en MDN JavaScript Reference , y me sorprendió descubrir que los mejores resultados al buscar una lista completa y autorizada de valores de falsey en JavaScript fueron artículos de blog, algunos de los cuales tenían omisiones obvias (por ejemplo, NaN
), y ninguno de los cuales tenía un formato como el de Stack Overflow donde se podían agregar comentarios o respuestas alternativas para señalar peculiaridades, sorpresas, omisiones, errores o advertencias. Entonces, parecía tener sentido hacer uno.
fuente
if()
pestaña para la veracidad.[[]] == ""
pero[] != []
? Me duele la cabeza ...Respuestas:
Valores de Falsey en JavaScript
false
Number
tipo:0
y también-0
,0.0
y la forma hexagonal0x0
( RBT gracias )BigInt
tipo:0n
y-0n
(nuevo en 2020, gracias GetMeARemoteJob )""
,''
y``
- cadenas de longitud 0null
undefined
NaN
document.all
(solo en navegadores HTML)document.all
es un objeto falsey, contypeof
asundefined
. Era una función propiedad de Microsoft en IE antes de IE11, y se agregó a la especificación HTML como una "violación intencional de la especificación de JavaScript" para que los sitios escritos para IE no se rompan al intentar acceder, por ejemplodocument.all.something
; es falso porqueif (document.all)
solía ser una forma popular de detectar IE, antes de los comentarios condicionales. Consulte ¿Por qué document.all es falso? para detalles"Falsey" simplemente significa que la
ToBoolean
función interna de JavaScript regresafalse
.ToBoolean
subyace!value
,value ? ... : ...;
yif (value)
. Aquí está su especificación oficial (borrador de trabajo 2020) (los únicos cambios desde la primera especificación de ECMAscript en 1997 son la adición de los símbolos de ES6 , que siempre son verdaderos yBigInt
, mencionados anteriormente:Comparaciones con
==
(igualdad suelta)Vale la pena hablar sobre las comparaciones sueltas de
==
los valores falsos , que usanToNumber()
y pueden causar cierta confusión debido a las diferencias subyacentes. Efectivamente forman tres grupos:false, 0, -0, "", ''
todos coinciden con==
false == ""
,'' == 0
y por lo tanto4/2 - 2 == 'some string'.slice(11);
null, undefined
juntar con==
null == undefined
peroundefined != false
typeof null
devuelve'object'
, nonull
es un objeto, este es un error / peculiaridad de larga data que no se corrigió para mantener la compatibilidad. No es un objeto verdadero, y los objetos son verdaderos (excepto por esa "violación intencional"document.all
cuando Javascript se implementa en HTML)NaN
no coincide con nada, con==
o===
, ni siquiera consigo mismoNaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
Con "igualdad estricta" (
===
), no existen tales agrupaciones. Sólofalse
===
false
.Esta es una de las razones por las que muchos desarrolladores y muchas guías de estilo (por ejemplo, standardjs ) prefieren
===
y casi nunca usan==
.Valores de verdad que realmente
== false
"Verdad" simplemente significa que la
ToBoolean
función interna de JavaScript regresatrue
. Una peculiaridad de Javascript a tener en cuenta (y otra buena razón para preferir===
sobre==
): es posible que un valor sea verdadero (ToBoolean
retornostrue
), pero también== false
.Puede pensar que
if (value && value == false) alert('Huh?')
es una imposibilidad lógica que no podría suceder, pero lo hará, para:"0"
y'0'
- son cadenas no vacías, que son verdaderas, pero Javascript==
coincide con números con cadenas equivalentes (por ejemplo42 == "42"
). Puesto que0 == false
, si"0" == 0
,"0" == false
.new Number(0)
ynew Boolean(false)
- son objetos, que son verdaderos, pero==
ve sus valores, cuáles== false
.0 .toExponential();
- un objeto con un valor numérico equivalente a0
[]
,[[]]
Y[0]
(gracias cloudfeet para el enlace de Igualdad JavaScript Tabla )Algunos valores más verdaderos
Estos son solo algunos valores que algunas personas podrían esperar ser falsos, pero en realidad son verdaderos.
-1
y todos los números negativos distintos de cero' '
," "
,"false"
,'null'
... todas las cadenas no vacías, incluyendo cadenas que son simplemente los espacios en blancoCualquier cosa de
typeof
, que siempre devuelve una cadena no vacía, por ejemplo:typeof null
(devuelve una cadena'object'
debido a un error / peculiaridad de larga data )typeof undefined
(devuelve una cadena'undefined'
)Cualquier objeto (excepto esa "violación intencional"
document.all
en los navegadores; recuerde quenull
no es realmente un objeto a pesar detypeof
sugerir lo contrario). Incluso:{}
[]
function(){}
o() => {}
(cualquier función, incluidas las funciones vacías)Error
y cualquier instancia deError
new
(incluyendonew Number(0)
ynew Boolean(false)
)true
,1
,"1"
Y[1]
de retornotrue
cuando se compara entre sí con==
.fuente
!
,if
y?..:
tienen en común es que ellos llaman el interiorToBoolean
función del valor. La forma en que se comportan esos valores en el contexto de!
,if
etc. ya está implícita en su nombre: son valores "falsos". Soy un poco de miedo de que otros lean la respuesta y piensan "Oh por lo que en este contexto (!
,if
,?...:
), el valor esfalse
, pero con!!
, estrue
" , pero no entiendo el concepto subyacente. Otros dos puntos: 1)v ? true : false
es solo una forma detallada de!!v
. 2)typeof
siempre devuelve una cadena no vacía, lo cual es verdadero.typeof null
otypeof undefined
específicamente. Se podría decir que las cadenas no vacías son verdaderas.document.all
es falso .x == false
se llamará a loToNumber(x)
que es muy diferente deToBoolean(x)
. Podría valer la pena explicarlo. También me di cuenta de que ya había comentado sobre esta respuesta hace años: DNo te olvides de la cadena no vacía
"false"
que se evalúa comotrue
fuente
:-)
Solo para agregar a la lista de valores falsos de @ user568458:
Además del número entero 0, el número decimal 0.0, 0.00 o cualquier número cero también es un valor falso.
Impresiones de fragmentos de código anteriores
I am a falsy value
De manera similar, la representación hexadecimal del número 0 también es un valor falso como se muestra en el siguiente fragmento de código:
El fragmento de código anterior se imprime nuevamente
I am a falsy value
.fuente
0
,0x0
,0.0
Y0.00
son sólo diferentes literales para el mismo IEEE-754 64-bit de punto flotante de valor cero.Además del tema, a partir de ES2020 tenemos un nuevo valor que es falso, es BigInt zero (0n):
Entonces, con esto, ahora tenemos 7 valores "falsos" en total (sin incluir document.all como lo mencionó el usuario anteriormente, ya que es parte de DOM y no de JS).
fuente