1.创建方式不同
(1) Object对象创建
const obj = {
1: "hello",
2: "world"
}// 字面量创建
const obj2 = Object.create(obj)
(2) Map,使用内置构造函数 Map 创建
const map = new map ([
[1, 'hello'],
[2, 'world']
]);
2.键的类型
(1) Object 的键必须是String 或是 Symbol(符号)
如果我们在对象字面量中使用数字作为Key,则该数字也会转换为字符串并用作Key
console.log(gamesObj[1]);
console.log(gamesObj['1']);
(2) Map 的键可以是任意值,包括函数,对象或任意基本类型
因此 1 和 ‘1’ 是不同的 key
3.Object 会从原型中继承属性
当我们打印object.prototype 时,已看到有一些属性,如hasOwnProperty,isPrototypeOf,toLocaleString,toString
使用字面量方式创建对象,将继承所有这些key
const obj = { };
obj.toString();
如果想创建一个真正的空对象,没有从原型继承属性的对象
Object.create(null);
而Map默认情况下不包含任何键,只包含显示插入的键
4.Map 保留key的插入顺序,而Object不保留
const obj = {
2: "hello",
1: "world",
}
const keys = Object.keys(obj);
console.log(keys);//['1','2']
const obj = new Map([
[2, "hello"],
[1, " world"]
])
const keys = obj.keys();
console.log(keys)//MapIterator{2,1}
5.Map 提供了许多属性和方法
(1) 访问对象的属性
//Map
Map.get(key);
//Object
obj[key] obj.key
(2) 检查key是否存在
//Map
map.has(key);
//Object
obj.hasOwnProperty(key)
(3) 新增属性
//Map
map.set(key,value);
//Object
obj[key] = 'xxx'
(4) 删除属性
//Map
map.delete(key);
//Object
delete obj[key]
(5) 访问键值对个数
//Map
map.size();
//Object
const size = Object.keys(obj).length
6.迭代
Map 是 iterable 的,所以可以直接被迭代
迭代Object 需要以某种方式获取它的键然后才能迭代
//Map
const map = new Map([
[1,'hello'],
[2,'world']
])
map.forEach((value,key) =>{
console.log(`${key} - ${value}`);
});
//Object,使用Object.entries() 获取键值对
const obj = {
1:'hello',
2:'world'
};
object
.entries(obj)
.forEach(([key,value]) =>{
console.log(`${key} - ${value}`)
})
//1 - hello
//2 - world
7.JSON序列化支持Object 但不支持 Map
const obj = {
1: "hello",
2: "world"
}
const json =JSON.stringify(obj);
console.log(json)
//{"1":"hello","2":"world"}
const map = new Map([
[1,'hello'],
[2,'world']
])
const json = JSON.stringify(map);
console.log(json)
//{}返回空对象
8.性能
Map 在频繁增删键值对的场景下表现更好;无论有多少数据,访问的时间复杂度为0,因为不需要扫描所有数据
Object在频繁增加和删除键值对的场景下未作出优化。