JS数据结构
一、数组
1、保留插入顺序
2、通过索引访问元素(索引与排序有关系)
3、可迭代
4、JS数组大小可以动态调整,但内存无法掌控(c++静态数组,长度不可变)
5、允许值重复,且可以为混合类型
6、删除和查找元素比较消耗性能 eg: find() 和 findIndex()
~~~遍历查询,消耗性能,删除元素后,后边元素向前补位
7、有序集合,可以通过索引值访问
查询元素
find()
findIndex()
删除元素
splice()
arr.concat() 返回被连接数组的一个副本
arr.join() 返回被指定分割符分割的字符串
arr.slice(startIndex,endIndex) 返回被剪切的元素片段
arr.pop() 返回被删除的元素,如果是空数组则不改变原数组,返回undefined
arr.push() 返回指定的值添加到数组后的新长度
arr.shift() 功能:把数组的第一个元素从中删除,返回值:被删除的元素
arr.unshift() 功能:向数组的开头添加一个或多个元素,返回值:返回数组的新长度
arr.splice() 功能:向数组添加项目或者从数组中删除项目 返回值:参数2被删除的元素数组
arr.reverse() 功能:颠倒数组中元素的顺序 返回值:返回颠倒顺序之后的数组
arr.sort() 返回值:排序之后的数组
原型方法:
Array.prototype.indexOf
Array.prototype.lastIndexOf
Array.prototype.every
Array.prototype.some
Array.prototype.forEach
Array.prototype.map
Array.prototype.filter
Array.prototype.reduce
Array.prototype.reduceRight
Array.prototype.includes
Array.prototype.find
Array.prototype.findIndex
ES6方法:
Array.of(): 将元素列表转为数组,避免new Array()带来的诡异行为
Array.from(iterator,fn,obj): 将具有Iterator接口的对象或类数组转为数组
Array.keys()
Array.values()
Array.entries()
二、集合(Sets)
1、实例化创建,add添加
2、元素不能重复(元素唯一性)
3、无序集合,存储和读取的顺序可能不一样,无法通过索引值访问,需要通过方法访问或获取元素
4、for循环可遍历
5、大小(长度)可动态调整
6、删除和查找元素简单快捷(不会影响其他元素位置,因此性能消耗较低)
添加元素:
add()
访问元素:
has()
删除元素:
delete()
三、对象(Object)
1、无序的键值对数据
2、通过键名(属性)访问元素
3、不可遍历(for...in除外)
4、键是唯一的,值不是
5、可以存储数据和函数
6、有原型方法
删除属性
delete person.age
四、映射(Maps)
1、有序的键值对数据
2、通过键访问元素
3、可遍历(for循环)
4、键是唯一的,值不是
5、键可以是各种类型的值(包括对象、数组)
6、纯数据存储,针对数据访问进行了优化
7、大数据量时,性能优于对象
实例化:
new Map()
添加元素:
map.set('average',1.6)
五、弱集合与弱映射
集合和映射的 变体,值和键仅"弱引用",如果未在应用程序的其他任何地方使用,垃圾回收则可以删除键和值
六、链表
单链表:每一个元素都知道下一个元素
可以有效的调整大小并再列表的开头和结尾插入
1、为什么使用链表
历史上,为方便内存管理(节约内存):不必事先指定内存大小,防止多余内存浪费
如今,JS具有动态数组,而内存也并不再是JS应用程序中的主要问题
- 在列表的开头进行高频插入操作,链表会很有用--链表比数组操作更快
七、衡量性能(时间复杂度 -- 大O符号)
1、线性时间复杂度
2、常数阶时间复杂度
3、对数阶时间复杂度
4、线性对数时间复杂度
5、平方阶时间复杂度
*** 代码执行时间的增长变化趋势
八、列表&表格
- 列表:值的集合,eg:数组、集合、链表
- 适合存储通过位置(通过索引或搜索)检索的值,也适合循环
- 表格:键值对的集合 eg:对象、映射 适合存储通过键检索的值,不关注循环