本文内容html
在Map出现以前,要实现相似需求,只能使用Object,可是Object仍是存在一些问题的。编程
[object Object]
来使用的Map 对象保存键值对。任何值(对象或者原始值) 均可以做为一个键或一个值。
new Map([iterator])
['key', 'value']
)。TypeError: object is not iterable
const map = new Map(); // Create map.set('name','xialei'); map.set('site', 'https://www.ddhigh.com'); // Update map.set('name', 'xialeistudio'); // Read map.get('name'); // Delete map.delete('name'); // 清空 map.clear(); // map大小 console.log(map.size);
JS中基本数据类型有string、number、boolean、null、undefined、symbol,复杂数据类型有object(包括object,array,function等),还有个特殊的NaN(typeof结果是number),分别对这些类型进行测试segmentfault
const map = new Map(); const sKey = 'key', nKey = 1, bKey = true, nullKey = null, uKey = undefined, symbolKey = Symbol("key"), oKey = {}, ooKey = oKey, aKey = [], fKey = function () { }, nanKey = NaN; map.set(sKey, "string") .set(nKey, "number") .set(bKey, "boolean") .set(nullKey, "null") .set(uKey, "undefined") .set(symbolKey, "symbol") .set(oKey, "object") .set(aKey, "array") .set(fKey, "function") .set(nanKey, "NaN"); console.log(map); console.log(map.get(sKey) === "string", map.get("key") === "string"); console.log(map.get(nKey) === "number", map.get(1) === "number"); console.log(map.get(bKey) === "boolean", map.get(true) === "boolean"); console.log(map.get(nullKey) === "null", map.get(null) === "null"); console.log(map.get(uKey) === "undefined", map.get(undefined) === "undefined"); console.log(map.get(symbolKey) === "symbol"); console.log(map.get(oKey) === "object", map.get({}) === "object", map.get(oKey) === map.get(ooKey)); console.log(map.get(aKey) === "array", map.get([]) === "array"); console.log(map.get(fKey) === "function", map.get(function () { }) === "function"); console.log(map.get(nanKey) === "NaN", map.get(NaN) === "NaN");
输出以下数组
Map { 'key' => 'string', 1 => 'number', true => 'boolean', null => 'null', undefined => 'undefined', Symbol(key) => 'symbol', {} => 'object', [] => 'array', [Function: fKey] => 'function', NaN => 'NaN' } true true true true true true true true true true true true false true true false true false true true
结论安全
有序
的,按照插入顺序同时迭代键值编程语言
// 普通版本 const map = new Map(); map.set("1", 1); map.set("2", 2); for (const [k, v] of map) { console.log(k, v); } // 迭代器版本 const map = new Map(); map.set("1", 1); map.set("2", 2); for (const [k, v] of map.entries()) { console.log(k, v); }
迭代键函数
// 普通版本 const map = new Map(); map.set("1", 1); map.set("2", 2); for (const k of map.keys()) { console.log(k, map.get(k)); } // 迭代器版本 const map = new Map(); map.set("1", 1); map.set("2", 2); for (const [k] of map.entries()) { // 解构赋值 console.log(k, map.get(k)); }
迭代值测试
// 普通版本 const map = new Map(); map.set("1", 1); map.set("2", 2); for (const v of map.values()) { console.log(v); } // 迭代器版本 const map = new Map(); map.set("1", 1); map.set("2", 2); for (const [,v] of map.entries()) { console.log(v); }
forEach()this
forEach方法的顺序是value, key,不是key, value!
const map = new Map(); map.set("1", 1); map.set("2", 2); map.forEach((value, key) => { console.log(value, key); });
const obj = { name: 'xialei', site: 'https://www.ddhigh.com' }; const map = new Map(obj); console.log(map);
执行报错TypeError: object is not iterable
,由于Object不是可迭代对象。spa
可迭代对象:ES6新出的语法,对象或对象的原型链实现了Symbol.iterator方法,关于迭代器的内容将在下一篇文章中详细介绍
咱们给Object.prototype添加属性方法来支持迭代:
warning: 正式代码请谨慎修改原型链!
const obj = { name: 'xialei', site: 'https://www.ddhigh.com' }; Object.prototype[Symbol.iterator] = function () { // Symbol.iterator能够理解为全局惟一的标识 const keys = Object.keys(this); let keyIndex = 0; return { next() { if (keyIndex < keys.length) { const key = keys[keyIndex++]; return { value: [key, obj[key]] }; // 迭代值 } return { done: true }; // 迭代结束 } } }; const map = new Map(obj); console.log(map);
只支持[[key, value]]这种二维数组。二维数组的每个元素包含key和value两个子元素
const map = new Map([['name', 'xialeistudio'], ['site', 'https://www.ddhigh.com']]);
因为Map是可迭代对象,所以能够做为参数传给Map构造函数两个Map的元素是同样的,不是Map不相等,由于不是同一个对象
const map = new Map([['name', 'xialeistudio'], ['site', 'https://www.ddhigh.com']]); const map2 = new Map(map); console.log(map === map2); // false
多个Map能够合并,相同key会被覆盖,规则为后面的覆盖前面的
const map = new Map([ [1, 1], [2, 2] ]); const map2 = new Map([ [1, 2] ]); const map3 = new Map([...map, ...map2]); console.log(map3); // Map { 1 => 2, 2 => 2 }
Map的出现解决了传统object没法直接解决的问题,更好地向标准编程语言靠近(标准编程语言通常会提供Map集合),使用的坑也比较少(好比没有object做为key时转换为[object Object]的问题)。
更多原创文章,尽在天天进步一点点