键值类型Map,Object
Object
1 .现在使用的对象,只能提供键值对的集合,只能用字符串当作键
2 .如果想拿一个document.querySelector('#div')的dom节点作为键,会被自动转为[object HTMLDivElement]: "meta"
3 .而且遍历出来是不保序的
4 .其他功能:键值获取,删除,检测某个键是否存在
5 .需要对个别元素进行操作的时候用Object
6 .js中几乎所有的对象都是Object实例
Map
1 .键的范围不止是字符串,各种类型的值,字符串,对象,Node节点都可以
2 .map的优势
1 .Object的键值只能是字符串,Map可以是任意类型,上面的存起来就是这个 {div#div => 'meta'} 提供的是值对值的存储
2 .不需要手动计算大小,有属性返回
3 .Map的遍历遵循元素的插入顺序
4 .Object有原型,所有映射会有一些确省的值,需要这样Object.create(null)回避
3 .Map的键是和内存地址绑定的,只要是内存地址不一样,就视为两个键,可以避免同名属性碰撞的问题
4 .简单类型作为键的情况
1 .0,-0是一个键
2 .布尔值true,字符串true是两个不同的值
3 .undefined,null也是两个不一样的
4 .NaN是一个键,虽然NaN自己和自己不相等
5 .Map是为了快速搜索和查找数据而存在的
6 .Map是可迭代对象,键值对可以通过for ..of循环迭代
创建
1 .Object速度更快,
访问元素
1 .差距不大
插入元素
1 .需要新增很多元素的时候,Object会比Map多占用78%的内存
删除元素
1 .时间复杂度一样,但是map有clear方法,object需要循环删除
2 .差距不大
获取大小
元素迭代
类型转换
1 .json转为map
2 .
使用map 大佬一般不需要出山
1 .键值不是数字,字符串,symbol
2 .存储大量的数据,内存更少
3 .需要新增/删除许多元素的时候,速度更快
4 .需要保持插入顺序的时候
使用Object
1 .简单的数据结构,数据少的时候内存更少,速度快
2 .需要覆盖原型上的键的时候,用这个
3 .需要对多个键值进行运算的时候,他比较简单
4 .如果要内部维护自己的逻辑和属性,只能用object
{
name:"test",
print:function(){
console.log(`${this.name}`)
}
}
5 .知道所有的key,都为字符串或整数.需要一个简单的结构去存储这些数据,Obejct是一个非常好的选择.构建一个Object并通过知道的key获取元素的性能要优于Map(字面量vs构造函数 直接获取vsget()方法)
6 .[]访问动态拼接属性好像object更方便一点.