แผนที่แฮชมักจะใช้ใน JavaScript เป็นสถานที่ง่าย ๆ ในการจัดเก็บคู่คีย์-ค่า อย่างไรก็ตามวัตถุไม่ใช่แผนที่แฮชที่แท้จริงและอาจทำให้เกิดปัญหาได้หากใช้อย่างไม่เหมาะสม และ JavaScript อาจไม่ได้ให้การแมปแฮชในท้องถิ่น (อย่างน้อยก็ไม่สามารถใช้งานได้ข้ามเบราว์เซอร์) มีวิธีที่ดีกว่าในการประกาศคุณสมบัติของวัตถุ
การใช้งานแผนที่แฮชอย่างง่าย:
var hashmap = {set: function (key, value) {นี้ [คีย์] = value}, get: function (key) {ส่งคืนนี้ [คีย์]}, มี: ฟังก์ชัน (คีย์) {return.get (คีย์) == null? talse: true}, ลบ: ฟังก์ชัน (คีย์)ตัวอย่างการใช้งาน:
hashmap.set ("ชื่อ", "John Smith"); hashmap.set ("อายุ", 24); hashmap.get ("ชื่อ"); // John Smith hashmap.contains ("title"); // false hashmap.contains ("ชื่อ"); // true hashmap.remove ("อายุ");ปัญหาในวัตถุประกาศสมาชิก
ปัญหานี้อาจเกิดจากกลไกการสืบทอดของห่วงโซ่ต้นแบบวัตถุ ใช้วิธีการ ToString เป็นตัวอย่าง หากมีการใช้ตัวดำเนินการเพื่อตรวจสอบว่าวัตถุมีอยู่:
var map = {}; 'toString' ในแผนที่; // จริงเพราะผู้ประกอบการจะมองว่าวัตถุนั้นมีอยู่จากต้นแบบทั้งหมดหรือไม่ ในการแก้ปัญหานี้คุณสามารถใช้วิธี HasownProperty เพื่อตรวจสอบว่าวัตถุมีอยู่หรือไม่:
var map = {}; map.hasownproperty ('toString'); // เท็จวิธีนี้ใช้งานได้ดีมาก แต่ถ้าคุณกำหนดคุณสมบัติ HasownProperty มันอาจจะลำบาก:
var map = {}; map.hasownproperty = 'foo'; map.hasownproperty ('hasownproperty'); // typeerrorการแก้ไขอย่างรวดเร็วนี้คือการใช้วัตถุดั้งเดิม
var map = {}; map.hasownproperty = 'foo'; {}. hasownproperty.call (แผนที่ 'hasownproperty'); // จริงวิธีนี้จะไม่ทำให้เกิดปัญหาใด ๆ ทุกครั้งที่คุณตัดสินว่าคุณสมบัติในวัตถุมีอยู่หรือไม่คุณต้องกรองวิธีการในห่วงโซ่ต้นแบบ:
var map = {}; var มี = {} .hasownproperty; สำหรับ (var key ในแผนที่) {ถ้า (มี. call (แผนที่, key)) {// ทำอะไร}}}วัตถุเปลือยกาย
เคล็ดลับในการสร้างแผนที่แฮชจริงคือการแก้ปัญหาวัตถุต้นแบบทั้งหมด เราสามารถบรรลุเอฟเฟกต์นี้ผ่าน Object.create
var obj = {}; // เทียบเท่ากับ: var obj = object.create (object.prototype);นอกจากนี้วิธีนี้ช่วยให้คุณสามารถละทิ้งต้นแบบได้อย่างสมบูรณ์และใช้ NULL โดยตรงเพื่อสืบทอด
var map = object.create (null); MAP อินสแตนซ์ของวัตถุ; // talleobject.prototype.isprototypeof (แผนที่); // talleobject.getPrototypeof (แผนที่); // โมฆะ
วัตถุเปลือยเปล่าเหล่านี้ (หรือพจนานุกรม) เหมาะอย่างยิ่งเป็นแผนที่ HASP เนื่องจากจะไม่มีความขัดแย้งมันจะต่อต้านการแปลงประเภทใด ๆ เช่นนี้จะทำให้เกิดข้อผิดพลาด
var map = object.create (null); map + ""; // typeError: ไม่สามารถแปลงวัตถุเป็นค่าดั้งเดิม
ไม่มีคำที่สงวนไว้ที่นี่มันถูกออกแบบมาสำหรับแผนที่แฮชเป็นต้น
var map = object.create (null); 'toString' ในแผนที่; // เท็จต่อไปสำหรับ ... ในลูปกลายเป็นเรื่องง่ายขึ้นเราแค่ต้องเขียนลูปแบบนี้
var map = object.create (null); สำหรับ (var key ในแผนที่) {// ทำบางสิ่งบางอย่าง}นอกเหนือจากความแตกต่างเหล่านี้มันไม่แตกต่างจากที่เก็บคีย์-ค่าวัตถุทั่วไป วัตถุสามารถถูกทำให้เป็นอนุกรมต้นแบบที่ประกาศและสืบทอดมาและการใช้ตัวแปรบริบทเหมือนกัน
var map = object.create (null); object.defineproperties (แผนที่, {'foo': {ค่า: 1, enumerable: true}, 'bar': {value: 2, enumerable: false}}); map.foo; // 1map ['bar']; // 2json.stringify (แผนที่); // {"foo": 1} {}. hasownproperty.call (แผนที่, 'foo'); // true {}. propertyisenumerable.call (แผนที่, 'bar'); // เท็จแม้แต่วิธีการตรวจจับตัวแปรที่กล่าวถึงข้างต้นก็ใช้ได้เช่นกัน
var map = object.create (null); Typeof map; // วัตถุ {}. toString.call (แผนที่); // [วัตถุวัตถุ] {}. valueof.call (แผนที่); // วัตถุ {}