js中Object和Map的区别
Object是最常用的一种引用类型数据,可用于存储键值对的集合。
Map是键值对的集合,才会用Hash结构存储。(map是es6以后新增的)
共同点: 键值对的动态集合,支持增加和删除键值对
不同点
1.构造方式
// Object const obj = { a: 1, b: 2 } const o = new Object() const o2 = Object.create(); // map const map = new Map() const m = new Map([ ['a', '1'], ['b', '2'] ])
复制
2.键的类型
/* Object 键的类型: 键类型必须是String或者Symbol,如果非String类型,会进行数据类型转换 */ const obj = { a: 1, } const arr1 = [1, 2] obj[arr1] = 'arr' console.log(obj); //这里把arr1中的数据变为了字符串
复制
/* Map 键的类型: 可以是任意类型,包括对象,数组,函数等,不会进行类型转换。 在添加键值对时,会通过严格相等(===)来判断键属性师范已存在 */ const m = new Map() m.set('a', 1) m.set('2', '2') m.set(2, 2) m.set(arr1, 'arr') console.log(m);
复制
3.键的顺序
/* Object 键的顺序: key是无序的,不会按照添加的顺序返回 1.对于大于等于0的证书,会按照大小进行排序,对于小数和负数会当作字符串处理 2.对于String类型,按照定义的顺序进行输出 3.对于Symbol类型,会之间过滤掉,不会进行输出, 如果想要输出Symbol类型属性, 通过Object.getOwnPropertySymbol()方法 */ const obj = { 2: 2, '1': 1, 'b': 'b', 1.1: 1.1, 0: 0, 'a': 'a', [Symbol('s1')] : 's2', [Symbol('s2')] : 's1', } console.log(Object.keys(obj));
复制
/* Map 键的顺序: key是有序的,按照插入的顺序进行返回 对于Symbol类型,不会过滤掉,会进行输出 */ const m = new Map() m.set(2, 2) m.set('1', 1) m.set('b', 'b') m.set(0, 0) m.set('a', 'a') m.set(Symbol('s1'), 's1'); console.log(m.keys());
复制
4.键值对size
/* Object 键值对size: 只能手动计算,通过Object.keys()方法或者通过for...in循环统计 */ const obj = { 2: 2, '1': 1, 'b': 'b', } console.log(Object.keys(obj).length); //3 /* Map 键值对size: 直接通过size属性访问 */ const m = new Map() m.set(2, 2) m.set('1', 1) m.set('b', 'b') m.set(0, 0) m.set('a', 'a') m.set(Symbol('s1'), 's1'); console.log(m.size); //6
复制
5.键值对的访问
/* Object 键值对访问: 1.添加或者修改属性,通过点或者中括号的形式 */ const obj = { } obj.name = '张三' obj.age = 18 // 2.判断属性是否存在 obj.name === undefined // 删除属性,通过delete关键字 delete obj.name /* Map 键值对访问: */ const m = new Map() // 添加和修改key-value m.set('name', '张三') m.set('age', 18) // 2.判断属性是否存在 m.has('name') // 取值 m.get('name') // 删除键值对 m.delete('name') // 获取所有属性名 m.keys() // 清空map m.clear()
复制
6.迭代器
/* 迭代器-for...of Object本身不具有lterator特性,默认情况下不能使用for..of进行遍历 Map结构的keys(), value(), entries()方法返回值都具有lterator特性 */
复制
7.JSON序列化
/* Object JSON序列化 Object类型可以通过JSON.stringify()进行序列化操作 Map结构的keys(), value(), entries()方法返回值都具有lterator特性 */ const o = { name: '张三', age: 18 } console.log(o); console.log(JSON.stringify(o));
复制
/* Map JSON序列化 Map结构不能直接进行JSON序列化,可以通过其他手段进行序列化 */ const map = new Map([ ['name', '张三'], ['age', 19] ]) console.log(map); console.log(JSON.stringify(Array.from(map)));
复制
8.应用场景