Object属性排序、与Map的区别
1、Object 中各属性排序规则
- 非负整数 会最先被列出,排序是从小到大的数字顺序
- 正数字 > 字符串 > 负整数 > 浮点数 >
Symbol
,顺序是根据插入的顺序 - 隐式字符串化:当对象的键也被设置为属性时,会字符串化一个对象 -
[object Object]
;
2、JSON 默认不支持 Map,但是可以转一层
若想要通过 JSON
传输 Map
则需要使用到 .toJSON()
方法,然后在 JSON.parse()
中传入复原函数来将其复原。详细可以看下 JSON 的序列化和解析
Object | Map | |
---|---|---|
定义 | 1、键的类型:只能是字符串/Symbol 2、顺序:不会完全保持插入时的顺序 3、『计算长度绕』: Object.keys(testObj).length 4、『默认不可迭代』,只支持 for-in 访问5、可以覆盖原型上的键 6、 JSON 默认支持 Object |
1、键的类型:任何类型 2、保持其插入时的顺序 3、『计算长度简单』: mapObj.size() 4、『**可迭代对象**』,支持 for-of 5、不会覆盖原型上的键 6、 JSON 默认不支持 Map |
操作 | 1、创建let o = {}; // 对象字面量 let o = new Object(); // 构造函数 let o = Object.create(null); // 静态方法 2、新增/修改元素 o.x=1;o['y'] = 2; 3、读取元素 o.x;o['y']; 或者 4、删除元素 delete o.b; |
1、创建:let map = new Map().set('a', 1); // 构造函数 2、新增/修改元素 map.set('x', 1); 3、读取元素 map.get('x'); 4、删除元素 map.delete('b'); |
性能 | Map性能比Object好(占用内存小,增删速度更快) | |
适合 场景 | 1、只是 简单的数据结构 时(在数据少的时候占用内存更少,新建更为高效) 2、需要用到 JSON 进行文件传输时( JSON 不默认支持 Map ) 3、需要对多个键值进行运算时(语法更简洁) 4、需要 覆盖原型 上的键时 |
1、储存的键不是字符串/数字/ Symbol 时2、储存 大量的数据 时(占用的内存更小) 3、需要进行许多 新增/删除元素的操作时(速度更快) 4、需要 保持插入时的顺序 5、需要 迭代(默认可迭代对象) |