Map和Object的区别:
- 1.Map键的类型可以是任意值,包括函数、对象或任意基本类型。 Object键的类型:一个Object 的键必须是数值,字符串或者symbol。
- Map的键值对数量可以通过.zise()属性来计算。 Object的键值队数量需要自己计算。
- Map的键值对是有序的,而Object不是。Map会维护键值对的插入顺序,输出时会发现和输入的时候顺序一致。例如:
let obj ={};
Object.defineProperty(obj,"a",{value:1});
Object.defineProperty(obj,"c",{value:1});
Object.defineProperty(obj,"b",{value:1});
console.log(obj);//obj{"a":1,"b":1,"c":1}
let m = new Map([["a",1],["c",1],["b",1]]);
console.log(m) //Map{"a"=>1,"c"=>1,"b"=>1}
4.Map可以使用迭代器,而Object不可以。可以使用[Symbol.iterator]判断是都存在默认迭代器
let m = new Map([["a",1]]);m[Symbol.iterator] //会输出数据
let o = {a:a};o[Symbol.iterator] //undefined
Map和Object的选择:
- 内存占用:给定固定大小的内存,Map大约可以比Object多存储50%的键值对。
- 插入性能: Map和Object插入新的键值对的消耗相当,但Map插入会稍快,所以涉及大量代码插入时候,Map性能更好。
- 查找速度:涉及大量代码查找的时候,Object性能更好。
- 删除性能:涉及大量代码查找的时候,Map性能更好。
Map的方法
//Map的键名,键值[key,value]
let a = new Map([["a",2],["b",1]])
//基本方法
a.size //2 a的键值对数量
a.set("c",v), //添加键值对
a.has("a"), //判断Map中是否存在某个键值对
a.get("a"), //通过键值获取walue
a.delete("a"),//删除键值对
a.clear(),//清空键值对
//遍历方法
for (let key of map.keys()) {
console.log(key);//遍历keys
}
for (let value of map.values()) {
console.log(value);//遍历values
}
for (let item of map.entries()) {
console.log(item[0], item[1]);//遍历键值对
}
for (let [key, value] of map.entries()) {
console.log(key, value);//遍历键值对
}
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);//遍历键值对
}
a.forEach((value, key) => console.log(key + ' : ' + value))
Set的方法
//Set的键名=键值[value,value],不可重复,有序
let a = new set([1, 2, 3, 4, 4])
//基本方法
a.size //a的键值对数量
a.add(1), //添加键值对
a.has(1), //获取是否存在value,返回bool
a.delete(),//判断是否删除成功,返回bool
a.clear(),//清空键值对
//遍历方法
for (let item of a.keys()) {
console.log(item);
}
for (let item of a.values()) {
console.log(item);
}
for (let item of a.entries()) {
console.log(item);
}
for (let x of a) {
console.log(x);
}
a.forEach((value, key) => console.log(key + ' : ' + value))
Map和Set区别
- Map是[key,value]:类似于对象,而Set是[value,value]:类似于数组
Map实现原理
暂时不会