首页 > 其他分享 >JS中, Set为什么是带键的集合?

JS中, Set为什么是带键的集合?

时间:2023-06-14 17:55:59浏览次数:34  
标签:Map Set Hash Collection JS 文档 Table 带键

起因

这两天写了个LRU Cache, 用到了Set做AllowList, 来判断API是否应该被缓存.
查MDN时, 发现Set被归类在Keyed Collection中.
下意识中, 总认为Set属于Array的一类, 应该是Indexed Collection. 感觉奇怪, 所以多查了查文档

过程

首先, 看了下MDN的文档、ECMA的文档. 都没有明确说明为什么Set属于Keyed Collection. 我一开始还觉得是文档写的不够详细, 后来发现是自己太菜了

然后, 问copilot chat, 查了下Map、Set的实现. 发现这俩结构, 都是基于Hash Table实现的.

再然后, 就破案了... 因为Hash Table中, 每个元素都有唯一的key, 用key来访问对应的值. 所以, Set相当于一个key-value相同的特殊Hash Table, 我认为也可以理解为, 一种kv一致、特殊的Map

结论

  1. Set是基于Hash Table实现的「值的集合」
  2. 由于Hash Table的kv特性, Set的Key-Value相同
  3. 相当于一种特殊的Map
                                             ┌─────┐                               
                                          ┌─▶│Array│                               
                    ┌──────────────────┐  │  └─────┘                               
                 ┌─▶│Indexed Collection│──┤                                        
                 │  └──────────────────┘  │  ┌───────────┐                         
                 │                        └─▶│Typed Array│                         
                 │                           └───────────┘                         
 ┌────────────┐  │                                                                 
 │ Collection │──┤                           ┌───┐         *                       
 └────────────┘  │                        ┌─▶│Map│         *                       
                 │                        │  └───┘         *                       
                 │                        │  ┌───────┐     *                       
                 │  ┌──────────────────┐  ├─▶│WeakMap│     *  ┌───────────────────┐
                 └─▶│ Keyed Collection │──┤  └───────┘     *  │Based on Hash Table│
                    └──────────────────┘  │  ┌───┐         *  └───────────────────┘
                                          ├─▶│Set│         *                       
                                          │  └───┘         *                       
                                          │  ┌───────┐     *                       
                                          └─▶│WeakSet│     *                       
                                             └───────┘     *                       

标签:Map,Set,Hash,Collection,JS,文档,Table,带键
From: https://www.cnblogs.com/lin-xii/p/js-zhong-set-wei-shen-me-shi-dai-jian-de-ji-he.html

相关文章

  • JS逆向实战18——猿人学第八题 验证码 - 图文点选
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!网站https://match.yuanrenxue.cn/match/8网站分析首先进去就看到是如此复杂的文字验证码。我们首......
  • FTP上传错误----“200 Type set to I”
    用FilezillaServer做的FTP服务器,没有使用客户端上传东西,直接用win10的文件管理器访问上传文件,发现有的文件上传时会提示:”200TypesettoI“,(如下图所示) 一阵猛上网搜索,原以为是由于“主动模式”(Active)和“被动模式”(PASV)的模式,使用客户端测试好像都可以。几经折腾,一直没有......
  • npm install报错[email protected] postinstall: `node scripts/build.js`
    [email protected]: nodescripts/build.js解决方法:npmconfigsetsass_binary_site=https://npm.taobao.org/mirrors/node-sassnpminstall  ......
  • [nodejs] __dirname is not defined in ES module scope
    原因:CommonJS中提供的全局变量如require, exports, module.exports, __filename, __dirname等,在ESModules环境中均是不可用的,require, exports, module.exports在ESModules中基本对应着import,export,exportdefault。解决:import{dirname}from"node:path......
  • java修改Set中的元素
    java修改Set中的元素一.问题的提出在java中,有以下代码:publicclassTest{publicstaticvoidmain(String[]args){Set<Stu>set=newHashSet<>();Stus1=newStu(1);Stus2=newStu(2);set.add(s1);set.add(s2);......
  • web页面中导出Excel (方法二) 前端easyui-datagrid导出Excel 使用 datagrid-export.js
    这个示例使用 前端easyui-datagrid 后端php 前端easyui-datagrid导出Excel使用了datagrid-export.js datagrid-export.js文件可自行搜索下载优点:查询结果显示在datagrid中(不能分页),前端直接下载不用回后端,效率高速度快。缺点:查询结果不能分页,必须显示全部内容,显......
  • js函数的概念
    @TOCjs函数的概念对于js来说,函数就是把任意一段代码放在一个盒子里面在我想要让这段代码执行的时候,直接执行这个盒子里面的代码就行先看一段代码//这个是我们以前写的一段代码for(vari=0;i<10;i++){ console.log(i)}//函数,这个{}就是那个“盒子”functionfn(){......
  • Vue.js 组件基础 #yyds干货盘点#【yyds干货盘点】
    学习目录:Vue.js简介Vue.js实例与数据绑定Vue.js计算属性和侦听器Vue.js条件渲染和列表渲染Vue.js事件处理Vue.js表单输入绑定Vue.js组件基础Vue.js组件通信Vue.js插槽Vue.js动态组件和异步组件Vue.js自定义指令Vue.js过渡和动画Vue.js混入Vue.js自定义事件和v-model......
  • NodeJS研究笔记:利用Buffer类的二进制数据读取接口解析ELF文件格式
    javascript作为前端开发语言,自古来对二进制数据的读取解析方面的支持都很薄弱,一般来说,解析二进制数据时,往往是将数据转换成字符串,然后运用各种字符串操作技巧来实现二进制数据的读取。由于NodeJS作为后台服务器开发平台,数理逻辑的设计需求超越javascript作为前端语言时界面UI的设......
  • html 中拦截 js 的样式更改
    比如拦截html标签的font-size样式的更改:...<body><script>varobserver=newMutationObserver(function(mutations){mutations.forEach(function(mutation){if(mutation.type==='attributes'&&mutation.attribu......