对象,映射与weakmap三者在JavaScript中有什么不同

  

对象,映射与weakmap三者在JavaScript中有什么不同?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。


初始化

对象可以使用字面量,构造函数,对象。箱的形式创建。而地图只能通过新关键字和构造函数创建。对于地图如果想在创建的同时初始化实例,可以给地图构造函数传入一个可迭代对象,需要包含键/值对数组。可迭代对象中的每个键/值对都会按照迭代顺序插入到新映射实例中:

object 的创建方式   ,   const  object =, {}   const  object1 =, new 对象()   const  object2 =, Object.create ({})   ,   map 的创建方式//使用新关键字   const  m0 =, new 地图;//,使用嵌套数组初始化映射   const  m1 =, new 地图([   ,(“key1",,“val1"],   ,(“key2",,“val2"],   ,(“key3",,“val3"】   ]);   警报(m1.size);//, 3//,使用自定义迭代器初始化映射   const  m2 =, new 地图({   (Symbol.iterator): *()函数,{   (“key1",油品收率,,“val1"];   (“key2",油品收率,,“val2"];   (“key3",油品收率,,“val3"];   }   });   警报(m2.size);//, 3//,映射期待的键/值对,无论是否提供   const  m3 =, new 地图([[]]);   警报(m3.has(定义));//,真的   alert (m3.get(定义)),,//,未定义的

映射键类型

与对象只能使用数值,字符串或符号作为键不同,地图可以使用任何JavaScript数据类型作为键. map内部使用SameValueZero比较操作(ECMAScript规范内部定义,语言中不能使用),基本上相当于使用严格对象相等的标准来检查键的匹配性。与对象类似,映射的值是没有限制的。

, const  m =, new 地图();   ,const  functionKey =,()函数,{};   ,const  symbolKey =,符号();   ,const  objectKey =, new 对象();   ,m.set (functionKey,“functionValue");   ,m.set (symbolKey,“symbolValue");   ,m.set (objectKey,“objectValue");   ,警报(m.get (functionKey)),,//functionValue   ,警报(m.get (symbolKey)),,//symbolValue   ,警报(m.get (objectKey)),,//objectValue   ,//SameValueZero比较意味着独立实例不冲突   ,警报(m.get (function(),{})),,//,未定义的

顺序与迭代

与对象类型的一个主要差异的是,地图实例会维护键值对的插入顺序,因此可以根据插入顺序执行迭代操作。映射实例可以提供一个迭代器(迭代器),能以插入顺序生成[键,值]形式的数组。可以通过条目()方法(或者Symbol.iterator属性,它引用条目())取得这个迭代器:

const  m =, new 地图([   ,(“key1",,“val1"],   ,(“key2",,“val2"],   ,(“key3",,“val3"】   ]);   警报(m.entries ===, m [Symbol.iterator]);//,真的   for  (let  pair  of  m.entries ()), {   ,警报(一对);   }//,[key1 val1]//,[key2 val2]//,[key3 val3]   for  (let  pair  of  m [Symbol.iterator] ()), {   ,警报(一对);   }//,[key1 val1]//,[key2 val2]//,[key3 val3]

二,选择对象还是地图

对于多数网络开发任务来说,选择对象还是地图只是个人偏好问题,影响不大。不过,对于在乎内存和性能的开发者来说,对象和映射之间确实存在显著的差别。

1。内存占用

对象和映射的工程级实现在不同浏览器间存在明显差异,但存储单个键/值对所占用的内存数量都会随键的数量线性增加。批量添加或删除键/值对则取决于各浏览器对该类型内存分配的工程实现。不同浏览器的情况不同,但给定固定大小的内存,地图大约可以比对象多存储50%的键/值对。

2。插入性能

向对象和地图中插入新键/值对的消耗大致相当,不过插入在地图所有浏览器中一般会稍微快一点儿。对这两个类型来说,插入速度并不会随着键/值对数量而线性增加。如果代码涉及大量插入操作,那么显然地图的性能更佳。

3。查找速度

与插入不同,从大型对象和地图中查找键/值对的性能差异极小,但如果只包含少量键/值对,则对象有时候速度更快。在把对象当成数组使用的情况下(比如使用连续整数作为属性),浏览器引擎可以进行优化,在内存中使用更高效的布局。这对地图来说是不可能的。对这两个类型而言,查找速度不会随着键/值对数量增加而线性增加。如果代码涉及大量查找操作,那么某些情况下可能选择对象更好一些。

对象,映射与weakmap三者在JavaScript中有什么不同