广西冶金建设公司网站浦东新区专业做网站

张小明 2025/12/30 5:20:01
广西冶金建设公司网站,浦东新区专业做网站,天津企业网站专业订制,帮我搜一下长沙做网络销售Map与Set#xff1a;现代JavaScript中不可或缺的数据结构你有没有遇到过这样的场景#xff1f;想用一个对象作为键来存储某些数据#xff0c;却发现JavaScript的对象只能接受字符串或Symbol作为键——于是只好退而求其次#xff0c;给每个对象加个id属性#xff0c;再用这…Map与Set现代JavaScript中不可或缺的数据结构你有没有遇到过这样的场景想用一个对象作为键来存储某些数据却发现JavaScript的对象只能接受字符串或Symbol作为键——于是只好退而求其次给每个对象加个id属性再用这个id去映射信息。或者在处理用户标签、表单选项时反复写indexOf或includes来做去重判断代码越来越臃肿。这些痛点正是ES6引入Map和Set的初衷。为什么我们需要新的集合类型在ES6之前JavaScript开发者几乎全靠对象Object和数组Array来应对所有数据组织需求。但随着应用复杂度上升这种“万能却粗糙”的方式逐渐暴露出问题对象不能用对象当键想把某个DOM节点和它的元数据关联起来传统做法是挂载自定义属性但这会污染原始对象还可能导致内存泄漏。去重逻辑冗长低效数组去重要么写循环嵌套indexOf要么依赖第三方库既不优雅也不高效。性能不可控当对象的键越来越多且动态变化时V8引擎可能因为哈希冲突导致查找退化为线性扫描严重影响性能。为了解决这些问题ECMAScript 2015正式推出了两个原生数据结构Map和Set。它们不是语法糖而是语言层面的一次重要进化标志着JavaScript从“脚本工具”向“工程化语言”的实质性跨越。Map真正意义上的键值对容器它解决了什么我们先来看一段熟悉的“无奈代码”const cache {}; const objKey { x: 1 }; // ❌ 错误对象会被转成字符串 [object Object] cache[objKey] some data; console.log(cache[[object Object]]); // some data —— 但这失去了语义这显然是个陷阱。而Map直接打破了这一限制。核心能力一览特性说明✅ 支持任意类型键对象、函数、数组、基本类型皆可作键✅ 精确引用比较两个对象即使内容相同只要不是同一引用就视为不同键✅ 插入顺序可遍历遍历时按添加顺序输出不再是无序的“黑盒”✅ 方法统一规范.set()、.get()、.has()、.delete()接口清晰✅ 性能稳定基于哈希表实现平均时间复杂度 O(1)更重要的是Map不受原型链影响。你永远不用担心.hasOwnProperty被重写或是不小心触发了继承方法。实战示例缓存用户登录状态const userSessionCache new Map(); const alice { id: 1, name: Alice }; const bob { id: 2, name: Bob }; // 使用用户对象本身作为键 userSessionCache.set(alice, { token: abc123, expires: Date.now() 3600 }); userSessionCache.set(bob, { token: def456, expires: Date.now() 7200 }); // 查询某用户的状态 function getSession(user) { if (userSessionCache.has(user)) { const session userSessionCache.get(user); return session.expires Date.now() ? session : null; } return null; } console.log(getSession(alice)); // 正确返回alice的会话信息这段代码干净、安全、无副作用。相比过去挂在user.cache上的野路子这才是真正的封装思想。 小贴士如果你希望键可以被垃圾回收比如临时缓存考虑使用WeakMap—— 它只接受对象作为键并且不会阻止GC。Set让“唯一性”变得理所当然它改变了什么想象你要收集页面上所有点击过的按钮ID防止重复上报const clickedIds []; function recordClick(id) { if (clickedIds.indexOf(id) -1) { clickedIds.push(id); } }短短几行却藏着三个问题1.indexOf是 O(n) 操作数据一大就很慢2. 写法啰嗦容易漏掉判断3. 无法保证绝对唯一比如NaN的情况。而Set让这一切变得简单到不可思议const clickedIds new Set(); function recordClick(id) { clickedIds.add(id); // 自动去重 }就这么一行搞定。关键特性解析自动去重机制内部通过哈希值判断是否存在重复添加无效。支持 NaN 相等性虽然NaN ! NaN但Set明确认为它们是同一个值js const s new Set([NaN, NaN]); console.log(s.size); // 1保持插入顺序和Map一样遍历结果有序符合直觉。丰富的迭代接口支持for...of、扩展运算符、forEach无缝融入现代JS生态。高频应用场景1. 数组去重最常用const unique [...new Set([1, 2, 2, 3, 4, 4])]; // [1, 2, 3, 4]比任何手写去重都简洁高效。2. 实现集合运算const arr1 [1, 2, 3]; const arr2 [2, 3, 4]; // 并集 const union [...new Set([...arr1, ...arr2])]; // 交集 const intersection arr1.filter(x new Set(arr2).has(x)); // 差集arr1中有但arr2中没有 const difference arr1.filter(x !new Set(arr2).has(x));这几行代码已经足够替代很多工具函数了。在真实架构中的角色别以为这只是“语法小技巧”Map和Set其实早已深入各类框架的核心逻辑。Vue 的响应式系统是怎么用它们的Vue 3 的响应式原理中就有这样一层结构const targetMap new WeakMap(); // target → depsMap function track(target, key) { let depsMap targetMap.get(target); if (!depsMap) { depsMap new Map(); targetMap.set(target, depsMap); } let dep depsMap.get(key); if (!dep) { dep new Set(); // 存储effect函数避免重复收集 depsMap.set(key, dep); } dep.add(activeEffect); }这里的关键设计点在于- 外层用WeakMap不影响目标对象的垃圾回收- 中间用Map建立对象属性与依赖之间的映射- 最内层用Set确保同一个副作用函数不会被多次触发。三层结构协同工作构成了高效、精准的依赖追踪系统。如何选择什么时候该用哪个选Map当你遇到以下情况键是非字符串类型尤其是对象需要频繁增删查改键的数量不确定或动态增长需要知道有多少条记录.size比Object.keys(obj).length更快更准不希望受到原型干扰。选Set当你需要去重无论是数字、字符串还是对象引用构建唯一列表如已加载模块名、事件类型执行数学意义上的集合操作替代布尔标记数组例如记录哪些项已被选中。反模式提醒虽然强大但也别滥用❌ 小数组去重硬套Set如果只有3~5个元素includes的开销远小于创建Set实例。❌ 把Map当普通对象替代品静态配置仍推荐字面量{}语义更清晰JSON兼容性更好。❌ 忘记WeakMap/WeakSet的存在需要缓存但又不想阻碍内存回收记得这两个“弱兄弟”。性能真相它真的更快吗答案是在关键场景下快得多。根据V8引擎的实际测试数据在处理大量动态键时操作Object 表现Map 表现插入 10,000 条记录明显变慢O(n²) 风险稳定线性增长查找某个键受哈希碰撞影响平均 O(1)删除属性delete obj[key]成本高.delete(key)高效原因在于Object最初设计用于静态结构描述而非高性能集合操作。而Map从底层就被优化为“动态键值存储”。结语不只是语法更是思维方式的升级Map和Set的出现表面上看是多了两个API实则是JavaScript对数据抽象能力的一次补强。它们教会我们的是一种更精确的表达方式- 要存键值对用Map而不是强行把一切变成字符串- 要保证唯一用Set而不是手动遍历检查- 要高效迭代利用其原生可迭代特性配合解构和扩展运算符。当你开始思考“我这里该用 Object 还是 Map”、“要不要换成 Set 来去重”的时候说明你已经迈入了高质量编码的大门。未来的前端工程只会越来越复杂状态管理、缓存策略、事件系统……每一个环节都在呼唤更专业的数据结构支持。而Map与Set正是我们手中最趁手的第一批“专业工具”。如果你在项目中还在用手动去重、字符串化对象当键、担心属性命名冲突不妨停下来问问自己“我是不是该试试 Map 或 Set”欢迎在评论区分享你的使用经验或踩过的坑创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

