songStar0904 / es6

learn es6 by jspang

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

第14节:map数据结构

songStar0904 opened this issue · comments

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

Object 和 Map 比较

ObjectMap类似的一点就是它们都允许你按键存取一个值, 都可以删除键, 还可以检测一个键是否绑定值。区别在于:

  • 一个对象通常都有自己的原型, 所以一个对象总有一个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'
}
  • 迭代映射
  1. for..of循环来实现迭代
  2. 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"]]
}