Хэш-карта обычно используется в 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}, удалить: funt (key) {delete this [key]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Пример использования:
hashmap.set ("имя", "Джон Смит"); hashmap.set («Возраст», 24); hashmap.get ("name"); // Джон Смит hashmap.contains ("title"); // false hashmap.contains ("name"); // true hashmap.remove ("age");Проблемы в объекте объявляют участников
Эта проблема может быть связана с механизмом наследования цепочки прототипа объекта. Возьмите метод ToString в качестве примера. Если оператор используется для определения того, существует ли объект:
var map = {}; 'toString' в Map; // истинныйПотому что оператор будет искать, существует ли объект из всех прототипов. Чтобы решить эту проблему, вы можете использовать метод 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 есть = {} .hashownproperty; for (var in map) {if (hast.call (map, key)) {// do whethe}}Голый объект
Хитрость создания реальной хэш -карты состоит в том, чтобы решить все объекты прототипа. Мы можем достичь этого эффекта через Object.create
var obj = {}; // эквивалентен: var obj = object.create (object.prototype);Кроме того, этот метод позволяет полностью отказаться от прототипа и напрямую использовать NULL для наследства.
var map = object.create (null); map ancementof 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 in map) {// что -то сделать}Помимо этих различий, это ничем не отличается от общего хранилища ключей объекта. Объект может быть сериализован, объявленные прототипы и унаследован, а использование переменных контекста одинаково.
var map = object.create (null); object.defineproperties (map, {'foo': {value: 1, enumerable: true}, 'bar': {value: 2, enumerable: false}}); map.foo; // 1map ['bar']; // 2json.stringify (map); // {"foo": 1} {}. hasownproperty.call (map, 'foo'); // true {}. ProperateIsEnumerable.call (map, 'bar'); // ЛОЖЬДаже применимы даже методы обнаружения переменных.
var map = object.create (null); typeof map; // Object {}. ToString.call (map); // [объект объекта] {}. valueof.call (map); // Объект {}