¿Hay una función universal de JavaScript que comprueba que una variable tiene un valor y asegura que no es undefined
o null
? Tengo este código, pero no estoy seguro si cubre todos los casos:
function isEmpty(val){
return (val === undefined || val == null || val.length <= 0) ? true : false;
}
(truthy statement) ? true : false;
. Solo hazlo(truthy statement);
.if (hungry) …
lugar deif (hungry === true) …
. Como todas las cosas de codificación de esta manera, es solo cuestión de gustos. Más específico al ejemplo proporcionado por el OP, está diciendo aún más detalladamente: "Si es cierto, entonces cierto, si no es falso" Pero si es cierto, entonces ya es cierto. Y, si es falso, ya es falso. Esto es similar a decir "Si tienes hambre, entonces tienes, y si no, entonces no tienes".Respuestas:
Simplemente puede verificar si la variable tiene un
truthy
valor o no. Eso significaevaluará
true
si novalue
es :La lista anterior representa todos los
falsy
valores posibles en ECMA- / Javascript. Encuéntrelo en la especificación en laToBoolean
sección.Además, si no sabe si existe una variable (es decir, si se declaró ), debe consultar con el
typeof
operador. Por ejemploSi puede estar seguro de que una variable se declara al menos, debe verificar directamente si tiene un
truthy
valor como el que se muestra arriba.Más información: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html
fuente
if( value || value === false )
. Lo mismo ocurre con todos los valores falsos , debemos validarlos explícitamente.truthy
podría ser engañosa. En ese caso, deberíamos verificarvalue.length != 0
una matriz no vacía.if
construcción es sintácticamente demasiado pesado, se puede utilizar el operador ternario, así:var result = undefined ? "truthy" : "falsy"
. O si lo que desea es coaccionar a un valor booleano, utilice el!!
operador, por ejemplo!!1 // true
,!!null // false
.El método detallado para verificar si el valor es indefinido o nulo es:
También puede usar el
==
operador, pero se espera que uno conozca todas las reglas :fuente
null
oundefined
se puede hacer de esta manera:if (value == null)
. Cuidado con el==
operador que coacciona. Si marca asíif (value === null || value === undefined)
, olvidó / no sabe cómo Javascript coacciona. webreflection.blogspot.nl/2010/10/…arg == null
produce los mismos resultados quearg === undefined || arg === null
. Sin embargo, considero que el último ejemplo es más legible.arg == null
Es bastante común en mi experiencia.return value === (void 0)
es más seguro que probar contra elundefined
cual bien puede ser una variable legítima en alcance, lamentablemente.Esto volverá cierto para
y funciones de argumento cero ya que una función
length
es el número de parámetros declarados que toma.Para no permitir la última categoría, es posible que solo desee verificar las cadenas en blanco
fuente
undefined == null
peroundefined !== null
Este es el control más seguro y no lo he visto publicado aquí exactamente así:
Cubrirá casos en los que el valor nunca se definió, y también alguno de estos:
Editado: Cambiado a igualdad estricta (! ==) porque ya es la norma;)
fuente
typeof
operador devuelva una cadena, por lo que usar la estricta verificación de igualdad es técnicamente más preciso, más específico y más rápido. Entonces, realmente, no hay razón para usar la comparación suelta, y no al revés. Tambiénval !== null
es perfectamente válido en muchos casos, lo hago todo el tiempo. Estoy de acuerdo con su argumento de no conformidad, pero creo que este es un mal ejemplo para hacerlo. No estoy tratando de hacerte troll.Puede encontrar útil la siguiente función:
O en ES7 (comenta si hay más mejoras)
Resultados:
"Tenga en cuenta que el operador de enlace (: :) no forma parte de ES2016 (ES7) ni de ninguna edición posterior del estándar ECMAScript. Actualmente es una propuesta de etapa 0 (strawman) para ser introducido en el lenguaje". - Simon Kjellberg. el autor desea agregar su apoyo a esta hermosa propuesta para recibir la ascensión real.
fuente
::
) no forma parte de ES2016 (ES7) ni de ninguna edición posterior del estándar ECMAScript. Actualmente es una propuesta de etapa 0 (hombre de paja) para ser introducido en el idioma.La primera respuesta con la mejor calificación es incorrecta. Si el valor no está definido, arrojará una excepción en los navegadores modernos. Tienes que usar:
o
fuente
undefined
valor.if(value === 0) gameOver();
;)value
es cero, que no es lo que op está buscando.Esta comprobación de estado
es todo lo que necesitas.
fuente
if
ya hace una comprobación falsa, que esto simplemente convierte a un booleano. ¿Captura algún caso que una normalif(foo)
no detecta?active={!!foo}
! compruebe si hay cadenas vacías (""), nulas, indefinidas, falsas y el número 0 y NaN. Digamos, si una cadena está vacía,
var name = ""
entoncesconsole.log(!name)
regresatrue
.esta función devolverá verdadero si val está vacío, nulo, indefinido, falso, el número 0 o NaN .
O
De acuerdo con el dominio de su problema, puede usar like
!val
o!!val
.fuente
isEmpty(val)
si pudieras hacer!val
?!val
o de!!val
acuerdo con el dominio de tu problema.Una solución que me gusta mucho:
Definamos que una variable en blanco es
null
, oundefined
, o si tiene longitud, es cero, o si es un objeto, no tiene claves:Devoluciones:
undefined
,null
,""
,[]
,{}
true
,false
,1
,0
,-1
,"foo"
,[1, 2, 3]
,{ foo: 1 }
fuente
Estás un poco exagerado. Para verificar si a una variable no se le da un valor, solo necesitaría verificar contra indefinido y nulo.
Esto supone
0
,""
y los objetos (incluso el objeto vacío y la matriz) son "valores" válidos.fuente
Si prefiere JavaScript simple, intente esto:
De lo contrario, si ya está usando subrayado o lodash, intente:
fuente
_.isNil
es la función que estás buscando, no_.isEmpty
. Documentación isNilisArray
oisString
funciones en elwindow
.Aquí está el mío: devuelve verdadero si el valor es nulo, indefinido, etc. o en blanco (es decir, contiene solo espacios en blanco):
fuente
es una forma muy agradable y limpia de manejarlo en muchos lugares, también se puede usar para asignar variables
fuente
true
y está tratando de suministrar o devolver unoval
defalse
.const res = falsyValue ? true : falsyValue
Si la variable no ha sido declarada, no podrá probar indefinido utilizando una función porque obtendrá un error.
Ambos generarán un error si no se ha declarado foo.
Si desea probar si se ha declarado una variable, puede usar
si quieres probar si foo ha sido declarado y tiene un valor que puedes usar
fuente
Para verificar el valor predeterminado
comprobar resultado:
Usé la función @Vix () para verificar el objeto de qué tipo.
usando instansof «
fuente
// Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
En ES6 con moldura para manejar cadenas de espacios en blanco:
fuente
Puede ser útil
Todos los valores en la matriz representan lo que quieres ser (nulo, indefinido u otras cosas) y buscas lo que quieres en él.
fuente
Si está utilizando
TypeScript
y no desea tener en cuenta los "valores que sonfalse
" entonces esta es la solución para usted:Primero:
import { isNullOrUndefined } from 'util';
Entonces:
isNullOrUndefined(this.yourVariableName)
Tenga en cuenta: como se menciona a continuación, esto ahora está en desuso, use
value === undefined || value === null
en su lugar. ref .fuente
/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
typescript
cosa. ¿Puede por favor proporcionar el enlace de su documentación?Vacío
No recomiendo tratar de definir o usar una función que calcule si algún valor en todo el mundo está vacío. ¿Qué significa realmente estar "vacío"? Si tengo
let human = { name: 'bob', stomach: 'empty' }
, deberíaisEmpty(human)
volvertrue
? Si tengolet reg = new RegExp('');
, deberíaisEmpty(reg)
volvertrue
? ¿Qué pasaisEmpty([ null, null, null, null ])
? Esta lista solo contiene el vacío, entonces, ¿está vacía la lista misma? Quiero presentar aquí algunas notas sobre "vacuidad" (una palabra intencionalmente oscura, para evitar asociaciones preexistentes) en javascript, y quiero argumentar que la "vacuidad" en los valores de javascript nunca debe tratarse genéricamente.Verdad / falsedad
Para decidir cómo determinar la "vacuidad" de los valores, necesitamos acomodar el sentido inherente e inherente de JavaScript de si los valores son "verdaderos" o "falsos". Naturalmente,
null
yundefined
ambos son "falsos". Menos naturalmente, el número0
(y ningún otro número exceptoNaN
) también es "falso". Menos natural:''
es falso, pero[]
y{}
(ynew Set()
, ynew Map()
) son verdaderos, ¡aunque todos parecen igualmente vacíos!Nulo vs Indefinido
También hay una discusión acerca de
null
vsundefined
: ¿realmente necesitamos ambos para expresar vacío en nuestros programas? Personalmente, evito que las letras u, n, d, e, f, i, n, e, d aparezcan en mi código en ese orden. Siempre usonull
para significar "vacuidad". Una vez más, sin embargo, necesitamos acomodar el sentido inherente de JavaScript de cómonull
yundefined
diferir:undefined
undefined
:undefined
, nonull
:Vacío no genérico
Creo que la vacuidad nunca debe tratarse de manera genérica. En su lugar, siempre deberíamos tener el rigor de obtener más información sobre nuestros datos antes de determinar si son vacíos; principalmente hago esto verificando qué tipo de datos estoy tratando:
Tenga en cuenta que esta función ignora el polimorfismo: espera
value
ser una instancia directa deCls
, y no una instancia de una subclase deCls
. Evitoinstanceof
por dos razones principales:([] instanceof Object) === true
("Una matriz es un objeto")('' instanceof String) === false
("Una cadena no es una cadena")Tenga en cuenta que
Object.getPrototypeOf
se utiliza para evitar un caso comolet v = { constructor: String };
LaisType
función todavía regresa correctamente paraisType(v, String)
(falso) yisType(v, Object)
(verdadero).En general, recomiendo usar esta
isType
función junto con estos consejos:let v = JSON.parse(someRawValue);
, nuestrav
variable ahora es de tipo desconocido. Tan pronto como sea posible, debemos limitar nuestras posibilidades. La mejor manera de hacerlo puede ser exigiendo un tipo particular: por ejemploif (!isType(v, Array)) throw new Error('Expected Array');
, esta es una forma realmente rápida y expresiva de eliminar la naturaleza genérica dev
, y garantizar que siempre sea asíArray
. A veces, sin embargo, debemos permitirv
ser de múltiples tipos. En esos casos, debemos crear bloques de código dondev
ya no sea genérico, lo antes posible:if (v === null) throw new Error('Null value rejected');
, esto es excelente para garantizar que losnull
valores no se logren, pero si un valor se logra , todavía no lo sabemos nada al respecto. Un valorv
que pasa esta verificación nula sigue siendo MUY genérico, ¡es todo menosnull
eso ! Las listas negras apenas disipan el genérico.A menos que un valor sea
null
, nunca considere "un valor vacío". En cambio, considere "una X que está vacía". Esencialmente, nunca considere hacer algo comoif (isEmpty(val)) { /* ... */ }
: no importa cómoisEmpty
se implemente esa función (no quiero saber ...), ¡no tiene sentido! ¡Y es demasiado genérico! La vacuidad solo debe calcularse con conocimiento delval
tipo. Los controles de vacío deberían tener este aspecto:if (isType(val, String) && val.length === 0) ...
if (isType(val, Object) && Object.entries(val).length === 0) ...
if (isType(val, Number) && val <= 0) ...
"Una matriz, sin elementos":
if (isType(val, Array) && val.length === 0) ...
La única excepción es cuando
null
se usa para indicar cierta funcionalidad. En este caso es significativo decir: "Un valor vacío":if (val === null) ...
fuente
Probar con lógica diferente . Puede usar el siguiente código para verificar las cuatro (4) condiciones para la validación como no nulo, no en blanco, no indefinido y no cero solo use este código (! (! (Variable))) en javascript y jquery.
fuente
Puede pensar en esta característica, el
??
operador, como una forma de "retroceder" a un valor predeterminado cuando se trata connull
oundefined
.Nuevamente, el código anterior es equivalente al siguiente.
fuente
pero esta solución está sobredimensionada, si no desea modificar la función más tarde para las necesidades del modelo de negocio, entonces es más limpio usarla directamente en el código:
fuente
Esto nunca arrojará un error. Si myObject , child o myValue es nulo, myNewValue será nulo. No se arrojarán errores
fuente
Para todos los que vienen aquí por tener una pregunta similar, lo siguiente funciona muy bien y lo tengo en mi biblioteca los últimos años:
fuente
Si desea evitar ser verdadero si el valor es cualquiera de los siguientes, según la respuesta de jAndy :
Una posible solución que podría evitar obtener valores verdaderos es la siguiente:
Se usaría de la siguiente manera:
Además de esos escenarios, es posible que desee devolver falso si el objeto o la matriz están vacíos:
Lo harías de esta manera:
Si desea verificar todas las cadenas de espacios en blanco (""), puede hacer lo siguiente:
Nota:
hasOwnProperty
devuelve verdadero para cadenas vacías, 0, falso, NaN, nulo e indefinido, si la variable se declaró como cualquiera de ellos, por lo que podría no ser la mejor opción. La función puede modificarse para usarla para mostrar que se declaró, pero no es utilizable.fuente
Código en GitHub
Las pruebas del pobre hombre 😁
Resultados de la prueba:
fuente
value.constructor === Object
? Mira esto .value.constructor === Object
está bien, en javascript las instrucciones IF tienen orden de ejecución, por lo que la instrucción OR solo se ejecutará si la anterior no devolvió VERDADERO y ya lo hemos verificadoNull
. De hecho, el único propósito de esa última instrucción OR es detectar{}
y garantizar que no devuelva VERDADERO por cosas que no debería.Esto verificará si la variable de anidamiento indeterminado no está definida
Lo anterior verifica si la función de traducción de Google TranslateElement existe. Esto es equivalente a:
fuente
El operador de encadenamiento opcional proporciona una manera de simplificar el acceso a los valores a través de objetos conectados cuando es posible que una referencia o función sea indefinida o nula.
El operador de fusión nulo puede usarse después del encadenamiento opcional para generar un valor predeterminado cuando no se encontró ninguno:
fuente
también verificará los espacios en blanco ('') junto con lo siguiente:
fuente
Creo que usando el? El operador está un poco más limpio.
fuente