risposta rapida
Come posso verificare se esiste una chiave particolare in un oggetto o in una matrice JavaScript? Se una chiave non esiste e provo ad accedervi, restituirà false? O lanciare un errore?
L'accesso diretto a una proprietà mancante utilizzando lo stile dell'array (associativo) o lo stile dell'oggetto restituirà una costante indefinita .
Il metodo lento e affidabile per operatore e hasOwnProperty
Come le persone hanno già menzionato qui, potresti avere un oggetto con una proprietà associata a una costante "non definita".
var bizzareObj = {valid_key: undefined};
In questo caso, si dovrà utilizzare hasOwnProperty o in all'operatore di sapere se la chiave è davvero lì. Ma a quale prezzo?
quindi ti dico ...
in operator e hasOwnProperty sono "metodi" che usano il meccanismo del descrittore di proprietà in Javascript (simile alla riflessione Java nel linguaggio Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Il tipo di descrittore di proprietà viene utilizzato per spiegare la manipolazione e la reificazione degli attributi delle proprietà denominate. I valori del tipo Descrittore proprietà sono record composti da campi denominati in cui il nome di ciascun campo è un nome di attributo e il suo valore è un valore di attributo corrispondente come specificato in 8.6.1. Inoltre, qualsiasi campo può essere presente o assente.
D'altra parte, la chiamata di un metodo o chiave oggetto utilizzerà il meccanismo Javascript [[Get]]. È molto più veloce!
prova delle prestazioni
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Utilizzando
in operatore
var result = "Impression" in array;
Il risultato è stato
12,931,832 ±0.21% ops/sec 92% slower
Utilizzo di hasOwnProperty
var result = array.hasOwnProperty("Impression")
Il risultato è stato
16,021,758 ±0.45% ops/sec 91% slower
Accesso diretto agli elementi (stile parentesi)
var result = array["Impression"] === undefined
Il risultato è stato
168,270,439 ±0.13 ops/sec 0.02% slower
Accesso diretto agli elementi (stile oggetto)
var result = array.Impression === undefined;
Il risultato è stato
168,303,172 ±0.20% fastest
EDIT: Qual è il motivo per assegnare a una proprietà il undefined
valore?
Questa domanda mi confonde. In Javascript, ci sono almeno due riferimenti per oggetti assenti per evitare problemi come questo: null
e undefined
.
null
è il valore primitivo che rappresenta l'assenza intenzionale di qualsiasi valore di oggetto, o in breve, la mancanza di valore confermata . D'altra parte, undefined
è un valore sconosciuto (non definito). Se è presente una proprietà che verrà utilizzata in seguito con un valore corretto , prendere in considerazione l'uso di null
riferimento anziché undefined
perché nel momento iniziale la proprietà viene confermata priva di valore.
Confrontare:
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[].
Consigliare
Evita oggetti con undefined
valori. Controllare direttamente quando possibile e utilizzare null
per inizializzare i valori delle proprietà. In caso contrario, utilizzare l' in
operatore o il hasOwnProperty()
metodo lento .
MODIFICA: 12/04/2018 - NON RILEVANTE PIÙ
Come le persone hanno commentato, le versioni moderne dei motori Javascript (con l'eccezione di Firefox) hanno cambiato l'approccio per le proprietà di accesso. L'implementazione attuale è più lenta della precedente per questo caso particolare, ma la differenza tra chiave di accesso e oggetto è trascurabile.