Pregunta ¿Verifica si existe una clave en un objeto de JavaScript?


¿Cómo puedo verificar si una clave en particular existe en un objeto o matriz de JavaScript?

Si una clave no existe, e intento acceder a ella, ¿devolverá falsa? O lanzar un error?


2221
2017-07-08 13:21


origen


Respuestas:


La comprobación de la indefinición no es una forma precisa de comprobar si existe una clave. ¿Qué pasa si la clave existe pero el valor es en realidad undefined?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

Deberías usar el in operador:

"key" in obj // true, regardless of the actual value

Si desea verificar si una clave no existe, recuerde usar paréntesis:

!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj   // ERROR!  Equivalent to "false in obj"

O bien, si desea probar particularmente las propiedades de la instancia del objeto (y no las propiedades heredadas), use hasOwnProperty:

obj.hasOwnProperty("key") // true

Para la comparación del rendimiento entre los métodos que están in, hasOwnProperty y la clave es undefined, mira esto punto de referencia


3074
2017-07-08 15:51



respuesta rápida

¿Cómo puedo verificar si una clave en particular existe en un objeto o matriz de JavaScript?   Si una clave no existe e intento acceder a ella, ¿devolverá falsa? O lanzar un error?

Acceder directamente a una propiedad que falta mediante el estilo de matriz (asociativo) o el estilo de objeto devolverá un indefinido constante.

El lento y confiable en operador y hasOwnProperty método

Como las personas ya han mencionado aquí, podría tener un objeto con una propiedad asociada con una constante "indefinida".

 var bizzareObj = {valid_key:  undefined};

En ese caso, deberás usar hasOwnProperty o en operador para saber si la clave está realmente allí. Pero, pero a qué precio?

entonces, te digo ...

en operador y hasOwnProperty son "métodos" que usan el mecanismo del Descriptor de propiedades 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 la 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 utilizará el mecanismo Javascript [[Get]]. ¡Eso es mucho más rápido!

punto de referencia

http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array

Comparing key access in JS.

Utilizando en operador
var result = "Impression" in array;

El resultado fue

12,931,832 ±0.21% ops/sec      92% slower 
Usando hasOwnProperty
var result = array.hasOwnProperty("Impression")

El resultado fue

16,021,758 ±0.45% ops/sec     91% slower
Accediendo a elementos directamente (estilo de paréntesis)
var result = array["Impression"] === undefined

El resultado fue

168,270,439 ±0.13 ops/sec     0.02% slower 
Accediendo a los elementos directamente (estilo del objeto)
var result = array.Impression  === undefined;

El resultado fue

168,303,172 ±0.20%     fastest

EDIT: ¿Cuál es la razón para asignar a una propiedad el 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 otra parte, undefined es un valor desconocido (no definido). Si hay una propiedad que se usará más adelante con un apropiado valor considerar uso null referencia en lugar de undefined porque en el momento inicial la propiedad es confirmado carecer de un 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[].

Asesorar

Evitar objetos con undefined valores. Verifique directamente siempre que sea posible y use null para inicializar valores de propiedad. De lo contrario, use la lenta in operador o hasOwnProperty() método.

EDITAR: 12/04/2018 - NO ES RELEVANTE MÁS

Como han comentado las personas, las versiones modernas de los motores de Javascript (con la excepción de Firefox) han cambiado el enfoque de las propiedades de acceso. La implementación actual es más lenta que la anterior para este caso en particular, pero la diferencia entre la clave de acceso y el objeto es insignificante.


224
2018-02-27 16:38



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, p.

// 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 verificar si faltan llaves. Sin embargo, como se señala en un comentario a continuación, teóricamente es 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 alguna vez quiera, pero solo para completar, puedes usar el in operador

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}

114
2017-07-08 13:24



los respuesta aceptada se refiere a Objeto. Ten cuidado al usar 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 forma de encontrar si un artículo está en una matriz de JavaScript?


22
2017-07-01 12:45



"key" in obj

Probablemente solo pruebe valores de atributos de objetos que son muy diferentes de las claves de matriz


20
2018-04-25 15:45



Tres formas de verificar si una propiedad está presente en un objeto javascript:

  1. !! obj.theProperty
    Convertirá el valor a bool. devuelve TRUE para todos menos el valor 'falso'
  2. 'theProperty' en obj
    Devolverá verdadero si la propiedad existe, sin importar su valor (incluso vacío)
  3. obj.hasOwnProperty ('theProperty')
    No verifica la cadena del prototipo. (dado que todos los objetos tienen el método 'toString', 1 y 2 devolverán verdadero en él, mientras que 3 puede devolver falso en él).

Referencia:

http://book.mixu.net/node/ch5.html


20
2017-11-12 09:19



Si estás usando underscore.js biblioteca, entonces las operaciones objeto / matriz se vuelven simples.

En su caso _.se puede usar el método. Ejemplo:

yourArray = {age: "10"}

_.has(yourArray, "age")

devoluciones cierto 

Pero,

_.has(yourArray, "invalidKey")

devoluciones falso


13
2018-05-29 19:37



Responder:

if ("key" in myObj)
{
    console.log("key exists!");
}
else
{
    console.log("key doesn't exist!");
}

Explicación:

los in el operador verificará si la clave existe en el objeto. Si marcó si el valor no estaba definido: if (myObj["key"] === 'undefined'), podría encontrarse con problemas porque una clave podría existir en su objeto con el undefined valor.

Por esa razón, es una práctica mucho mejor usar primero el in operador y luego compare el valor que está dentro de la clave una vez que ya sabe que existe.


10
2018-06-22 02:29