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 undefinedvalor?
Essa pergunta me intriga. Em Javascript, há pelo menos duas referências para objetos ausentes para evitar problemas como este: nulle 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 nullreferência em vez de, undefinedporque 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 undefinedvalores. Verifique diretamente sempre que possível e use nullpara inicializar os valores da propriedade. Caso contrário, use o inoperador 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.