resposta rápida
Como verifico se existe uma chave específica em um objeto ou matriz JavaScript? Se uma chave não existir e eu tentar acessá-la, ela retornará falsa? Ou lançar um erro?
Acessar diretamente uma propriedade ausente usando o estilo de matriz (associativo) ou o estilo de objeto retornará uma constante indefinida .
O lento e confiável no operador e no método hasOwnProperty
Como as pessoas já mencionaram aqui, você pode ter um objeto com uma propriedade associada a uma constante "indefinida".
var bizzareObj = {valid_key: undefined};
Nesse caso, você terá que usar o hasOwnProperty ou no operador para saber se a chave está realmente lá. Mas, mas a que preço?
então eu te digo ...
no operador e hasOwnProperty são "métodos" que usam o mecanismo do Descritor de propriedades em Javascript (semelhante ao reflexo de Java na linguagem Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
O tipo de descritor de propriedades é usado para explicar a manipulação e reificação de atributos de propriedades nomeadas. Os valores do tipo Descritor de propriedades são registros compostos por campos nomeados em que o nome de cada campo é um nome de atributo e seu valor é um valor de atributo correspondente, conforme especificado em 8.6.1. Além disso, qualquer campo pode estar presente ou ausente.
Por outro lado, chamar um método ou chave de objeto usará o mecanismo Javascript [[Get]]. Isso é muito mais rápido!
referência
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Usando
no operador
var result = "Impression" in array;
O resultado foi
12,931,832 ±0.21% ops/sec 92% slower
Usando hasOwnProperty
var result = array.hasOwnProperty("Impression")
O resultado foi
16,021,758 ±0.45% ops/sec 91% slower
Acessando elementos diretamente (estilo colchetes)
var result = array["Impression"] === undefined
O resultado foi
168,270,439 ±0.13 ops/sec 0.02% slower
Acessando elementos diretamente (estilo de objeto)
var result = array.Impression === undefined;
O resultado foi
168,303,172 ±0.20% fastest
EDIT: Qual é o motivo para atribuir a uma propriedade o undefined
valor?
Essa pergunta me intriga. Em Javascript, há pelo menos duas referências para objetos ausentes para evitar problemas como este: null
e undefined
.
null
é o valor primitivo que representa a ausência intencional de qualquer valor do objeto ou, em termos curtos, a falta de valor confirmada . Por outro lado, undefined
é um valor desconhecido (não definido). Se houver uma propriedade que será usada posteriormente com um valor adequado, considere usar null
referência em vez de, undefined
porque no momento inicial, confirma-se que a propriedade não possui 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[].
Aconselhar
Evite objetos com undefined
valores. Verifique diretamente sempre que possível e use null
para inicializar os valores da propriedade. Caso contrário, use o in
operador ou hasOwnProperty()
método lento .
EDIT: 12/04/2018 - NÃO É MAIS RELEVANTE
Como as pessoas comentaram, as versões modernas dos mecanismos Javascript (com exceção do Firefox) mudaram a abordagem para as propriedades de acesso. A implementação atual é mais lenta que a anterior para este caso específico, mas a diferença entre a chave de acesso e o objeto é negligenciável.