Помимо добавления Set (типа коллекции) в ES6 (автор находится в этой статье«Сет и слабый набор»Он был введен), сегодняшняя статья познакомит вас с новыми введенными типами — Map (mapping type) и WeakMap. Тип сопоставления определяется в информатике как ассоциативный массив, а определение ассоциативного массива — это набор нескольких пар ключ/значение (пара ключ/значение), где каждое значение ключа может встречаться только один раз.
В этой статье будут представлены следующие аспекты:
- Пример кода карты
- Примеры распространенных методов Map
- Разница между картой и объектом
- Введение в слабую карту
Время чтения этой статьи оценивается в 5 минут.
Пример кода карты
Ключи и значения карты могут быть любого типа данных.Пары ключ-значение расположены в порядке вставки.Если вставлено повторяющееся значение ключа, следующее значение ключа перезапишет прежнее.Следующий код представляет собой простой пример, демонстрирующий некоторые варианты использования Map:
let map = new Map();
let o = {n: 1};
map.set(o, "A"); //add
map.set("2", 9);
console.log(map.has("2")); //check if key exists
console.log(map.get(o)); //retrieve value associated with key
console.log(...map);
console.log(map);
map.delete("2"); //delete key and associated value
map.clear(); //delete everything
//create a map from iterable object
let map_1 = new Map([[1, 2], [4, 5]]);
console.log(map_1.size); //number of keys
Приведенный выше код выведет
true
A
[ { n: 1 }, 'A' ] [ '2', 9 ]
Map { { n: 1 } => 'A', '2' => 9 }
2
Из приведенного выше кода мы видим, что новый синтаксис Map() используется для объявления, тип ключа карты может использовать любой объект в качестве ключа (строка, тип объекта, функции), мы напрямую передаем в виде двух Пара ключ-значение размерного массива для функции сборки, первый элемент является ключом, а последний элемент является значением.
const map=new Map([['foo',1],['foo',2]])
console.log(map);
console.log(map.get('foo'))
Приведенный выше код выведет:
Map { 'foo' => 2 }
2
Из приведенного выше кода видно, что если такой же ключ существует, следующая информация о значении ключа перезапишет предыдущую информацию о значении ключа в соответствии с принципом FIFO (первым пришел, первым вышел, первым поступил).
Примеры распространенных методов Map
В следующей таблице перечислены методы, связанные с картой.
Как работать |
Описание контента |
---|---|
map.set(key,value) |
Добавьте пары ключ-значение на карту |
map.get(key) |
Получить соответствующее значение ключа на карте |
map.delete(key) |
Удалить пару ключ-значение с карты |
map.clear() |
Очистить все пары ключ-значение на карте |
map.entries() |
Возвращает массив двоичных массивов (пар ключ-значение) в виде элементов |
map.has(key) |
Проверьте, содержит ли карта пару ключ-значение |
map.keys() |
Возвращает итерируемый объект со всеми ключами текущей карты в качестве элементов. |
map.values() |
Возвращает все значения на текущей карте как перекрывающийся объект |
map.size |
Количество пар ключ-значение на карте |
Добавить или удалить пары ключ-значение и очистить MAP
let user={name:"Aaron",id:1234};
let userHobbyMap=new Map();
userHobbyMap.set(user,['Ice fishing','Family Outting']);//添加键值对
console.log(userHobbyMap);
userHobbyMap.delete(user);//删除键值对
userHobbyMap.clear(); //清空键值对
console.log(userHobbyMap);
Приведенный выше код выведет:
Map { { name: 'Aaron', id: 1234 } => [ 'Ice fishing', 'Family Outting' ] }
Map {}
получить пару ключ-значение
В отличие от объекта коллекции Set, элементы объекта коллекции не имеют идентификации позиции элемента, поэтому нет способа получить элемент набора, но объект сопоставления состоит из пар ключ-значение, поэтому ключ можно использовать для получения соответствующего значения.
const map=new Map();
map.set('foo', 'bar');
console.log(map.get('foo')); //output bar
Проверить, существует ли ключ в объекте карты
Как и коллекция Set, карта Map также может использовать метод has(key) для проверки включения ключа.
const map=new Map([['foo',1]])
console.log(map.has('foo'));//output true
console.log(map.has('bar'));//output false
Перебор пар ключ-значение на карте
Объект карты также является итерируемым объектом по дизайну, который можно проходить через цикл for-of, а также можно проходить с помощью foreach. Объект сопоставления имеет метод entry(), который используется для возврата итерируемого объекта двоичного массива, содержащего все пары ключ-значение, в то время как for-of и foreach сначала используют метод entry() для преобразования объекта сопоставления в объект массива класса. , а затем повторить еще раз.
const map=new Map([['foo',1],['bar',2]]);
console.log(Array.from(map.entries()));
//output
//[ [ 'foo', 1 ], [ 'bar', 2 ] ]
for(const [key,value] of map){
console.log(`${key}:${value}`);
}
//output
//foo:1
//bar:2
map.forEach((value,key,map)=>
console.log(`${key}:${value}`))
//output
//foo:1
//bar:2
Разница между картой и объектом
Учитывая так много методов сопоставления объектов, в чем разница между объектами Map и Object?В следующей таблице обобщены:
Контраст |
Карта объекта Карта |
Объект |
---|---|---|
Хранить пары ключ-значение |
√ |
√ |
Перебрать все пары ключ-значение |
√ |
√ |
Проверьте, включена ли указанная пара ключ-значение |
√ |
√ |
использовать строку в качестве ключа |
√ |
√ |
Использовать символ как ключ |
√ |
√ |
Используйте произвольные объекты в качестве ключей |
√ |
|
Очень удобно знать количество пар ключ-значение |
√ |
Из этого мы видим, что объект Map может использовать любой объект в качестве ключа, что решает большую проблему в нашем практическом приложении.Например, когда объект DOM используется в качестве ключа, Object не так прост в использовании.
WeakMap
Как и типы коллекций (Set), типы карт также имеют слабую версию WeakMap. WeakMap очень похож на WeakSet, за исключением того, что ключи WeakMap будут проверять ссылку на переменную, и как только любая из ссылок будет освобождена, пара ключ-значение будет удалена.
Следующие три пункта являются основными различиями между Map и WeakMap: 1. Ключ объекта Map может быть любого типа, но ключ в объекте WeakMap может быть только ссылкой на объект 2. WeakMap не может содержать объекты, на которые нет ссылок, иначе он будет автоматически удален из коллекции (механизм сборки мусора). 3. Объект WeakSet не является перечислимым и не может получить размер.
В следующем примере кода проверяются указанные выше свойства WeakMap:
let weakmap = new WeakMap();
(function(){
let o = {n: 1};
weakmap.set(o, "A");
})(); // here 'o' key is garbage collected
let s = {m: 1};
weakmap.set(s, "B");
console.log(weakmap.get(s));
console.log(...weakmap); // exception thrown
weakmap.delete(s);
weakmap.clear(); // Exception, no such function
let weakmap_1 = new WeakMap([[{}, 2], [{}, 5]]); //this works
console.log(weakmap_1.size); //undefined”
const weakmap=new WeakMap();
let keyObject={id:1};
const valObject={score:100};
weakmap.set(keyObject, valObject);
console.log(weakmap.get(keyObject));
//output { score: 100 }
keyObject=null;
console.log(weakmap.has(keyObject));
//output false
подраздел
Сегодняшнее содержание представлено здесь. Мы понимаем, что Map — это объект сопоставления пар ключ-значение. По сравнению с Object любой ключ может использоваться как ключ-значение, и пары ключ-значение могут быть легко получены. WeakMap — это неперечисляемый объект по отношению к Map, и объекты должны использоваться в качестве ключевых значений. Как лучше использовать Map и WeakMap также необходимо гибко использовать в сочетании с нашими реальными бизнес-сценариями.
[Основы ES6] Введение в константу
[Основы ES6] Значения параметров по умолчанию
[Основы ES6] Синтаксис распространения
[Основы ES6] назначение деструктурирования
[Основы ES6] Функции стрелок (Функции стрелок)
Для получения более интересного контента, пожалуйста, подпишитесь на официальный аккаунт Front-end Talent в WeChat!