写在前面
在工作中经常在处理一些数据的时候,记不起一些数组、对象的API。 这里我总结一下在工作中常用的数据、对象的API。咱们不妨从数组入手,尽量系统完整的归纳一下JavaScript常用数据结构。
JavaScipt的数据类型
请看MDN的描述:
链接:developer.mozilla.org/zh-CN/docs/…
在这里我们不仔细讨论JavaScript的Object原型设计,我们只关注普通对象Object,数组Array以及ES6后的一些新的数据类型(我是这么理解的)例如:Map, Set,WeakMap, WeakSet
JavaScript数组API
在工作中我经常忘记常用数组的常用API, 大多数都是直接forEach或者Splice。下文我暂时这样总结,如果有不对的地方欢迎指正。
创建数组
创建数组的方法有4种
- 使用Array构造函数
// 使用Array构造函数
let colors = new Array()
console.log(colors) // []
// 接受一个数值作为参数
let colors = new Array(20)
console.log(colors) // [ <20 empty items> ]
// 传入要保存的元素
let colors = ['red', 'blue', 'yellow']
console.log(colors) // [ 'red', 'blue', 'yellow' ]
- 数组字面量
let colors = ['red', 'blue', 'green']
let names = []
let values = [1, 2, ]
在使用数组字面量表示法创建数组不会调用array构造函数
- 静态方法from()
ES6新增的用于创建静态数组的方法,参数描述:
- Array.from()第一个参数是一个类数组对象,即任何可迭代的结构,或者一个有length属性和可索引元素的结构。
- Array.from()第二个参数是可选的映射函数。这个个函数可以直接增强新函数的值,而无须像调用Array.form().map()那样先创建一个中间函数。
- Array.from()第三个参数可选, 用于指定映射函数种的this,但这个重写的this值,在箭头函数中不适用。
值得思考:可以用在什么场景?
- 静态方式of() Array.of()可以将一组参数转换为数组。
值得思考:可以用在什么场景?
迭代器方法
Array原型上暴露了3个用于检索数组内容的方法:keys()、values()和entries()。
- keys() 返回数组索引的迭代器
- values() 返回数字元素的迭代器
- entries() 返回索引/值的迭代器
复制和填充方法
批量复制方法copyWithin()和填充数组方法fill()
转换方法
所有对象都有toLacalString()、toString()和valueOf()方法。还有转换为字符串的方法join()
- valueOf() 返回的还是数组本身
- toString() 返回由数组中每个等效字符串拼接而成的一个用逗号分隔的字符串
- join() 方法接受一个字符串分隔符,返回包含所有项的字符串
栈方法
push()和pop()
- push() 接受任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度
- pop() 删除数组的最后一项,同时减少数组的length值,返回被删除的项
队列方法
shift()、unshift()和push, pop()
- shift() 删除数组的第一项并返回它
- unshift() 在数组开头添加任意多个值,返回新的数组长度
使用shift()和push(),可以把数组当作队列来使用,数组开头取得数据,数组末尾添加数据。 使用unshift()和pop(),可以在反方向上模拟队列,数组开头添加数据,数组末尾取得数据。
排序方法
reverse()和sort(), 都返回调用他们的数组的引用
- reverse() 将数组元素反向排列
- sort()
sort()方法更加灵活,默认情况下,会按照升序重写排列元素。sort()会在每一项上调用String()转型函数,然后比较字符串来决定顺序。
sort()还接受一个比较函数。比较函数接受两个参数
- 如果第一个参数应该排在第二个参数后面,就返回负值
- 如果两个参数相等,就返回0
- 如果第一个参数应该排在第二个参数前面,就返回正值
const arr = [1, 2, 3, 4, 5, 6, 7, 8]
// 正向排序
console.log(arr.sort((a, b) => a - b))
// 反向排序
console.log(arr.sort((a, b) => b - a))
操作方法
concat()、slice()和splice()
- concat() 在现有数组全部元素基础上创建一个新数组
- slice() 用于创建一个包含原数组中一个或多个元素的新数组;可以接受一个或两个参数:返回元素的开始索引或结束索引。
- splice() 最强大的数组方法
splice()的主要目的是在数组中间插入元素,但有3种不同的方式使用这个方法
- 删除 传入2个参数:要删除的第一个元素的位置和要删除的元素数量
- 插入 传入3个参数:开始位置、0(要删除的元素数量)、要插入的元素
- 替换 传入3个参数:开始位置、要删除的元素数量、要插入的任意多个元素
搜索和位置方法
- 严格相等 indexOf()、lastIndexOf()和includes()
- indexOf() 从数组开始(第一项)开始向后搜索,返回要查找的元素在数组中的位置,如果没有找到则返回-1
- lastIndexOf() 从数组末尾(最后一项)开始向前搜索,返回要查找的元素在数组中的位置,如果没有找到则返回-1
- includes() 返回布尔值,找到则返回true, 否则返回false
- 断言函数 断言函数接收3个参数:元素, 索引值,数组本身。 find()和findIndex(), 接受断言函数作为第一个参数,接受第二个可选参数,用于指定断言函数内部的this
- find() 返回第一个匹配的元素
- findIndex() 返回第一个匹配的索引
迭代方法
5个迭代方法
- every() 对数组每一项都运行传入的函数,如果对每一项都返回true, 这个方法返回true
- filter() 对数组每一项都运行传入的函数,函数返回true的项会组成数组之后返回
- forEach() 对数组每一项都运行传入的函数,没有返回值
- map() 对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组
- some() 对数组每一项都运行传入的函数,如果有一项返回true,这个方法返回true
- 每个方法接受2个参数:每一项为参数运行的函数,可选的作为函数运行上下文的作用域对象(影响函数中this的值)
- 传给每个方法的函数接受3个参数:数组元素、数组索引和数组本身
every()和some()可以理解为一对,返回的都是布尔值,可以用于检验数组中的每一项 filter理解为过滤,返回的是新的数组 map和forEach()都可以用于处理函数的每一项,forEach()没有返回值,而map有返回值
归并方法
reduce和reduceRight()。这两个方法都会迭代数组的所有项,最终构建一个返回值。
- reduce() 从数组第一项到最后一项
- reduceRight() 从数组最后一项到第一项
接收2个参数:对每一项都会运行的归并函数,可选的以之为归并起点的初始值 归并函数接收4个参数:上一个归并值、当前值、当前的索引、数组本身