respuesta rápida
¿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á false? O arrojar un error?
Acceder directamente a una propiedad que falta utilizando el estilo de matriz (asociativo) o el estilo de objeto devolverá una constante indefinida .
El operador lento y confiable en el método hasOwnProperty
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á que usar hasOwnProperty o en operator para saber si la clave está realmente allí. Pero, pero a qué precio?
así que te digo ...
en operator y hasOwnProperty son "métodos" que utilizan el mecanismo 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 Descriptor de propiedad son registros compuestos de 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
.
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
Acceso 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
Acceso a elementos directamente (estilo de objeto)
var result = array.Impression === undefined;
El resultado fue
168,303,172 ±0.20% fastest
EDITAR: ¿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 de 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, la falta de valor confirmada . Por otro lado, undefined
es un valor desconocido (no definido). Si hay una propiedad que se usará más tarde con un valor apropiado , considere usar la null
referencia de uso en lugar de undefined
porque en el momento inicial se confirma que la propiedad carece 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[].
Asesorar
Evitar objetos con undefined
valores. Marque directamente siempre que sea posible y úselo null
para inicializar valores de propiedad. De lo contrario, utilice el in
operador o hasOwnProperty()
método lento .
EDITAR: 04/12/2018 - NO PERTINENTE MÁS
Como la gente ha comentado, las versiones modernas de los motores 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 particular, pero la diferencia entre la clave de acceso y el objeto es despreciable.