JS中常用的数据结构

JS中常用的数据结构

数据结构.jpg

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 的区别:
  1. WeakSet只能存放对象引用,而Set可以存放任何类型的值。
  2. WeakSet 对象中储存的对象值都是被弱引用的,即垃圾回收机制不考虑 WeakSet对该对象的引用,如果没有其他的变量或属性引用这个对象值,则这个对象将会被垃圾回收掉(不考虑该对象还存在于 WeakSet中),运行前后成员个数可能会不一致,遍历结束之后,有的成员可能取不到了(被垃圾回收)。
  3. clear()方法不可用。
  4. WeakSet对象是无法被遍历的(ES6 规定 WeakSet 不可遍历),也没有办法拿到它包含的所有元素。
  5. 其余无差别。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容