عادةً ما تستخدم خريطة التجزئة في JavaScript كمكان بسيط لتخزين أزواج القيمة الرئيسية. ومع ذلك ، فإن الكائن ليس خريطة تجزئة حقيقية ويمكن أن تسبب مشاكل إذا تم استخدامها بشكل غير صحيح. وقد لا يوفر JavaScript رسم خرائط تجزئة محلية (على الأقل غير متوافق مع المستعرض المتقاطع) ، هناك طريقة أفضل لإعلان خصائص الكائن.
تطبيق بسيط لخريطة التجزئة:
var hashmap = {set: function (key ، value) {this [key] = value} ، get: function (key) {return this [key]} ، يحتوي على: function (key) {return this.get (key) == null؟ false: true} ، refled: function (key) {key [key]}}}}}}}}}مثال على الاستخدام:
hashmap.set ("الاسم" ، "جون سميث") ؛ hashmap.set ("العمر" ، 24) ؛ hashmap.get ("name") ؛ // John Smith hashmap.contains ("title") ؛ // false hashmap.contains ("name") ؛ // true hashmap.remove ("Age") ؛القضايا في الكائنات التي تعلن الأعضاء
قد تكون هذه المشكلة بسبب آلية الميراث لسلسلة النموذج الأولي للكائن. خذ طريقة 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 (map ، 'hasownproperty') ؛ // حقيقيهذه الطريقة لن تسبب أي مشاكل. في كل مرة تحكم على ما إذا كانت الخصائص الموجودة في الكائن موجودة ، يجب عليك تصفية الأساليب في سلسلة النموذج الأولي:
var map = {} ؛ var has = {} .hasOwnProperty ؛ for (var key in map) {if (has.call (map ، key)) {// do something}}كائن عاري
الحيلة لإنشاء خريطة تجزئة حقيقية هي حل جميع كائنات النموذج الأولي. يمكننا تحقيق هذا التأثير من خلال كائن
var obj = {} ؛ // مكافئ لـ: var obj = object.create (object.prototype) ؛بالإضافة إلى ذلك ، تتيح لك هذه الطريقة التخلي تمامًا عن النموذج الأولي واستخدام NULL بشكل مباشر للوراثة.
var map = object.create (null) ؛ map extryof object ؛ // falseobject.prototype.isprototypeof (MAP) ؛ // falseObject.getPrototypeof (MAP) ؛ // باطل
هذه الأشياء العارية (أو القواميس) مثالية مثل خريطة HASP. لأنه لن يكون هناك تعارض ، فإنه سيقاوم أي تحويل نوع ، مثل هذا سيؤدي إلى أخطاء.
var map = object.create (null) ؛ map + "" ؛ // typeerror: لا يمكن تحويل الكائن إلى قيمة بدائية
لا توجد كلمات مخصصة هنا ، وهي مصممة لخريطة التجزئة ، على سبيل المثال.
var map = object.create (null) ؛ 'tostring' في الخريطة ؛ // خطأ شنيعالمضي قدمًا ، لأن ... في الحلقات أصبحت أكثر بساطة ، نحتاج فقط إلى كتابة الحلقة مثل هذا.
var map = object.create (null) ؛ for (var key in map) {// افعل شيئًا}بصرف النظر عن هذه الاختلافات ، لا يختلف عن تخزين قيمة المفتاح العام. يمكن تسلسل الكائن ، النماذج الأولية المعلنة والورث ، واستخدام متغيرات السياق هو نفسه.
var map = object.create (null) ؛ object.defineProperties (map ، {'foo': {value: 1 ، enumeries: true} ، 'bar': {value: 2 ، enumeries: false}}) ؛ map.foo ؛ // 1map ['bar'] ؛ // 2Json.Stringify (MAP) ؛ // {"foo": 1} {}. hasownproperty.call (map ، 'foo') ؛ // true {}. propertyisenumerable.call (Map ، 'Bar') ؛ // خطأ شنيعحتى طرق الكشف المتغيرة المذكورة أعلاه قابلة للتطبيق أيضًا.
var map = object.create (null) ؛ typeof map ؛ // object {}. toString.call (map) ؛ // [Object Object] {}. valueof.call (map) ؛ // هدف {}