isArray
- 检测一个值是否为
Array
返回true/false
- 适用场景: 判断一个值是数组且长度存在
- 语法
Array.isArray(obj)
- obj 需要检测的值。
1 | <template> |
.find
ES6 新增API
从数组中查找第一个符合匹配条件的元素;查找不到返回undefined
实用程度:
适用场景: 从数组中找元素
语法
arr.find(callback[, thisArg])
callback
在数组每一项上执行的函数,接收 3 个参数element
当前遍历到的元素index
当前遍历到的元素下标/索引array
数组本身
thisArg
执行回调用做this
的对象
1 | <template> |
.findIndex
ES6 新增API
从数组中查找第一个符合匹配条件的元素的索引;查找不到返回 -1
实用程度:
适用场景: 从数组中找元素索引(更多场景项目中实际发掘吧)
与
find
API相比:find
返回的是符合条件的元素,findIndex
返回的是符合条件元素的索引语法
arr.findIndex(callback[, thisArg])
callback
在数组每一项上执行的函数,接收 3 个参数element
当前遍历到的元素index
当前遍历到的元素下标/索引array
数组本身
thisArg
执行回调用做this
的对象
1 | const hospitalList = [ |
.includes
ES7 新增API
检测数组是否包含指定的元素,返回true/false
实用程度:
适用场景: 订单列表符合条件的订单状态才显示操作按钮
语法
arr.includes(valueToFind[, fromIndex])
valueToFind
要查找的元素值includes
对大小写敏感fromIndex
从指定索引处开始查找;默认为0;若为负值,则取绝对值从后往前(从右往左)开始查找
1 | ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'].includes('d'); // true |
1 | <template> |
.flat
- ES10 正式新增
- 将多维数组进行展开成一维数组
- 语法
const newArray = arr.flat([depth])
depth
要拉平的数组深度;默认为1
1 | const list = [{name: '李白'}, [{name: '李白'}, {name: '杜甫'}, [str => str, ['唐', '宋', '元', '明', '清']]]]; |
.sort
对数组进行排序(官方表述:
sort()
方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的)会修改原数组
语法:
arr.sort([compareFunction])
compareFunction
可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。firstEl
第一个用于比较的元素secondEl
第二个用于比较的元素
返回值: 排序后的数组。请注意,数组已原地排序,并且不进行复制。
如果没有指明
compareFunction
,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 “Banana” 会被排列到 “cherry” 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明compareFunction
),比较的数字会先被转换为字符串,所以在Unicode顺序上 “80” 要比 “9” 要靠前。如果指明了
compareFunction
,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
如果
compareFunction(a, b)
小于 0 ,那么 a 会被排列到 b 之前;如果
compareFunction(a, b)
等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);如果
compareFunction(a, b)
大于 0 , b 会被排列到 a 之前。
compareFunction(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
1 | const hiStory = ['秦','a','1','汉','b',2,'隋','c','3','唐','d',4,'宋',5,'e','元', '6','f','明','g','7',8,'h','清']; |
1 | const orderList = [ |
.concat
- 将多个数组合并为一个
- 此API是对数组的深拷贝
- 语法
const new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
valueN
将数组和/或值连接成新数组。如果省略了valueN参数参数,则concat会返回一个它所调用的已存在的数组的浅拷贝
1 | const list1 = [{name: '李白'}],list2 = ['陶潜'],other = '窝窝头', school = () => '豫章书院'; |
.filter
数组的过滤器;返回符合条件的所有元素
实用程度:
适用场景: 条件查询
语法
const newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
callback
用来测试数组的每个元素的函数element
数组中当前正在处理的元素。index
可选。正在处理的元素在数组中的索引。array
可选。调用了filter
的数组本身。
thisArg
执行callback
时,用于this
的值。
1 | const orderList = [ |
.map和.forEach
map()
和forEach()
都是ES5就具有的方法map()
和forEach()
都可以实现对数组的遍历map()
会对数组进行深拷贝(官方描述:map()
方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果),forEach()
对数组的每一个元素执行一次提供的函数,会修改原数组,无返回值实用程度:
语法:
const new_array = arr.map(callback(currentValue[, index[, array]])[, thisArg])
const new_array = arr.forEach(callback(currentValue[, index[, array]])[, thisArg])
callback
针对数组中的每个元素, 都会执行该回调函数, 执行时会自动传入下面三个参数:element
数组中当前正在处理的元素。index
可选。正在处理的元素在数组中的索引。array
可选。调用了 此API 的数组本身。
thisArg
执行callback
时,用于this
的值。
map
和forEach
语法一样,没有写错
1 | const orderList = [{"contact":"李贺","price":4,"orderStatus":4,"logisticsState":260},{"contact":"袁天罡","price":23.7,"orderStatus":5,"logisticsState":220},{"contact":"袁天罡","price":219.5,"orderStatus":4,"logisticsState":220},{"contact":"苏轼","price":59,"orderStatus":4,"logisticsState":220},{"contact":"秦始皇","price":175.6,"orderStatus":2,"logisticsState":110},{"contact":"孟浩然","price":127.62,"orderStatus":3,"logisticsState":260},{"contact":"苏轼","price":108,"orderStatus":2,"logisticsState":250},{"contact":"李商隐","price":230.8,"orderStatus":4,"logisticsState":220},{"contact":"孟浩然","price":111.3,"orderStatus":4,"logisticsState":110},{"contact":"秦始皇","price":34.8,"orderStatus":3,"logisticsState":260}]; |
这段代码里的将状态码翻译成文字写的非常非常烂,之后我们会使用
Map
对象结合扩展运算符
进行优化。
.indexOf和.findIndex
indexOf
是ES5的API,findIndex
是ES6的APIindexOf
和findIndex
都是从数组中找元素索引indexOf
在数组中查找给定元素(值)的第一个索引,并返回,找不到返回 -1;findIndex
在数组中查找满足条件(函数)的第一个元素索引,并返回。否则返回 -1;实用程度:
语法:
arr.indexOf(searchElement[, fromIndex])
searchElement
要查找的元素fromIndex
可选 开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-3表示从倒数第三个元素开始查找(从左往右), 如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
const index = arr.findIndex(callback(currentValue[, index[, array]])[, thisArg])
callback
用来测试数组的每个元素的函数currentValue
当前元素index
当前元素的索引array
执行findIndex
API的数组本身
1 | ['a','s','d','f','g','h'].indexOf('h',-2); // 5 从倒数第二个元素处往右开始查找 |
.lastIndexOf
- 返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找(从右向左),从
fromIndex
处开始。 - 语法:
arr.lastIndexOf(searchElement[, fromIndex])
searchElement
要查找的元素fromIndex
可选 从此位置开始逆向查找。默认为数组的长度减 1(arr.length - 1
),即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。
lastIndexOf
和indexOf
API是两个作用相同结果相反的API;相同点都是从数组中查找给定元素的索引,不同点是indexOf
是从左往右查,lastIndexOf
是从右往左查,indexOf
是查找元素在数组的第一个索引(同一元素,在数组中有多处,返回第一处索引),lastIndexOf
是查找元素在数组的最后一个索引(同一元素,在数组中有多处,返回最后一处索引)代码和
indexOf
API相反,就不写了
.join
这个API在js的第一个版本就有
join
根据指定分隔符(默认分隔符为英文逗号)将数组所有元素拼成字符串返回。如果数组只有一个项目,那么将返回该项目而不使用分隔符实用程度:
语法:
arr.join([separator])
separator
可选 指定一个字符串来分隔数组的每个元素,默认为英文逗号
1 | ['a','f','d','f','g','h'].join('<-->'); // "a<-->f<-->d<-->f<-->g<-->h" |
.reduce和.reduceRight
reduce
和reduceRight
都是ES5就有的方法都是累加器;
reduce
从左往右执行,reduceRight
从右往左执行适用场景 还记得讲模版字符串中可以使用变量的那个例子吗
语法:
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
arr.reduceRight(callback(accumulator, currentValue[, index[, array]])[, initialValue])
callback
一个回调函数,用来操作数组中的每个元素,可接受四个参数accumulator
上一次调用回调的返回值,或提供的initialValue
。如果没有提供initialValue
, 第一次函数执行时accumulator
就是数组的第0个元素,currentValue
是数组的第一个元素currentValue
当前被处理的元素index
可选 数组中当前被处理的元素的索引array
可选 调用reducet()
的数组
initialValue
可选 值用作回调的第一次调用的累加器。如果未提供初始值,则将使用并跳过数组中的最后一个元素。在没有初始值的空数组上调用reduce或reduceRight就会创建一个TypeError。
1 | // 模版字符串中使用变量的例子是这么写的 |
.shift和.pop
shift
和pop
都是用来从数组中删除元素shift
和pop
都会改变原数组shift
删除数组的第一个元素,并返回该元素的值;pop
删除数组的最后一个元素,并返回该元素的值语法
arr.shift()
arr.pop()
- 当数组为空时返回undefined
这两个API很简单,也是较为常用的API,代码省略
.unshift和.push
unshift
和push
都是用来向数组添加元素的unshift
和push
都会返回数组的新长度unshift
和push
都会改变原数组unshift
向数组的开头添加元素,push
向数组的结尾添加元素- 语法
arr.unshift(element1, ..., elementN)
arr.push(element1, ..., elementN)
elementN
被添加到数组开头或结尾的元素
1 | const list = []; |
这两个API也很简单,也很好理解,可以多用用,多感受下
.some和.every
some
和every
都是ES5就有的APIsome
和every
都是用来测试数组元素是否可以通过测试条件(我们提供的一个测试函数),通过就返回 true ,否则返回 false ;不同的是数组中只要有一个元素通过测试some
就会返回 true ,而every
需要所有元素都通过测试才会返回true。语法
arr.some(callback(element[, index[, array]])[, thisArg])
arr.every(callback(element[, index[, array]])[, thisArg])
callback
用来测试每个元素的函数,它可以接收三个参数:element
用于测试的当前值。index
可选 用于测试的当前值的索引。array
可选 当前数组。
thisArg
可选 执行callback
时使用的this
值。返回值 回调函数必须返回Boolean值
1 | const list = [{id: 1012098909, userName: '李白'}, {id: null, userName: '杜甫'}, {id: 102909890, userName: '松鼠航'}] |
这两个判断很简单,就是一个并(&)一个或(|)。
.slice
数组截取,根据传入的起始位置和截止位置从原数组中截取指定长度的元素组成新的数组返回,新数组为原数组的浅拷贝不会改变原数组;(官方描述:
slice()
方法返回一个新的数组对象,这一对象是一个由begin
和end
决定的原数组的浅拷贝(包括begin
,不包括end
)。原始数组不会被改变。)语法:
arr.slice([begin[, end]])
begin
可选 提取起始处的索引(从0
开始),从该索引开始提取原数组元素。如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,
slice(-2)
表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。如果省略
begin
,则slice
从索引0
开始。如果
begin
大于原数组的长度,则会返回空数组。end
可选 提取终止处的索引(从0
开始),在该索引处结束提取原数组元素。slice
会提取原数组中索引从begin
到end
的所有元素(包含begin
,但不包含end
)。slice(1,4)
会提取原数组中从第二个元素开始一直到第四个元素的所有元素 (索引为 1, 2, 3的元素)。如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。
slice(-2,-1)
表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。如果
end
被省略,则slice
会一直提取到原数组末尾。如果
end
大于数组的长度,slice
也会一直提取到原数组末尾。返回值 一个含有被提取元素的新数组。
slice
不会修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。原数组的元素会按照下述规则拷贝:
如果该元素是个对象引用 (不是实际的对象),
slice
会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。对于字符串、数字及布尔值来说(不是
String
、Number
或者Boolean
对象),slice
会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。如果向两个数组任一中添加了新元素,则另一个不会受到影响。
1 | const obj1 = {name: '李白', age: 18}; |
.splice
splice()
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。可以删除元素,也可以替换元素,也可以插入元素
语法
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
start
指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;
如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于
array.length-n
);如果负数的绝对值大于数组的长度,则表示开始位置为第0位。
deleteCount
可选 整数,表示要移除的数组元素的个数。如果
deleteCount
大于start
之后的元素的总数,则从start
后面的元素都将被删除(含第start
位)。如果
deleteCount
被省略了,或者它的值大于等于array.length - start
(也就是说,如果它大于或者等于start
之后的所有元素的数量),那么start
之后数组的所有元素都会被删除。如果
deleteCount
是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。item1,item2,...
可选 要添加进数组的元素,从start
位置开始。如果不指定,则splice()
将只删除数组元素。返回值 由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
1 | const list = ['a', 1, ['李白'], {tip: '提示语'}]; |
其他(不常用)
from
- 将一个可迭代对象创建为数组(官方描述:
Array.from()
方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。) - 语法
Array.from(arrayLike[, mapFn[, thisArg]])
arrayLike
想要转换成数组的可迭代对象mapFn
可选 如果指定了该参数,新数组中的每个元素会执行该回调函数。(也就表示,先转成数组,然后在对数组进行map遍历)thisArg
可选 可选参数,执行回调函数mapFn
时this
对象。- 返回值 新数组
1 | // 字符串变数组 |
js内置的可迭代对象有
String
、Array
、TypedArray
、Map
、Set
of
- 此API是ES6新增的API
Array.of()
方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。(核心:用来创建数组)- 语法:
Array.of(element0[, element1[, ...[, elementN]]])
elementN
任意个参数,将按顺序成为返回数组中的元素。- 返回值为创建的数组
1 | Array.of('周日', '周一', '周二', '周三', '周四'); // ['周日', '周一', '周二', '周三', '周四'] |
Array.of()
和Array
构造函数之间的区别在于处理整数参数:Array.of(7)
创建一个具有单个元素 7 的数组,数组长度为1,而Array(7)
创建一个长度为7的空数组(注意:这是指一个有7个空位(empty)的数组,而不是由7个undefined
组成的数组)。
.copyWithin
此API为ES6新增API
将数组的某些元素复制插入到数组的指定位置,并返回改变后的数组(官方描述:
copyWithin()
方法浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度。)特点:会修改原数组;
语法:
arr.copyWithin(target[, start[, end]])
target
【可选】 0 为基底的索引,复制序列到该位置。如果是负数,target
将从末尾开始计算。如果
target
大于等于arr.length
,将会不发生拷贝。如果target
在start
之后,复制的序列将被修改以符合arr.length
。start
【可选】 0 为基底的索引,开始复制元素的起始位置。如果是负数,start
将从末尾开始计算。如果
start
被忽略,copyWithin
将会从0开始复制。end
【可选】 0 为基底的索引,开始复制元素的结束位置。copyWithin
将会拷贝到该位置,但不包括end
这个位置的元素。如果是负数,end
将从末尾开始计算。如果
end
被忽略,copyWithin
方法将会一直复制至数组结尾(默认为arr.length
)。返回值 为修改后的数组
1 | const arr = ['a','s','d','f','g','h','1','2','3','4','5','6','j']; |
copyWithin
会直接修改原数组,基于此,某些情况,其实我们没必要去接返回值,因为返回值也是被修改后的数组
.fill
- 此API为ES6新增API
fill()
方法用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引。fill()
和copyWithin()
有相似性,都是替换数组元素。不同的是fill()
使用固定值替换,copyWithin()
是从数组的指定起始位置和终止位置取元素来替换- 特点:1. 会修改原数组 2. 数组长度不变(隐含意思就是去填充替换空数组得到的还是空数组。指定的终止索引超过了数组本身的终止索引,也就到数组本身的终止索引就结束了,不会改变数组长度)
- 语法:
arr.fill(value[, start[, end]])
value
用来填充数组元素的固定值start
【可选】起始索引,默认值为0。如果start
是个负数, 则开始索引会被自动计算成为arr.length + start
end
【可选】终止索引,默认值为arr.length
。如果end
是个负数, 则结束索引会被自动计算成为arr.length + end
(长度是正数,end是负数,本质是减法,OK?)。- 返回值 为修改后的数组
1 | const arr = ['a', 's', 'd', 'f']; |
如果你想要看
start
>end
是什么样子,请自行打印
.entries
- 此API是ES6新增API
entries()
方法返回一个新的可迭代(Array Iterator)对象,该对象包含数组中每个索引的键/值对- 语法:
arr.entries()
- 返回值 一个新的
Array
迭代器对象。Array Iterator
是对象,它的原型(__proto__:Array Iterator
)上有一个next()
方法,可用用于遍历迭代器取得原数组的[key,value]
- 返回值 一个新的
1 | const arr = ['a', 6, {name: '张三'}, () => 18]; |
.keys
此API是ES6新增API
keys()
方法返回一个包含数组中每个索引键的Array Iterator
对象语法:
arr.keys()
- 一个新的
Array
迭代器对象。
- 一个新的
1 | const arr = ['a', 6, {name: '张三'}, () => 18]; |
.values
- 此API是ES6新增API
values()
方法返回一个新的Array Iterator
对象,该对象包含数组每个索引的值- 语法:
arr.values()
- 一个新的
Array
迭代对象。
- 一个新的
1 | const arr = ['a', 6, {name: '张三'}, () => 18]; |
entries()
、keys()
和values()
都是返回一个新的可迭代对象。不同的是entries()
的可迭代对象中包含的是数组的每一个索引和索引对应的值;keys()
的可迭代对象中包含的是数组的每一个索引;values()
的可迭代对象中包含的是数组的每一个索引对应的值;更简单说
values()
和keys()
合起来就是entries()
.flatMap
- 暂时还是草案,未写入标准
flatMap()
方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()
),然后对返回值组成的数组执行flat()
方法- 语法:
var new_array = arr.flatMap(callback(currentValue[, index[, array]])[, thisArg])
callback()
执行map()的函数,可以接收三个参数:currentValue
当前正在数组中处理的元素index
【可选】 数组中正在处理的当前元素的索引。array
【可选】被调用的map
数组
thisArg
【可选】执行callback
函数时 使用的this
值
1 | // 这段代码示例来自MDN |
注意:
flatMap()
只能拉平一层
flatMap()
目前只是草案,在某些浏览器(IE,Edge)中并不支持
.reverse
reverse()
方法将数组中元素的位置颠倒,并返回该数组。该方法会改变原数组。语法:
arr.reverse()
- 返回值:颠倒后的数组。
1 | const arr = [0,1,2,3,4,5,6,7,8,9]; |