JavaScript,如何理解具有天然去重特性的set数据类型?
发布于 作者:苏南大叔 来源:程序如此灵动~

本文描述一下JavaScript
里面的set
数据类型,在以前的文章中,苏南大叔描述过Python
里面的set
数据类型,可以知道:set
是一种天然去重并且无序的类型。那么,在JavaScript
中,set
也具有天然去重的特点,但是却没有表现出无序的状态。

苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。测试缓解:node@16.14.2
。
定义set
先对比一下下面的两个定义方式:

从这两个方式可以看出,
- 传入一个字符串,字符串被分解成了多个单字符,并同时符合去重特性。
- 传入两个字符串,第二个字符串参数完全失效,完全没有效果。第一个字符串被分解成多个单个字符。
- 传入是个数组时,数组成员就是
set
成员,且去重。(数组成员可以重复,但是set
成员不可以重复)。
当然,也可以直接定义一个空的set
:
添加.add
、删除.delete
以及修改
对比map
类型的话,添加的方式换成.add()
【这个是map
的最明显区别!】
如果要修改一个数据,可以先删除,再添加。【毕竟是不可以重复的,不必担心误操作】

在这个例子中,如果添加的对象是个稍稍复制的成员的话(比如数组,就会出问题),.has()
监测不到,.delete()
也删除不了,必须保持原始对象的引用。

挖坑了不是?所以,个人认为,除了数字字符之类的普通成员,其他的都最好特殊处理一下(比如序列化serialize
)比较好。待后续文字补充。
.keys
和.values
非常令人意外的是:JavaScript
里面的set()
居然有key
。而且根据测试的结果,.keys
和.values
数据完全一致,都是迭代器类型的。(也许这可能就是JavaScript
里面的set
天然去重的实现手段,毕竟keys
是从来没听说过会有重复的。)

遍历.keys
、.values
、.entries
.keys()
、.values()
、.entries()
都是迭代器类型的,而且鉴于在js
的set
类型里面,.keys
和.values
数据完全一致,.entries()
又是key
和value
的组合,所以对三者任何一个进行遍历都是一样的效果。

相关链接
- https://newsn.net/say/js-map.html
- https://newsn.net/say/js-reduce.html
- https://newsn.net/say/react-map.html
- https://newsn.net/say/python-tuple.html
结束语
来点击看看更多的经验文字吧:


