Object与Map的区别

188 阅读3分钟

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.应用场景

适用场景
Object1.仅做数据存储,并且属性仅为字符串或者Symbol类型
2.需要进行序列化转换为json传输时
3.当做一个对象的实例,需要保留自己的属性和方法时
Map1.会频繁更新和删除键值对时
2.存储大量数据时,尤其时key类型未知的情况下
3.需要频繁进行迭代处理