数组方法
检测数组
let arr = []
arr instanceof Array // true
// instanceof操作符的问题在于,如果存在多个不同的全局执行环境,从而有多个Array构造函数,就会导致无法确定数组实例
// 为了解决这个问题,ES5新增Array.isArray()方法
Array.isArray(arr) // true
转换方法
toString
把数组转换成字符串,并用逗号分隔开来
let arr = ['red','green']
arr.toString() // 'red,green'
join
把数组转换成字符串,并用指定的字符分割开来
注意:如果数组里的某项是null或undefined,那么该值转化成字符串时是空字符串
let arr = ['red', 'green']
arr.join('|') // 'red|green'
字符串的split()与它相反,用指定字符分割并组成数组
let str = 'red,green'
str.split(',') // ['red', 'green']
栈方法
push
push()方法可以接收任意数量的参数,并把它们逐个添加到末尾
并返回修改后数组的长度
let arr = []
arr.push('red') // 返回1
pop
pop()方法移除数组的最后一项,并且返回移除项
let arr = ['red']
arr.pop() // 返回'red'
队列方法
shift
shift()把数组的第一项移除并且返回移除项
let arr = ['red', 'green']
arr.shift() // 返回'red'
unshift
unshift()可以接收任意数量的参数,并把它们添加到数组前端
最后返回数组的长度
let arr = []
arr.unshift('red') // 返回1
重排序方法
reserve
反转数组的顺序
var arr = [1, 2]
arr.reverse() // [2, 1]
sort
默认情况下升序排序
把每个元素先toString(),然后再比较大小,所以不适用于数字比较
// 不是想要的排序
let arr = [10, 5, 1]
arr.sort() // [1, 10, 5]
使用比较函数排序
// 正确的排序
let arr = [10, 5, 1]
arr.sort(function(a, b) {return a - b}) // [1, 5, 10]
操作方法
concat
基于当前数组创建一个新的数组(拼接数组)
具体来说,这个方法会先创建一个当前数组的副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。
let arr1 = ['red']
let arr2 = arr1.concat('green', ['black', 'yellow'])
arr2 // ['red', 'green', 'black', 'yellow']
arr1 // ['red']
slice
基于当前数组中的一项或多项创建一个新的数组(截取数组)
原来的数组不会改变
let arr = ['red', 'green', 'yellow']
arr.slice() // 复制一个新的数组
arr.slice(1) // 从第1项开始复制,返回新的数组 ['green', 'yellow']
arr.slice(1, 3) // 从第1项开始复制, 复制到第3项为止(但是不包括第3项),返回新的数组 ['green', 'yellow']
如果参数有负数,则负数用数组的长度加上该负数来确定
如果结束位置小于开始位置,则返回空数组
splice
splice会破坏原来的数组
删除
两个参数
splice(从第几项开始删除, 删除几个)
返回被删除的数组
let arr = ['red', 'green', 'yellow']
arr.splice(1, 2) // 从第1项开始,删除2个元素,返回 ['green','yellow']
arr // ['red']
插入和替换
三个参数及以上
splice(从第几项开始删除, 要删除的项数, 要插入的项)
返回被删除的数组
let arr = ['red', 'green', 'yellow']
arr.splice(1, 2, 'black', 'purple') // 从第1项开始,删除2个元素,然后从第1项开始添加
arr // ['red', 'black', 'purple']
位置方法
indexOf()、lastIndexOf()分别从开头/末尾开始查找
返回指定元素在数组中的位置,如果没有,则返回-1
let arr = ['red', 'green']
arr.indexOf('green') // 1
// 可选的第二个参数表示从哪个位置开始找,默认为0
let arr = ['red', 'green','black']
arr.indexOf('green', 2) // -1
迭代方法
每个方法都接收两个参数
- 第一个参数是在每一项上运行的函数,该函数又接受三个参数,分别是数组项的值,该项在数组中的位置,数组本身
- (可选的)第二个参数是运行函数时的this指向(默认是window)
every
如果函数对每一项都返回true,则返回true(查询是否满足某个条件)
如果有一项返回false,则直接返回false,并且不会再对后面的项运行函数
some
如果函数对某一项返回true,则返回true(查询是否满足某个条件)
如果有一项返回true,则直接返回true,并且不会再对后面的项运行函数
var arr = [1, 2, 3, 4, 5]
arr.every(function(item, index, arr) {
return item > 2
}) // false
arr.some(function(item, index, arr) {
return item > 2
}) // true
fliter
对数组中的每一项运行给定函数,返回函数会返回true的项组成的数组
// 返回大于2的项
var arr = [1, 2, 3, 4, 5]
arr.filter(function(item, index, arr) {
return item > 2
}) // [3, 4, 5]
map
对数组中的每一项运行给定函数,返回每次函数调用结果组成的数组
// 每项的两倍
var arr = [1, 2, 3, 4, 5]
arr.map(function(item, index, arr) {
return item * 2
}) // [2, 4, 6, 8, 10]
forEach
对数组的每一项运行给定函数,没有返回结果
就是for循环的代替而已
var arr = [1, 2, 3, 4, 5]
arr.forEach(function(item, index, arr) {
// 执行某些操作
})
归并方法
reduce
从第一项开始,逐个遍历到最后
接受两个参数
-
第一个参数是每一项上调用的函数
该函数又接受4个参数,分别是:前一个值, 当前值, 当前项的索引, 数组对象
这个函数的返回值会作为第一个参数自动传给下一项
第一次迭代发生在数组的第二项,因此第一个参数是数组的第一项,第二个参数是数组的第二项 -
(可选的)第二个参数是作为归并基础的初始值
// 计算数组每项之和
// 第一次迭代,prev是1,cur是2, 返回3
// 第二次迭代,prev是3,cur是3, 返回6
var arr = [1, 2, 3]
arr.reduce(function(prev, cur, index, arr) {
return prev + cur
}) // 6
reduceRight
类似,只是从最后开始遍历到第一项。