JS中常用的数据结构

1.数组
元素之间有关联性,数组有长度,可重复,可嵌套数据;
插入、删除、添加等操作十分消耗性能,因为查询必须遍历 。
在不需要指定名称,只需要罗列出来的时候使用数组;如果需要指定名称,则用下面的对象。
2.对象
键-->值,根据键查找值,没有长度;
属性没有关联性,添加、删除、插入的效率极高 。
查找某个值,必须遍历键,获取各值查找;
查找某个键,直接获取就可以得到这个键的值(速度最快);
在其他语言中,对象的遍历是无序的,而js中对象的键是先添加先遍历,遍历顺序固定
3.set(集合)
set对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
- 去重
Set 对象只存储独一无二的值,如果你想避免储存重复值,这是比 Array 更好的选择,因为使用 Array,你需要使用额外的代码去处理这种情况。
- 查找项
使用 indexOf() 或 includes() 去检查一个项是否在数组中很慢。
- 删除项
在 Set 中,可以使用值去删除一项。而在 Array 中,需要splice()使用项的索引方法。一旦使用索引,速度是很慢的。
- 插入项:
在 Set 中新增一项比 Array 使用 push() 或者 unshift() 等方法新增一项要快的多。
- 排序NaN值
无法使用 Array 的 indexOf() 或者 includes() 去定位 NaN 值,
但 Set可以用来保存NaN和undefined, 如果有重复的NaN, Set会认为就一个NaN(实际上NaN!=NaN);
无序,数据无关联性;查找时仍需遍历(只能用for of遍历) 查询速度慢,插入(无法插入在前面),删除,添加速度快
在一组无序不重复的数据中使用set
- Set.size
size属性的默认值为0
- 接受具有iterable接口的其他数据结构作为参数
const set2 = new Set(document.querySelectorAll('div')); console.log(set.size);
遍历
Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。具有
iterable类型的集合可以通过新的for ... of循环来遍历。
- WeakSet 与 Set 的区别:
- WeakSet只能存放对象引用,而Set可以存放任何类型的值。
- WeakSet 对象中储存的对象值都是被弱引用的,即垃圾回收机制不考虑 WeakSet对该对象的引用,如果没有其他的变量或属性引用这个对象值,则这个对象将会被垃圾回收掉(不考虑该对象还存在于 WeakSet中),运行前后成员个数可能会不一致,遍历结束之后,有的成员可能取不到了(被垃圾回收)。
- clear()方法不可用。
- WeakSet对象是无法被遍历的(ES6 规定 WeakSet 不可遍历),也没有办法拿到它包含的所有元素。
- 其余无差别。
4.map(字典)
- set和map的区别
同:set和map都是存储不重复的值.
异:set中是以[value,value]存储的,map中是以[key,value]存储的。
- map和对象的区别
map 和对象都是键值对的集合,区别在于对象的 key值全部自动转成了字符串或者symbol值;
而map 是完整的值 ,键可以是任意类型,可以是任意类型 ,可遍历键,也可遍历值,数据之间没有关联性
遍历速度比对象更快,可以单独遍历其中的键或者值
for(key of map.keys()){
//遍历键
}
for(key of map.keys()){
//遍历值
}
- weakmap和map的区别
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的key则变成无效的),所以,WeakMap 的 key 是不可枚举的。
5.总结
- Set
成员唯一、无序且不重复
[value, value],键值与键名是一致的(或者说只有键值,没有键名)
可以遍历,方法有:add、delete、has
- WeakSet
成员都是对象;
成员都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏;
不能遍历,方法有add、delete、has
- Map
本质上是键值对的集合,类似集合
可以遍历,方法很多可以跟各种数据格式转换
- WeakMap
只接受对象作为键名(null除外),不接受其他类型的值作为键名
键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的 不能遍历,方法有get、set、has、delete