集合Set
集合是一组值,与数组类似。但与数组不同的是,集合没有索引和顺序,也不允许重复:一个值要么是集合的成员,要么不是;这个值不可能在一个集合中出现多次。下面我们看代码:
创建集合
const t = new Set([1, '1', 2, 2, 3, 1])
const t2 = new Set('32dedad3213')
console.log(t);
console.log(t2);
- 参数是数组:去重进入集合
- 参数是字符串:切割后,去重进入集合
原型上的属性
- size 当前长度
- add 如果参数是数组,会把数组加进去,而不是拆开加元素。会返回调用它的集合,可以链式调用,如:t.add([12,33,33]).add([12])
- clear 清空所有数据
- delete 一次只能删除一个元素,返回一个boolean,删除成功返回true。如果直接调用delete()返回false
- forEach 因为没有索引和顺序,1、2参数都是元素,第三个参数是数据自身
- has 集合中是否有相同的值,返回boolean
- keys 返回一个值集合,这个集合有next属性可以挨个去下一个值
- values 返回一个值集合,这个集合有next属性可以挨个去下一个值
- entries 参考forEach,返回的key,value一样
- 有Symbol.iterator 可以被迭代
需要注意的点
- 判重:delete、has和判重是根据===,数字1和字符串‘1’不会判重复,引用类型只有用同一个引用才会判重
- 可以用扩展副...扩展开,也能[...t]转数组
映射Map
Map表示一组被称为键的值,每一个值都关联(映射)到另一个值,但是它的键值不只整数或字符串,允许任何值作为索引,不管体积多大,映射速度都很快。
创建映射
const m = new Map([['3weqw', 'eewq'], [1, 2]])
参数:多个数组,每个数组有两个值,第一个作为键,第二个是value
原型上的属性
- clear 清空
- delete 成功返回true 失败(没有)返回false
- entries 键值对组成的MapIterator
- forEach 1参数是value、2参数都是key,第三个参数是数据自身
- get 获取一项元素,若key不存在返回undefined
- has 是否有参数key,返回boolean
- keys 所有key组成的MapIterator
- set 添加/修改键值对
- size 键值对的个数
- values 所有value组成的MapIterator
- 有Symbol.iterator 可以被迭代
Map与Object
- Object键值是整数、字符串或者symbol,Map是任何值都可以(引用值根据引用决定是否是同一key)
- Map 元素的顺序遵循插入的顺序,而 Object 的则没有这一特性。
- JSON 直接支持 Object,但不支持 Map
- Map 是纯粹的 hash, 而 Object 还存在一些其他内在逻辑,所以在执行 delete 的时候会有性能问题。所以写入删除密集的情况应该使用 Map。
- Map 在存储大量元素的时候性能表现更好,特别是在代码执行时不能确定 key 的类型的情况。