Object与Map的区别
简介:
Object:是最常用的一种引用类型数据,可用于存储键值对的集 合,在ECMAScript 1st里添加的 Map:是键值对的集合,采用Hash结构存储,在ECMAScript 2015版本里新增的
共同点:
键值对的动态集合,支持增加删除键值对
不同点:
1.构造方式
Object:
const o = new Object(); // 构造方法
const o2 = Object.create();
const obj = {'a': '1'}
Map
const m = new Map(); // 构造方法
const m2 = new Map([['a', '1'],['b','2']])
2.键的类型
Object:键类型必须是string或者Symbol,如果非String类型,会进行数据类型转换
Map:键可以是任意类型,包括对象,数组,函数等。不会进行数据类型转换。
在添加键值对时,会通过严格相等 === 来判断键属性是否已经存在
-
特例:NaN
NaN === NaN 返回 false
const map = new Map(); // 此时map.get(NaN)结果为 2 map.set(NaN, 1); map.set(NaN, 2);
3.键的顺序
Object:key是无序的,不会按照添加到顺序返回
排序顺序:
- 1.对于大于等于0的整数,会按照大小的顺序进行排序,对于小数和负数会当做字符串处理
- 2.对于string类型,按照定义的顺序进行输出
- 3.对于Symbol类型,会直接过滤掉,不会进行输出,
- 如果想要输出Symbol类型属性,
- 通过Object.getOwnPropertySymbols()方法
Map:key是有序的,按照插入的顺序返回
4.键值对size
Object:只能手动计算,通过Object.keys()方法或者通过for...in循环统计
Map:直接通过size属性访问
const map = new Map();
map.set(2,2)
map.size; // 1
5.键值对的访问
Object:添加或者修改属性,通过点或者中括号的形式
const Obj = {};
Obj.name = 'wwj';
Obj[Symbol('age')] = '18';
判断属性是否存在
Obj.name === undefined;
Obj['name'] === undefined;
删除属性,通过delete关键字
delete Obj.name;
Map: 添加和修改Key-value
const map = new Map();
map.set('name', 'wwj')
map.set(Symbol('age'), '18')
判断属性是否存在
map.has('name'); // true
map.has('age'); // false
map.get('name'); // 取值
map.delete('name'); // 删除键值对
map.keys(); // 获取所有的属性名
map.clear(); // 清空map
6.迭代器
Object:不具有iterator特性
Object本身不具有iterator特性,默认情况下不能使用for...of进行遍历
通过for of遍历会抛出异常
const obj = { name: 'wwj', age: 18 }
for(let key of obj) {} //Uncaught TypeError: obj is not iterator
Map
Map结构的keys(), values(), entries()方法返回值都具有iterator特性
const map = new Map([
['name', 'wwj'],
['age', '18']
]);
for(let [key, value] of map.entries) {}
7.JSON序列化
Object
Object类型可以通过JSON.stringify()进行序列化操作
const obj = {name: 'wwj'}
JSON.strigify(obj)
Map
Map结构不能直接进行JSON序列化
const map = new Map([
['name', 'wwj'],
['age', '18']
]);
JSON.strigify(map) // 返回 '{}'
JSON.stringify(Array.from(map)) // 返回 '[['name', 'wwj'], ['age', '18']]'
8.应用场景
| 适用场景 | |
|---|---|
| Object | 1.仅做数据存储,并且属性仅为字符串或者Symbol类型 2.需要进行序列化转换为json传输时 3.当做一个对象的实例,需要保留自己的属性和方法时 |
| Map | 1.会频繁更新和删除键值对时 2.存储大量数据时,尤其时key类型未知的情况下 3.需要频繁进行迭代处理 |