太原制作网站的工作室iis架设jsp网站

第一章:Open-AutoGLM手机部署概述Open-AutoGLM 是基于 AutoGLM 架构优化的轻量化大语言模型,专为移动端设备设计,支持在资源受限的智能手机上实现本地化推理。该模型通过量化压缩、算子融合与硬件加速等技术,在保持较高自然语言理…

张小明 2025/12/28 17:33:35 网站建设

网站要多钱大数据营销系统

BG3模组管理器完整配置教程:轻松管理博德之门3所有模组 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 想要在《博德之门3》中体验更多精彩内容吗?BG3模组管理器…

张小明 2025/12/28 17:33:02 网站建设

食品网站建设案例个性化wordpress

Samba网络配置、虚拟服务器与日志管理全解析 1. Samba网络配置选项 当在多宿主机器(即连接多个子网的机器)上运行Samba,或者想在自己的子网实施安全策略时,需要仔细研究网络配置选项。 假设Samba服务器连接到多个子网,如能访问192.168.220. 和134.213.233. 子网,以下…

张小明 2025/12/28 17:31:55 网站建设

html网站留言板代码兰州网站制作公司服务电话

PaddlePaddle文本摘要生成:PEGASUS模型训练流程 在信息爆炸的时代,每天产生的中文文本量以亿计——新闻、报告、社交媒体内容不断涌入用户的视野。如何从一篇上千字的政府公告中快速提取核心要点?怎样为电商平台的用户评论自动生成简洁明了的…

张小明 2025/12/28 17:31:21 网站建设

国外好的设计网站有哪些个人网站制作多少钱

第一章:Open-AutoGLM语义关联分析强化概述Open-AutoGLM 是一种面向大规模语言模型的语义关联增强框架,专注于提升模型在复杂语境下的理解与推理能力。该框架通过引入动态语义图结构和自适应注意力机制,实现对输入文本中实体、概念及关系的深层…

张小明 2025/12/28 17:30:46 网站建设

恩施做网站多少钱网站域名禁止续费

你是否曾经因为模组冲突而无法正常游戏?或者因为手动安装模组耗费了大量时间?Scarab作为一款专为空洞骑士设计的模组管理工具,正是你需要的解决方案。这款基于Avalonia框架开发的开源工具,让模组安装、更新和卸载变得前所未有的简…

张小明 2025/12/28 17:30:11 网站建设