第14节:map数据结构
songStar0904 opened this issue · comments
songStar commented
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
Object 和 Map 比较
Object
和 Map
类似的一点就是它们都允许你按键存取一个值, 都可以删除键, 还可以检测一个键是否绑定值。区别在于:
- 一个对象通常都有自己的原型, 所以一个对象总有一个
prototype
键。 不过ES5 开始使用obj = Object.create(null)
来创建一个没有原型的对象。 - 一个对象的键只能是字符串或者
Symbols
, 但是Map键可以是任意键。 - 你可以通过size属性很容易的得到一个Map键值对的个数, 而对象的键值对个数只能手动确认。
使用Map
{
var myMap = new Map();
var keyObj = {},
keyFunc = function () {},
keyString = 'a string';
// 添加键
myMap.set(keyString, 'Sting 键的值');
myMap.set(keyObj, 'Obj 键的值');
myMap.set(keyFunc, 'Func 键的值');
console.log(myMap); // Map(3) {"a string" => "Sting 键的值", {…} => "Obj 键的值", ƒ => "Func 键的值"}
// 读取值
myMap.get(keyFunc); // "Func 键的值"
myMap.size; // 3
myMap.delete(keyString); // true
myMap.size; // 2
myMap.clear();
console.log(myMap); // Map(0) {}
}
- 将NaN作为映射的键
NaN 也可以作为Map对象的键, 虽然NaN 和任何值甚至和自己都不想等(NaN !== NaN), 但是两个NaN作为Map的键来说没有区别。
{
let myMap = new Map();
myMap.set(NaN, 'not a Number');
myMap.get(NaN); // 'not a Number'
let otherNaN = Number('foo');
myMap.get(otherNaN); // 'not a Number'
}
- 迭代映射
- for..of循环来实现迭代
- forEach()方法迭代
- 映射与数组对象的关系
{
let arr = [['key1', 'val1'], ['key2', 'val2']];
let myMap = new Map(arr);
myMap.get('key1'); // val1
console.log(JSON.stringify([...myMap])); // [["key1","val1"],["key2","val2"]]
}