Peta hash biasanya digunakan dalam JavaScript sebagai tempat sederhana untuk menyimpan pasangan nilai kunci. Namun, objek bukan peta hash sejati dan berpotensi menyebabkan masalah jika digunakan secara tidak benar. Dan JavaScript mungkin tidak menyediakan pemetaan hash lokal (setidaknya tidak kompatibel silang-browser), ada cara yang lebih baik untuk mendeklarasikan properti objek.
Implementasi sederhana dari peta hash:
var hashMap = {set: function (key, value) {this [key] = value}, get: function (key) {return ini [key]}, contains: function (key) {return this.get (key) == null? false: true}, hapus: function (key) {hapus ini [key]}}Contoh Penggunaan:
hashmap.set ("nama", "John Smith"); hashmap.set ("usia", 24); hashmap.get ("name"); // John Smith hashmap.contains ("title"); // false hashmap.contains ("name"); // true hashmap.remove ("usia");Masalah di objek mendeklarasikan anggota
Masalah ini mungkin disebabkan oleh mekanisme warisan rantai prototipe objek. Ambil metode tostring sebagai contoh. Jika Operator digunakan untuk menentukan apakah ada objek:
var peta = {}; 'toString' di peta; // BENARKarena operator akan mencari apakah objek ada dari semua prototipe. Untuk mengatasi masalah ini, Anda dapat menggunakan metode HasownProperty untuk mendeteksi apakah ada objek:
var peta = {}; peta.hasownproperty ('toString'); // PALSUMetode ini bekerja dengan sangat baik, tetapi jika Anda mendefinisikan properti HasownProperty, mungkin merepotkan:
var peta = {}; peta.hasownproperty = 'foo'; peta.hasownproperty ('hasownproperty'); // typeErrorPerbaikan cepat untuk ini adalah dengan menggunakan objek asli.
var peta = {}; peta.hasownproperty = 'foo'; {}. HasownProperty.call (peta, 'HasownProperty'); // BENARMetode ini tidak akan menyebabkan masalah. Setiap kali Anda menilai apakah properti dalam objek ada, Anda harus menyaring metode dalam rantai prototipe:
var peta = {}; var memiliki = {} .hasOwnProperty; for (tombol var di peta) {if (has.call (peta, key)) {// lakukan sesuatu}}Objek telanjang
Trik untuk membuat peta hash asli adalah untuk memecahkan semua objek prototipe. Kita dapat mencapai efek ini melalui objek.
var obj = {}; // setara dengan: var obj = object.create (object.prototype);Selain itu, metode ini memungkinkan Anda untuk sepenuhnya meninggalkan prototipe dan secara langsung menggunakan NULL untuk mewarisi.
var map = object.create (null); peta instance dari objek; // falseObject.prototype.isprototypeOf (peta); // falseObject.getPrototypeOf (peta); // null
Objek telanjang ini (atau kamus) sangat ideal sebagai peta hasp. Karena tidak akan ada konflik, itu akan menolak konversi jenis apa pun, seperti ini akan menyebabkan kesalahan.
var map = object.create (null); peta + ""; // typeerror: tidak dapat mengonversi objek menjadi nilai primitif
Tidak ada kata -kata yang dipesan di sini, ini dirancang untuk peta hash, misalnya.
var map = object.create (null); 'tostring' di peta; // PALSULebih jauh, karena ... di loop menjadi lebih sederhana, kita hanya perlu menulis loop seperti ini.
var map = object.create (null); untuk (tombol var di peta) {// lakukan sesuatu}Terlepas dari perbedaan-perbedaan ini, tidak ada bedanya dengan penyimpanan nilai kunci objek umum. Objek dapat diserialisasi, dinyatakan prototipe dan diwariskan, dan penggunaan variabel konteks adalah sama.
var map = object.create (null); object.defineProPerties (peta, {'foo': {value: 1, enumerable: true}, 'bar': {value: 2, enumerable: false}}); peta.foo; // 1map ['bar']; // 2json.stringify (peta); // {"foo": 1} {}. hasownproperty.call (peta, 'foo'); // true {}. PropertyIseNumerable.call (peta, 'bar'); // PALSUBahkan metode deteksi variabel yang disebutkan di atas juga berlaku.
var map = object.create (null); typeof Map; // objek {}. ToString.call (peta); // [objek objek] {}. valueof.call (peta); // objek {}