¿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
falseNumbertipo:0y también-0,0.0y la forma hexagonal0x0( RBT gracias )BigInttipo:0ny-0n(nuevo en 2020, gracias GetMeARemoteJob )"",''y``- cadenas de longitud 0nullundefinedNaNdocument.all(solo en navegadores HTML)document.alles un objeto falsey, contypeofasundefined. 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
ToBooleanfunción interna de JavaScript regresafalse.ToBooleansubyace!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 == "",'' == 0y por lo tanto4/2 - 2 == 'some string'.slice(11);null, undefinedjuntar con==null == undefinedperoundefined != falsetypeof nulldevuelve'object', nonulles 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.allcuando Javascript se implementa en HTML)NaNno coincide con nada, con==o===, ni siquiera consigo mismoNaN != NaN,NaN !== NaN,NaN != false,NaN != nullCon "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
ToBooleanfunció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 (ToBooleanretornostrue), 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.
-1y 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.allen los navegadores; recuerde quenullno es realmente un objeto a pesar detypeofsugerir lo contrario). Incluso:{}[]function(){}o() => {}(cualquier función, incluidas las funciones vacías)Errory cualquier instancia deErrornew(incluyendonew Number(0)ynew Boolean(false))true,1,"1"Y[1]de retornotruecuando se compara entre sí con==.fuente
!,ify?..:tienen en común es que ellos llaman el interiorToBooleanfunción del valor. La forma en que se comportan esos valores en el contexto de!,ifetc. 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 : falsees solo una forma detallada de!!v. 2)typeofsiempre devuelve una cadena no vacía, lo cual es verdadero.typeof nullotypeof undefinedespecíficamente. Se podría decir que las cadenas no vacías son verdaderas.document.alles falso .x == falsese 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 comotruefuente
:-)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 valueDe 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.0Y0.00son 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