首页 > 其他分享 >js 选择Object还是Map

js 选择Object还是Map

时间:2024-01-15 11:03:41浏览次数:22  
标签:Map 浏览器 newKey Object js 内存 key

键和值在迭代器遍历时是可以修改的,但映射内部的引用则无法修改。当然,这并不妨碍修改作为 键或值的对象内部的属性,因为这样并不影响它们在映射实例中的身份:

const m1 = new Map([
      ["key1", "val1"]
]);
// 作为键的字符串原始值是不能修改的 for (let key of m1.keys()) {
      key = "newKey";
      alert(key);             // newKey
      alert(m1.get("key1"));  // val1
}
    const keyObj = {id: 1};
    const m = new Map([
      [keyObj, "val1"]
]);

            // 修改了作为键的对象的属性,但对象在映射内部仍然引用相同的值
for (let key of m.keys()) { 13
  key.id = "newKey";
  alert(key);            // {id: "newKey"}
  alert(m.get(keyObj));  // val1
}
alert(keyObj);           // {id: "newKey"}

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

1. 内存占用

Object 和 Map 的工程级实现在不同浏览器间存在明显差异,但存储单个键/值对所占用的内存数量都会随键的数量线性增加。批量添加或删除键/值对则取决于各浏览器对该类型内存分配的工程实现。

不同浏览器的情况不同,但给定固定大小的内存,Map 大约可以比 Object 多存储 50%的键/值对。

2. 插入性能

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

3. 查找速度

与插入不同,从大型 Object 和 Map 中查找键/值对的性能差异极小,但如果只包含少量键/值对, 则 Object 有时候速度更快。在把 Object 当成数组使用的情况下(比如使用连续整数作为属性),浏 览器引擎可以进行优化,在内存中使用更高效的布局。

这对 Map 来说是不可能的。对这两个类型而言, 查找速度不会随着键/值对数量增加而线性增加。如果代码涉及大量查找操作,那么某些情况下可能选 择 Object 更好一些。

4. 删除性能

使用 delete 删除 Object 属性的性能一直以来饱受诟病,目前在很多浏览器中仍然如此。为此, 出现了一些伪删除对象属性的操作,包括把属性值设置为undefined或null。但很多时候,这都是一 种讨厌的或不适宜的折中。

而对大多数浏览器引擎来说,Map 的 delete()操作都比插入和查找更快。 如果代码涉及大量删除操作,那么毫无疑问应该选择 Map。

标签:Map,浏览器,newKey,Object,js,内存,key
From: https://blog.51cto.com/u_16298168/9250215

相关文章

  • js 顺序与迭代
    与Object类型的一个主要差异是,Map实例会维护键值对的插入顺序,因此可以根据插入顺序执行迭代操作。映射实例可以提供一个迭代器(Iterator),能以插入顺序生成[key,value]形式的数组。可以通过entries()方法(或者Symbol.iterator属性,它引用entries())取得这个迭代器:constm......
  • Js中的闭包
    Js中的闭包APR 11TH, 2017 5:11PM闭包的概念Wikipedia:Inprogramminglanguages,closures(alsolexicalclosuresorfunctionclosures)areatechniqueforimplementinglexicallyscopednamebindinginlanguageswithfirst-classfunctions.译文:”在编程语言......
  • js 获取 url 中的参数
    方法一: functiongetParam(name){varreg=newRegExp("(^|&)"+name+"=([^&]*)(&|$)");varr=window.location.search.substr(1).match(reg);if(r!=null)returnunescape(r[2]);returnnull;}//例如网址是 ht......
  • QTcpSocket发送存储QObject的QList
     #include<QTcpSocket>#include<QDataStream>#include<QByteArray>voidsendObjectList(QTcpSocket*socket,constQList<QObject*>&objectList){QByteArrayserializedData;QDataStreamout(&serializedData,QIODev......
  • 在nodejs环境使用promise函数
     如果单纯的使用promise,对环境比较简单,只需要一个js文件即可。//constp1=newPromise((resolve,reject)=>{//setTimeout(()=>{//resolve('resolve')//},1000)//})//constp2=newPromise((resolve,reject)=>{//setTimeout(()......
  • 作为所有类的顶层父类,没想到Object的魔力如此之大!
    写在开头在上一篇博文中我们提到了Java面向对象的四大特性,其中谈及“抽象”特性时做了一个引子,引出今天的主人公Object,作为所有类的顶级父类,Object被视为是James.Gosling的哲学思考,它高度概括了事务的自然与社会行为。源码分析跟进Object类的源码中我们可以看到,类的注释中对它......
  • 存入cookie中的数据变成了[object%20Object] 原因及处理
    原因在JavaScript中,当你尝试将一个对象直接存储到cookie中时,浏览器会将对象调用toString方法将其转换为字符串。对于大多数JavaScript内置对象,toString方法会将对象转换为字符串"[objectObject]"。因此,当你尝试将一个对象存储到cookie中时,实际上是将"[objectObject]"这个字符串......
  • 【小记】BITMAP To BMP 调用 GetDIBits 引发栈内存损坏问题
    BITMAPbitmap;if(!GetObject(hBitmap,sizeof(bitmap),&bitmap)){//外部传入hBitmapreturnfalse;}//创建位图信息头BITMAPINFObitInfo;BITMAPINFOHEADER&bi=bitInfo.bmiHeader;bi.biWidth=bitmap.bmWidth;bi.biHeight=bitmap.bmHeight;bi.biPlane......
  • JS时间格式化方案汇总
    目前JS实现时间格式化有很多种方案,但具体采用哪一种需要看项目需求以及对应的技术栈。下面汇总常见的方式:Date对象APIDate对象是JavaScript处理日期和时间的基本工具。它提供了一系列方法来获取和设置日期时间的各个部分,以及进行日期和时间的计算。//*******************......
  • js delete()和 clear()函数
    constm=newMap();constfunctionKey=function(){};constsymbolKey=Symbol();constobjectKey=newObject();m.set(functionKey,"functionValue");m.set(symbolKey,"symbolValue");m.set(objectKey,"ob......