¿Cómo verifico si existe una clave particular en un objeto o matriz de JavaScript?
Si no existe una clave e intento acceder a ella, ¿devolverá falso? O arrojar un error?
Adán Ernst
¿Cómo verifico si existe una clave particular en un objeto o matriz de JavaScript?
Si no existe una clave e intento acceder a ella, ¿devolverá falso? O arrojar un error?
Ates Goral
Verificar la indefinición no es una forma precisa de probar si existe una clave. ¿Qué pasa si la clave existe pero el valor es realmente undefined
?
var obj = { key: undefined };
console.log(obj["key"] !== undefined); // false, but the key exists!
En su lugar, debe utilizar el in
operador:
var obj = { key: undefined };
console.log("key" in obj); // true, regardless of the actual value
Si desea verificar si una clave no existe, recuerde usar paréntesis:
var obj = { not_key: undefined };
console.log(!("key" in obj)); // true if "key" doesn't exist in object
console.log(!"key" in obj); // Do not do this! It is equivalent to "false in obj"
O, si desea probar particularmente las propiedades de la instancia del objeto (y no las propiedades heredadas), use hasOwnProperty
:
var obj = { key: undefined };
console.log(obj.hasOwnProperty("key")); // true
Para la comparación de rendimiento entre los métodos que se in
, hasOwnProperty
y la clave es undefined
ver esta punto de referencia:
Estoy convencido de que hay casos de uso para tener propiedades configuradas intencionalmente como indefinidas.
– Ates Goral
8 de julio de 2009 a las 16:12
Caso de uso válido: Gecko 1.9.1 [Firefox 3.5] no tiene propiedad window.onhashchange. Geco 1.9.2 [Firefox 3.6] tiene esta propiedad establecida en indefinida (hasta que cambie el hash). Para detectar el historial hash o la versión del navegador, se debe usar window.hasOwnProperty(“onhashchange”);
– SamGoody
12 de febrero de 2010 a las 10:45
Hecho aleatorio: propiedades establecidas en undefined
no será serializado por JSON.stringify(...)
mientras que null
lo hace. Entonces, cualquier cosa establecida para undefined
que es de ida y vuelta a JSON simplemente desaparecerá. También puedes usar delete obj.propName
para eliminar una propiedad de un objeto.
– Simón_Weaver
15 de julio de 2021 a las 4:37
rdlopes
¿Cómo verifico si existe una clave particular en un objeto o matriz de JavaScript? Si no existe una clave y trato de acceder a ella, ¿devolverá falso? O arrojar un error?
Acceder directamente a una propiedad que falta utilizando el estilo de matriz (asociativo) o el estilo de objeto devolverá un indefinido constante.
Como la gente ya ha mencionado aquí, podría tener un objeto con una propiedad asociada con una constante “indefinida”.
var bizzareObj = {valid_key: undefined};
En ese caso, tendrás que usar tiene propiedad propia o en operador para saber si la llave está realmente allí. Pero, pero a que precio
pues te digo…
en operador y tiene propiedad propia son “métodos” que utilizan el mecanismo Property Descriptor en Javascript (similar a la reflexión de Java en el lenguaje Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
El tipo de descriptor de propiedad se utiliza para explicar la manipulación y reificación de los atributos de propiedad con nombre. Los valores del tipo de descriptor de propiedad son registros compuestos por campos con nombre donde el nombre de cada campo es un nombre de atributo y su valor es un valor de atributo correspondiente como se especifica en 8.6.1. Además, cualquier campo puede estar presente o ausente.
Por otro lado, llamar a un método o clave de objeto usará Javascript [[Get]]mecanismo. ¡Eso es mucho más rápido!
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Utilizando en operador
var result = "Impression" in array;
el resultado fue
12,931,832 ±0.21% ops/sec 92% slower
Uso de hasOwnProperty
var result = array.hasOwnProperty("Impression")
el resultado fue
16,021,758 ±0.45% ops/sec 91% slower
Acceso a elementos directamente (estilo de corchetes)
var result = array["Impression"] === undefined
el resultado fue
168,270,439 ±0.13 ops/sec 0.02% slower
Acceso a elementos directamente (estilo de objeto)
var result = array.Impression === undefined;
el resultado fue
168,303,172 ±0.20% fastest
undefined
¿valor?Esa pregunta me desconcierta. En Javascript, hay al menos dos referencias para objetos ausentes para evitar problemas como este: null
y undefined
.
null
es el valor primitivo que representa la ausencia intencional de cualquier valor de objeto, o en términos cortos, el confirmado falta de valor Por otro lado, undefined
es un valor desconocido (no definido). Si hay una propiedad que se usará más adelante con un adecuado valor considerar uso null
referencia en lugar de undefined
porque en el momento inicial la propiedad es confirmado carecer de valor.
Comparar:
var a = {1: null};
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
Evite los objetos con undefined
valores. Compruebe directamente siempre que sea posible y utilice null
para inicializar valores de propiedad. De lo contrario, utilice la lenta in
operador o hasOwnProperty()
método.
Como ha comentado la gente, las versiones modernas de los motores Javascript (con la excepción de Firefox) han cambiado el enfoque para las propiedades de acceso. La implementación actual es más lenta que la anterior para este caso particular, pero la diferencia entre la clave de acceso y el objeto es despreciable.
eli cortesano
regresará undefined
.
var aa = {hello: "world"};
alert( aa["hello"] ); // popup box with "world"
alert( aa["goodbye"] ); // popup box with "undefined"
undefined
es un valor constante especial. Entonces puedes decir, por ejemplo
// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
// do something
}
Esta es probablemente la mejor manera de comprobar si faltan llaves. Sin embargo, como se señala en un comentario a continuación, es teóricamente posible que desee que el valor real sea undefined
. Nunca he necesitado hacer esto y no puedo pensar en una razón por la que querría hacerlo, pero solo para completar, puede usar el in
operador
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}
Si. Devuelve indefinido si se crea como un objeto o una matriz.
– Nosredna
8 de julio de 2009 a las 13:30
¿Qué pasa si la clave existe pero el valor en realidad no está definido?
– Ates Goral
8 de julio de 2009 a las 15:52
Debe usar === en lugar de == al comparar con indefinido, de lo contrario, nulo comparará igual a indefinido.
–Matthew Crumley
8 de julio de 2009 a las 15:56
usuario2320522
"key" in obj
Es probable que solo pruebe valores de atributos de objetos que son muy diferentes de las claves de matriz
encargarse de
La respuesta aceptada se refiere a Objeto. Cuidado con usar el in
operador en Formación para encontrar datos en lugar de claves:
("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)
Para probar elementos existentes en una matriz: ¿La mejor manera de encontrar si un elemento está en una matriz de JavaScript?
Waqar
Tres formas de verificar si una propiedad está presente en un objeto javascript:
!!obj.theProperty
Convertirá valor a bool. devoluciones true
para todos menos el false
valor
theProperty
‘ en objeto
Devolverá verdadero si la propiedad existe, sin importar su valor (incluso vacío)
obj.hasOwnProperty('theProperty')
No comprueba la cadena de prototipos. (ya que todos los objetos tienen la toString
método, 1 y 2 devolverán verdadero, mientras que 3 puede devolver falso).
Referencia:
Si estás usando guión bajo.js biblioteca entonces las operaciones de objeto/matriz se vuelven simples.
En su caso, se puede usar el método _.has. Ejemplo:
yourArray = {age: "10"}
_.has(yourArray, "age")
devoluciones cierto
Pero,
_.has(yourArray, "invalidKey")
devoluciones falso
Todo (casi todo) en JavaScript es un objeto o se puede convertir como uno. Aquí es donde nacen las matrices pseudoasociativas, como señaló @PatrickM.
–Andrew Larsson
03/01/2013 a las 18:50
este punto de referencia jsben.ch/#/WqlIl le brinda una descripción general de las formas más comunes de cómo lograr esta verificación.
– EscapeNetscape
24/10/2016 a las 19:05
una solución rápida, generalmente voy por
property.key = property.key || 'some default value'
en caso de que quiera que esa clave exista con algún valor.– RGLSV
24 de octubre de 2018 a las 8:22