号网站开发,学校英语网站栏目名称,网站开发学习网站,网站怎么广告投放Map数据类型顾名思义也就是映射类型,包含一个[[Entries]]私有特性我们可以使用一个二维数组作为初始值const map1 new Map([[1, 1],[2, 2],[3, 3],]);
console.log(Map数据类型, map1);当然也可以使用迭代器进行初始化const map2 new Map({[Symbol.iterator]…Map数据类型顾名思义也就是映射类型,包含一个[[Entries]]私有特性我们可以使用一个二维数组作为初始值 const map1 new Map([[1, 1],[2, 2],[3, 3],]);
console.log(Map数据类型, map1);
当然也可以使用迭代器进行初始化const map2 new Map({[Symbol.iterator]: function* () {yield* [[1, 1],[2, 2],[3, 3],];},});console.log(Map数据类型, map2);
我们来看一下Map数据类型内部结构(着重看下私有特性)我们可以看到,Map数据类型包含了一个[[Entries]]私有特性这个特性中可以看到一个清晰的映射关系而在Map数据类型的原型上还挂在了很多方法诸如 get set delete clear等操作方法还有一个关于size属性的get访问器特性另外,我们还可以清晰地看到Map数据类型包含着迭代器属性,且迭代方法默认为entries()我们首先来学习一下关于Map的操作方法.set() const emptyMap new Map();console.log(emptyMap, emptyMap);emptyMap.set(name, shang)console.log(set结果, emptyMap);
新增映射关系由于set方法会返回被操作的Map数据,所以可以链式调用 emptyMap.set(gender, male).set(age, 17);console.log(set结果, emptyMap);
可以链式调用.get() console.log(get方法, emptyMap.get(name)
通过键获取映射值.has() console.log(has方法, emptyMap.has(name))
通过has方法检验映射是否存在.delete() emptyMap.delete(name)
console.log(delete结果, emptyMap);
使用delete删除一个映射.clear() emptyMap.clear()console.log(emptyMap的size, emptyMap.size);
clear后,所有映射关系都被清除了Map数据类型可以接受各种类型的作为键这里我们测试一下,function, Symbol 以及Object类型 const functionKey function() {};const symbolKey Symbol()const objectKey new Object()emptyMap.set(functionKey, functionKey).set(symbolKey, symbolKey).set(objectKey, objectKey)console.log(各种特殊键值对, emptyMap)
复杂类型作为键值时,Map类型并不保存快照,而是保存指针这句话听起来挺唬人but其实理解起来很简单我举个例子const emptyArr [];
const emptyObj {};
emptyMap.set(emptyArr, emptyObj);
emptyArr.push(1);
emptyObj.name shang;
console.log(复杂类型特殊键值对, emptyMap);
console.log(复杂类型特殊值, emptyMap.get(emptyArr));
顺序维护和迭代方法Map会自动维护关于元素的顺序而且从上面Map数据类型原型链我们可以得知Map数据类型包含一个默认方法为entries的迭代器console.log(Map数据类型默认迭代器, emptyMap.entries emptyMap[Symbol.iterator])
foroffor (const [key, value] of emptyMap) {console.log(forof映射元素分别为, key, value);
}
Map可以使用forof方法展开迭代拓展运算符console.log(拓展运算符用于Map数据类型, [...emptyMap]);
拓展运算符与forof公用迭代器forEach方法emptyMap.forEach((value, key) {console.log(forEach映射元素分别为, key, value);
});
Map关于forEach的迭代效果与数组类似,value在前,key在后Map使用values keys 返回映射的迭代器keys返回映射关于key的迭代器可以用于forof 拓展运算符 Map Set等等// Map使用values keys 返回映射的迭代器
const keysIterator emptyMap.keys();
console.log(Map的keys的迭代器, keysIterator);
for (const iterator of keysIterator) {console.log(keysIterator, iterator);
}
values返回映射关于value的迭代器可以用于forof 拓展运算符 Map Set等等const valuesIterator emptyMap.values();
console.log(Map的values的迭代器, valuesIterator);
for (const iterator of valuesIterator) {console.log(valuesIterator, iterator);
}
Map相较于Object有何优缺点???数据类型占用内存插入数据删除数据查数据Map同等数据量比Object少占50%内存插入更快,更省性能删除更快,更省性能×Object×××有线性优化,查找更快,数据量越大查找优势越明显