¿Cuál es la mejor manera de verificar si una propiedad de objeto en JavaScript es undefined
?
fuente
¿Cuál es la mejor manera de verificar si una propiedad de objeto en JavaScript es undefined
?
La forma habitual de verificar si el valor de una propiedad es el valor especial undefined
, es:
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
Para verificar si un objeto no tiene esa propiedad y, por lo tanto, volverá undefined
de forma predeterminada cuando intente acceder a él:
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
Para verificar si el valor asociado con un identificador es el valor especial undefined
, o si ese identificador no ha sido declarado. Nota: este método es la única forma de referirse a un identificador no declarado (nota: diferente de tener un valor de undefined
) sin un error temprano:
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
En las versiones de JavaScript anteriores a ECMAScript 5, la propiedad denominada "indefinido" en el objeto global era grabable y, por lo tanto, una comprobación simple foo === undefined
podría comportarse inesperadamente si se hubiera redefinido accidentalmente. En JavaScript moderno, la propiedad es de solo lectura.
Sin embargo, en JavaScript moderno, "indefinido" no es una palabra clave, por lo que las variables dentro de las funciones pueden denominarse "indefinido" y sombrear la propiedad global.
Si le preocupa este caso límite (poco probable), puede usar el operador nulo para obtener el undefined
valor especial en sí:
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
obj !== undefined
ahora.undefined
solía ser mutable, comoundefined = 1234
lo que causaría resultados interesantes. Pero después de Ecmascript 5, ya no se puede escribir, por lo que podemos usar la versión más simple. codereadability.com/how-to-check-for-undefined-in-javascriptCreo que hay varias respuestas incorrectas a este tema. Contrariamente a la creencia común, "indefinido" no es una palabra clave en JavaScript y, de hecho, puede tener un valor asignado.
Código correcto
La forma más sólida de realizar esta prueba es:
Esto siempre devolverá el resultado correcto, e incluso maneja la situación donde
myVar
no se declara.Código degenerado NO UTILICE.
Además,
myVar === undefined
generará un error en la situación donde myVar no está declarado.fuente
=== undefined
desconcertante. Sí, puede asignar aundefined
, pero no hay una razón legítima para hacerlo, y es previsible que hacerlo pueda romper su código. En C puede#define true false
, y en Python puede asignarTrue
yFalse
, pero las personas no sienten la necesidad de diseñar su código en esos lenguajes de tal manera que se proteja contra la posibilidad de sabotear deliberadamente su propio entorno en otra parte del código. . ¿Por qué vale laundefined
pena considerar la posibilidad de asignar aquí?void 0
para obtener el valor queundefined
apunta. Entonces puedes hacerloif (myVar === void 0)
. el0
no es especial, puede poner literalmente cualquier expresión allí.undefined
. MDN: indefinidoA pesar de ser recomendado vehementemente por muchas otras respuestas aquí,
typeof
es una mala elección . Nunca debe usarse para verificar si las variables tienen el valorundefined
, porque actúa como una verificación combinada del valorundefined
y si existe una variable. En la gran mayoría de los casos, usted sabe cuándo existe una variable ytypeof
solo presentará la posibilidad de una falla silenciosa si comete un error tipográfico en el nombre de la variable o en la cadena literal'undefined'
.Entonces, a menos que esté haciendo la detección de características², donde hay incertidumbre sobre si un nombre dado estará dentro del alcance (como verificar
typeof module !== 'undefined'
como un paso en el código específico de un entorno CommonJS),typeof
es una elección dañina cuando se usa en una variable, y la opción correcta es para comparar el valor directamente:Algunos conceptos erróneos comunes sobre esto incluyen:
que la lectura de una variable (no inicializada
var foo
) ( ) o parámetro (function bar(foo) { … }
, llamado comobar()
) fallará. Esto simplemente no es cierto: las variables sin inicialización explícita y los parámetros a los que no se les dieron valores siempre se conviertenundefined
, y siempre están dentro del alcance.eso
undefined
puede sobrescribirse. Hay mucho más en esto.undefined
no es una palabra clave en JavaScript. En cambio, es una propiedad en el objeto global con el valor Indefinido. Sin embargo, desde ES5, esta propiedad ha sido de solo lectura y no configurable . Ningún navegador moderno permitiráundefined
que se cambie la propiedad y, a partir de 2017, este ha sido el caso durante mucho tiempo. La falta de modo estricto tampoco afectaundefined
el comportamiento de la persona, solo hace declaraciones comoundefined = 5
no hacer nada en lugar de tirar. Sin embargo, dado que no es una palabra clave, puede declarar variables con el nombreundefined
, y esas variables podrían cambiarse, haciendo este patrón una vez común:más peligroso que usar lo global
undefined
. Si tiene que ser compatible con ES3, reempláceloundefined
convoid 0
- no recurra a éltypeof
. (void
siempre ha sido un operador unario que evalúa el valor Indefinido para cualquier operando).Con la forma en que las variables funcionan, es hora de abordar la pregunta real: las propiedades del objeto. No hay ninguna razón para usar las
typeof
propiedades de objetos. La excepción anterior con respecto a la detección de características no se aplica aquí:typeof
solo tiene un comportamiento especial en las variables y las expresiones que hacen referencia a las propiedades del objeto no son variables.Esta:
siempre es exactamente equivalente a esto³:
y teniendo en cuenta los consejos anteriores, para evitar confundir a los lectores en cuanto a por qué está usando
typeof
, porque tiene más sentido usar===
para verificar la igualdad, porque podría refactorizarse para verificar el valor de una variable más tarde, y porque simplemente se ve mejor, siempre debes usar=== undefined
³ aquí también .Otra cosa a tener en cuenta cuando se trata de las propiedades de los objetos es si realmente desea verificarlo
undefined
. Un nombre de propiedad dado puede estar ausente en un objeto (produciendo el valorundefined
cuando se lee), presente en el objeto mismo con el valorundefined
, presente en el prototipo del objeto con el valorundefined
, o presente en cualquiera de los que no tienenundefined
valor.'key' in obj
le dirá si una clave está en algún lugar de la cadena de prototipo de un objeto, yObject.prototype.hasOwnProperty.call(obj, 'key')
le dirá si está directamente en el objeto. Sin embargo, no entraré en detalles en esta respuesta sobre los prototipos y el uso de objetos como mapas con clave de cadena, porque está destinado principalmente a contrarrestar todos los malos consejos en otras respuestas, independientemente de las posibles interpretaciones de la pregunta original. Leer sobre¡Prototipos de objetos en MDN para más!¹ elección inusual del nombre de la variable de ejemplo? Este es un código muerto real de la extensión NoScript para Firefox.
² Sin embargo, no asuma que no saber lo que está dentro del alcance está bien en general. vulnerabilidad adicional causada por el abuso del alcance dinámico: Project Zero 1225
³ una vez más asumiendo un entorno ES5 + y que se
undefined
refiere a laundefined
propiedad del objeto global. sustituto de lovoid 0
contrario.fuente
undefined
, ocultando el predeterminado. Lo que para la mayoría de los propósitos prácticos tiene el mismo efecto que sobreescribirlo.void 0
para compararlo con indefinido, pero de nuevo, eso es tonto y excesivo.typeof something === "undefined")
en código.void 0
es (por una vez) más corto y más seguro! Eso es una victoria en mi libro.En JavaScript hay nulo y hay indefinido . Tienen diferentes significados.
Marijn Haverbeke afirma, en su libro gratuito en línea " Eloquent JavaScript " (énfasis mío):
Entonces, supongo que la mejor manera de verificar si algo estaba indefinido sería:
¡Espero que esto ayude!
Editar: en respuesta a su edición, las propiedades del objeto deberían funcionar de la misma manera.
fuente
undefined
es solo una variable que el usuario puede reasignar: la escrituraundefined = 'a';
hará que su código ya no haga lo que usted cree que hace. Usartypeof
es mejor y también funciona para variables (no solo propiedades) que no se han declarado.¿Qué significa esto: "propiedad de objeto indefinido" ?
¡En realidad puede significar dos cosas muy diferentes! Primero, puede significar la propiedad que nunca se ha definido en el objeto y, segundo, puede significar la propiedad que tiene un valor indefinido . Veamos este código:
Es
o.a
indefinido? ¡Si! Su valor es indefinido. Eso.b
indefinido? ¡Por supuesto! ¡No hay ninguna propiedad 'b' en absoluto! OK, vea ahora cómo se comportan los diferentes enfoques en ambas situaciones:Podemos ver claramente eso
typeof obj.prop == 'undefined'
yobj.prop === undefined
son equivalentes, y no distinguen esas situaciones diferentes. Y'prop' in obj
puede detectar la situación cuando una propiedad no se ha definido en absoluto y no presta atención al valor de la propiedad que puede estar indefinido.¿Entonces lo que hay que hacer?
1) Desea saber si una propiedad no está definida por el primer o segundo significado (la situación más típica).
2) Solo quiere saber si el objeto tiene alguna propiedad y no le importa su valor.
Notas:
x.a === undefined
o estotypeof x.a == 'undefined'
aumentaReferenceError: x is not defined
si x no está definido.undefined
es una variable global (por lo quewindow.undefined
en realidad está en los navegadores). Se admite desde ECMAScript 1st Edition y desde ECMAScript 5 es de solo lectura . Por lo tanto, en los navegadores modernos no se puede redefinir como verdadero, ya que a muchos autores les encanta asustarnos, pero esto sigue siendo cierto para los navegadores más antiguos.Pelea final:
obj.prop === undefined
vstypeof obj.prop == 'undefined'
Ventajas de
obj.prop === undefined
:undefined
Desventajas de
obj.prop === undefined
:undefined
puede ser anulado en navegadores antiguosVentajas de
typeof obj.prop == 'undefined'
:Desventajas de
typeof obj.prop == 'undefined'
:'undefned'
( mal escrito ) aquí es solo una constante de cadena, por lo que el motor de JavaScript no puede ayudarlo si lo ha escrito mal como lo acabo de hacer.Actualización (para JavaScript del lado del servidor):
Node.js admite la variable global
undefined
comoglobal.undefined
(también se puede usar sin el prefijo 'global'). No sé sobre otras implementaciones de JavaScript del lado del servidor.fuente
undefined
como miembro deglobal
. Además, niconsole.log(global);
tampocofor (var key in global) { ... }
se muestra indefinido como miembro de global . Pero prueba como'undefined' in global
muestra lo contrario.[[Enumerable]]
es falso :-)Minuses of typeof obj.prop == 'undefined'
, esto se puede evitar escribiendo comotypeof obj.prop == typeof undefined
. Esto también da una simetría muy agradable.obj.prop === undefined
.if ('foo' in o
) ... su respuesta es realmente la primera respuesta correcta aquí. Casi todos los demás simplemente responden esa oración.El problema se reduce a tres casos:
undefined
.undefined
.Esto nos dice algo que considero importante:
Hay una diferencia entre un miembro indefinido y un miembro definido con un valor indefinido.
Pero, por desgracia
typeof obj.foo
, no nos dice cuál de los tres casos tenemos. Sin embargo, podemos combinar esto"foo" in obj
para distinguir los casos.Vale la pena señalar que estas pruebas son las mismas para las
null
entradas tambiénYo diría que en algunos casos tiene más sentido (y es más claro) verificar si la propiedad está allí, que verificar si no está definida, y el único caso en el que esta verificación será diferente es el caso 2, el caso raro de Una entrada real en el objeto con un valor indefinido.
Por ejemplo: acabo de refactorizar un montón de código que tenía un montón de comprobaciones de si un objeto tenía una propiedad determinada.
Lo cual fue más claro cuando se escribió sin un cheque para indefinido
Pero como se ha mencionado, estos no son exactamente los mismos (pero son más que suficientes para mis necesidades).
fuente
if (!("x" in blob)) {}
entre paréntesis, porque! el operador tiene prioridad sobre 'in'. Espero que ayude a alguien.a = {b: undefined}
; entoncestypeof a.b === typeof a.c === 'undefined'
pero'b' in a
y!('c' in a)
.{ x : undefined }
o al menos agregarlo como otra alternativa a (2.) en la tabla. Tuve que pensar por un momento para darme cuenta de que el punto (2.) evalúaundefined
(aunque Mencionas eso más adelante).Esto funcionó para mí mientras que los demás no.
fuente
typeof (something == "undefined")
.(typeof something) === "undefined"
.No estoy seguro de que el origen de la utilización
===
contypeof
vino, y como una convención veo utiliza en muchas bibliotecas, pero el operador typeof devuelve un literal de cadena, y sabemos que por adelantado, así que porqué usted también desea escribir compruebalo tambien?fuente
==
aún requiere al menos una verificación de tipo: el intérprete no puede comparar los dos operandos sin conocer primero su tipo.==
es un personaje menos que===
:)Crossposting mi respuesta de la pregunta relacionada ¿ Cómo verificar "indefinido" en JavaScript?
Específico a esta pregunta, ver casos de prueba con
someObject.<whatever>
.Algunos escenarios que ilustran los resultados de varias respuestas: http://jsfiddle.net/drzaus/UVjM4/
(Tenga en cuenta que el uso de
var
forin
tests hace la diferencia en un contenedor con ámbito)Código de referencia:
Y resultados:
fuente
Si lo haces
fallará cuando la variable
myvar
no exista, porque myvar no está definido, por lo que el script se rompe y la prueba no tiene ningún efecto.Debido a que el objeto de ventana tiene un alcance global (objeto predeterminado) fuera de una función, se 'adjuntará' una declaración al objeto de ventana.
Por ejemplo:
La variable global myvar es la misma que window.myvar o window ['myvar']
Para evitar errores de prueba cuando existe una variable global, es mejor usar:
La pregunta si una variable realmente existe no importa, su valor es incorrecto. De lo contrario, es una tontería inicializar variables con indefinido, y es mejor usar el valor falso para inicializar. Cuando sepa que todas las variables que declara se inicializan con falso, simplemente puede verificar su tipo o confiar en
!window.myvar
que verifique si tiene un valor adecuado / válido. Entonces, incluso cuando la variable no está definida, entonces!window.myvar
es igual paramyvar = undefined
omyvar = false
omyvar = 0
.Cuando espere un tipo específico, pruebe el tipo de la variable. Para acelerar la prueba de una condición, es mejor que lo haga:
Cuando la primera y simple condición es verdadera, el intérprete omite las siguientes pruebas.
Siempre es mejor usar la instancia / objeto de la variable para verificar si tiene un valor válido. Es más estable y es una mejor manera de programar.
(y)
fuente
No vi (espero no haberlo extrañado) a nadie revisando el objeto antes de la propiedad. Entonces, este es el más corto y más efectivo (aunque no necesariamente el más claro):
Si obj u obj.prop no está definido, es nulo o "falso", la instrucción if no ejecutará el bloque de código. Este suele ser el comportamiento deseado en la mayoría de las declaraciones de bloque de código (en JavaScript).
fuente
var x = obj && obj.prop || 'default';
En el artículo Explorando el abismo de nulo e indefinido en JavaScript , leí que los marcos como Underscore.js usan esta función:
fuente
void 0
es solo una forma corta de escribirundefined
(ya que eso es lo que devuelve el vacío seguido de cualquier expresión), guarda 3 caracteres. También podría hacerlovar a; return obj === a;
, pero ese es un personaje más. :-)void
es una palabra reservada, mientrasundefined
que no es , es decir, mientras queundefined
es igual avoid 0
por defecto, puede asignar un valor a,undefined
por ejemploundefined = 1234
.isUndefined(obj)
: 16 caracteres.obj === void 0
: 14 caracteres. 'Bastante dicho.Simplemente cualquier cosa no está definida en JavaScript, está indefinida , no importa si es una propiedad dentro de un objeto / matriz o simplemente como una variable simple ...
JavaScript tiene lo
typeof
que hace que sea muy fácil detectar una variable indefinida.Simplemente compruebe si
typeof whatever === 'undefined'
y devolverá un valor booleano.Así es como
isUndefined()
se escribe la famosa función en AngularJs v.1x:Entonces, como ve que la función recibe un valor, si ese valor está definido, devolverá
false
, de lo contrario, para valores indefinidos, devolverátrue
.Así que echemos un vistazo a cuáles serán los resultados cuando pasemos valores, incluidas las propiedades de los objetos como a continuación, esta es la lista de variables que tenemos:
y los verificamos a continuación, puede ver los resultados frente a ellos como un comentario:
Como puede ver, podemos verificar cualquier cosa usando algo como esto en nuestro código, como se mencionó, simplemente puede usar
typeof
en su código, pero si lo está usando una y otra vez, cree una función como la muestra angular que comparto y siga reutilizando como siguiendo el patrón de código DRY.También una cosa más, para verificar la propiedad de un objeto en una aplicación real que no está seguro, incluso si el objeto existe o no, verifique si el objeto existe primero.
Si marca una propiedad en un objeto y el objeto no existe, arrojará un error y detendrá la ejecución de toda la aplicación.
Tan simple que puede envolver dentro de una declaración if como a continuación:
Que también es igual a isDefined en Angular 1.x ...
También otros marcos de JavaScript como el subrayado tienen una verificación de definición similar, pero le recomiendo que use
typeof
si ya no usa ningún marco.También agrego esta sección de MDN que tiene información útil sobre typeof, undefined and void (0).
más> aquí
fuente
' if (window.x) {} ' es a prueba de errores
Lo más probable es que quieras
if (window.x)
. Esta comprobación es segura incluso si no se ha declarado x (var x;
): el navegador no arroja un error.Ejemplo: quiero saber si mi navegador admite API de historial
Cómo funciona esto:
La ventana es un objeto que contiene todas las variables globales como sus miembros, y es legal intentar acceder a un miembro no existente. Si x no se ha declarado o no se ha establecido,
window.x
devuelve indefinido . undefined conduce a falso cuando if () lo evalúa.fuente
typeof history != 'undefined'
en realidad funciona en ambos sistemas.Al leer esto, me sorprende que no haya visto esto. He encontrado múltiples algoritmos que funcionarían para esto.
Nunca definido
Si el valor de un objeto nunca se definió, esto evitará que regrese
true
si se define comonull
oundefined
. Esto es útil si desea que se devuelva verdadero para los valores establecidos comoundefined
Definido como indefinido o nunca definido
Si desea que resulte
true
en valores definidos con el valor deundefined
, o nunca definidos, simplemente puede usar=== undefined
Definido como un valor falso, indefinido, nulo o nunca definido.
Comúnmente, la gente me ha pedido un algoritmo para determinar si un valor es falso
undefined
onull
. Los siguientes trabajos.fuente
if (!obj.prop)
var obj = {foo: undefined}; obj.foo === void 0
->true
. ¿Cómo es que "nunca se define comoundefined
"? Esto está mal.fuente
Compárese con
void 0
, para ser conciso.No es tan detallado como
if (typeof foo !== 'undefined')
fuente
foo
no está declarado.La solución es incorrecta. En JavaScript
devolverá verdadero, porque ambos están "fundidos" en un booleano y son falsos. La forma correcta sería verificar
cual es el operador de identidad ...
fuente
===
es el tipo igualdad + (igualdad primitiva | identidad de objeto), donde las primitivas incluyen cadenas. Creo que la mayoría de las personas consideran'abab'.slice(0,2) === 'abab'.slice(2)
poco intuitivo si uno lo considera===
como el operador de identidad.Puede obtener una matriz totalmente indefinida con la ruta utilizando el siguiente código.
Enlace jsFiddle
fuente
getUndefiend
debería serlogetUndefined
.Aquí está mi situación:
Estoy usando el resultado de una llamada REST. El resultado debe analizarse desde JSON a un objeto JavaScript.
Hay un error que necesito defender. Si los argumentos de la llamada de descanso fueron incorrectos en la medida en que el usuario especificó los argumentos incorrectos, la llamada de descanso vuelve básicamente vacía.
Mientras usaba esta publicación para ayudarme a defenderme de esto, lo intenté.
Para mi situación, si restResult.data [0] === "objeto", entonces puedo comenzar a inspeccionar con seguridad el resto de los miembros. Si no está definido, arroje el error como se indica arriba.
Lo que digo es que para mi situación, todas las sugerencias anteriores en esta publicación no funcionaron. No digo que tenga razón y todos están equivocados. No soy un maestro de JavaScript en absoluto, pero espero que esto ayude a alguien.
fuente
typeof
guardia en realidad no protege contra nada que una comparación directa no pueda manejar. SirestResult
no está definido o no está declarado, todavía arrojará.if(!restResult.data.length) { throw "Some error"; }
Hay una manera agradable y elegante de asignar una propiedad definida a una nueva variable si está definida o asignarle un valor predeterminado como reserva si no está definida.
Es adecuado si tiene una función, que recibe una propiedad de configuración adicional:
Ahora ejecutándose
fuente
Todas las respuestas están incompletas. Esta es la forma correcta de saber que hay una propiedad 'definida como indefinida':
Ejemplo:
Lástima que esta haya sido la respuesta correcta está enterrada en respuestas incorrectas> _ <
Entonces, para cualquiera que pase, ¡te daré indefinidos gratis!
fuente
Revisando los comentarios, para aquellos que desean verificar ambos, está indefinido o su valor es nulo:
Si está utilizando jQuery Library,
jQuery.isEmptyObject()
será suficiente para ambos casos,fuente
Si está usando Angular:
Underscore.js:
fuente
1
a la variablex
? ¿Necesito subrayar o jQuery? (sorprendente que la gente use las bibliotecas incluso para las operaciones más elementales, como untypeof
cheque)Yo uso
if (this.variable)
para probar si está definido. Simpleif (variable)
, recomendado anteriormente , falla para mí. Resulta que funciona solo cuando variable es un campo de algún objeto,obj.someField
para verificar si está definido en el diccionario. Pero podemos usarthis
owindow
como objeto de diccionario, ya que cualquier variable es un campo en la ventana actual, según tengo entendido. Por lo tanto, aquí hay una pruebaPrimero detecta que la variable
abc
no está definida y se define después de la inicialización.fuente
Proporciono tres formas aquí para aquellos que esperan respuestas extrañas:
isUndefined1:
Intente obtener una propiedad del valor de entrada, verifique el mensaje de error si existe. Si el valor de entrada es indefinido, el mensaje de error sería Tipo de error no capturado: no se puede leer la propiedad 'b' de indefinido
isUndefined2:
Convierta el valor de entrada en una cadena para comparar
"undefined"
y asegúrese de que sea un valor negativo.isUndefined3:
En js, el parámetro opcional funciona cuando el valor de entrada es exactamente
undefined
.fuente
ES2019 introdujo una nueva característica: encadenamiento opcional que puede usar para usar una propiedad de un objeto solo cuando un objeto se define así:
Hará referencia a la propiedad del teléfono solo cuando se definan los detalles de usuario y contacto.
Árbitro. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
fuente
Devuelve falso si la variable está establecida, y verdadero si no está definido.
Luego use:
fuente
typeof
prueba de manera significativa en una función. Es sorprendente que 4 personas hayan votado por esto. -1.Me gustaría mostrarle algo que estoy usando para proteger la
undefined
variable:Esto prohíbe que cualquiera cambie el
window.undefined
valor, por lo tanto, destruye el código basado en esa variable. Si se usa"use strict"
, cualquier cosa que intente cambiar su valor terminará en error, de lo contrario se ignoraría en silencio.fuente
También puede usar Proxy, funcionará con llamadas anidadas, pero requerirá una comprobación adicional:
así que lo usarás como:
fuente