jawaban cepat
Bagaimana cara saya memeriksa apakah ada kunci tertentu dalam objek atau array JavaScript? Jika kunci tidak ada dan saya mencoba mengaksesnya, akankah itu kembali palsu? Atau melempar kesalahan?
Mengakses secara langsung properti yang hilang menggunakan gaya array (asosiatif) atau gaya objek akan menghasilkan konstanta yang tidak terdefinisi .
Lambat dan dapat diandalkan di operator dan hasOwnProperty metode
Seperti yang telah disebutkan orang di sini, Anda dapat memiliki objek dengan properti yang terkait dengan konstanta "tidak terdefinisi".
var bizzareObj = {valid_key: undefined};
Dalam hal ini, Anda harus menggunakan hasOwnProperty atau di operator untuk mengetahui apakah kuncinya benar-benar ada. Tapi, berapa harganya?
jadi, saya katakan ...
di operator dan hasOwnProperty adalah "metode" yang menggunakan mekanisme Property Descriptor dalam Javascript (mirip dengan refleksi Java dalam bahasa Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Tipe Deskriptor Properti digunakan untuk menjelaskan manipulasi dan reifikasi atribut properti yang disebutkan. Nilai dari tipe Deskriptor Properti adalah rekaman yang terdiri dari bidang yang dinamai di mana setiap bidang adalah nama atribut dan nilainya adalah nilai atribut yang sesuai seperti yang ditentukan dalam 8.6.1. Selain itu, bidang apa pun mungkin ada atau tidak ada.
Di sisi lain, memanggil metode objek atau kunci akan menggunakan mekanisme Javascript [[Get]]. Itu jauh lebih cepat!
patokan
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Menggunakan
dalam operator
var result = "Impression" in array;
Hasilnya adalah
12,931,832 ±0.21% ops/sec 92% slower
Menggunakan hasOwnProperty
var result = array.hasOwnProperty("Impression")
Hasilnya adalah
16,021,758 ±0.45% ops/sec 91% slower
Mengakses elemen secara langsung (gaya kurung)
var result = array["Impression"] === undefined
Hasilnya adalah
168,270,439 ±0.13 ops/sec 0.02% slower
Mengakses elemen secara langsung (gaya objek)
var result = array.Impression === undefined;
Hasilnya adalah
168,303,172 ±0.20% fastest
EDIT: Apa alasan untuk memberikan undefined
nilai pada properti ?
Pertanyaan itu membingungkan saya. Dalam Javascript, setidaknya ada dua referensi untuk objek yang tidak ada untuk menghindari masalah seperti ini: null
dan undefined
.
null
adalah nilai primitif yang menunjukkan tidak adanya nilai objek yang disengaja, atau dalam jangka pendek, kurangnya nilai yang dikonfirmasi . Di sisi lain, undefined
adalah nilai yang tidak diketahui (tidak didefinisikan). Jika ada properti yang akan digunakan kemudian dengan nilai yang tepat, pertimbangkan untuk menggunakan null
referensi alih-alih undefined
karena pada saat awal properti tersebut dikonfirmasi tidak memiliki nilai.
Membandingkan:
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[].
Menasihati
Hindari benda dengan undefined
nilai. Periksa secara langsung jika memungkinkan dan gunakan null
untuk menginisialisasi nilai properti. Jika tidak, gunakan in
operator atau hasOwnProperty()
metode yang lambat .
EDIT: 12/04/2018 - JANGAN RELEVAN LAGI
Seperti yang dikomentari orang, mesin Javascript versi modern (dengan pengecualian firefox) telah mengubah pendekatan untuk properti akses. Implementasi saat ini lebih lambat dari yang sebelumnya untuk kasus khusus ini tetapi perbedaan antara kunci akses dan objek diabaikan.