1. ...有两种情况
1.rest参数 形式为 ...变量名 另外rest参数只能作为参数的最后一个出现,不然报错。
function a(a,...b) {
console.log(a) // 1
console.log(b) // [2,3,4,5,6]
}
a(1,2,3,4,5,6)
2.扩展运算符... 这种情况为rest参数的逆运算,将参数转成用逗号隔开的参数序列。...后面也可以跟表达式
let a = [1,2,3,4,5]
console.log(...a) // 1,2,3,4,5
使用扩展运算符就能代替很多方法。
Math.max(...[14,3,77])
//等同于
Math.max(14,3,77)
let b = [1,2,3,4]
function a(...b) {}
//等同于
functiong a(1,2,3,4) {}
//还可以用来深拷贝数组,正常的复制数组,指向的是同样的位置,会同时改变两个数组
let a= [1,2,3]
let b= [...a]
//等同于
let [...b] = a //这种方法,同时使用了解构语法
//合并数组
let a=[1,2]
let b=[2,3]
let c=[...a,...b] //c=[1,2,2,3]
//其他用法 和解构语法结合
[a,...b] = list //a=list[0] b就是去掉list[0]之后的数组
//将字符串转成数组
a='hello'
b=[...a] // ['h','e','l','l','o']
使用扩展运算符可以将很多内置遍历器(Iterator)的对象转化成数组。
let a={
'0': 'a',
'1': 'b',
length: 3
}
//a是个类似数组的对象,使用扩展运算符没法转化成真正的数组,使用Array.from()可以转成真正的数组。
2.Array.from() 可以将很多内置内置遍历器的对象转成数组,类似数组的独享也可以。它还可以接受第二个参数,第二个参数类似于数组的map方法,可以用来对每一个参数进行处理
let a={
'0': 'a',
'1': 'b',
length: 3
}
let b = Array.from(a) //['a','b']
//Array.from()传入第二个参数,对每个参数进行操作
let c=Array.from(a,(i) => {i=0}) //[0,0]
//如果第二个参数处理使用了this关键字,可以传入第三个参数,用来绑定this
//还可以用来把字符串转成数组,然后返回正确字符串长队,避免js把大于\uFFF的字符算作两个字符的bug
3.Array.of()将一组值,转成数组
Array.of(1,2,3) // [1,2,3]
4.数组的实例方法copyWithin()
[1,2,3,4].copcWithin(0,2,3) //[3,2,3,4]
//一共三个参数,第一个为必需,从那个位置开始替换,第二个参数从哪个位置开始,第三个参数到那个位置结
//束,后两个参数选下来的参数复制到第一个参数开始的位置,三个参数都可为负数,表示到数。
5.数组的实例方法find()和findIndex()
find() 用来找到第一个符合条件的数组成员,并返回,如果找不到返回undefined.
findIndex() 和find()方法类似,返回值为第一个符合条件的数组位置。
以上两个方法都可以传入第二个参数,用来绑定this
[1,0,5,9].find((i) => {return i > 8}) //9
let person = {age: 8,name: 'a'}
[1,0,2,10].finde((i) => {return i > this.age},person) //10
6.数组的实例方法fill() 使用给定值,填充一个数组,可以传入三个参数,第一个是给定值,填充对象,后两个参数用来确定填充的位置。如果填充的对象类型是对象,那么对填充后的数组操作时每个填充上的对象都会改变,也就是填充的是同一个地址的对象,为浅拷贝。
[1,2,3].fill(9) //[9,9,9]
[1,2,3].fill(9,1,2) //[1,9,3]
let arr = [1,2,3]
arr.fill({name: 'a'}) //此时{name:'a'}这个对象被浅拷贝了三次,然后填充到数组中
arr[0].name = 'b' // arr = [{name:'b'},{name: 'b'},{name: 'b'}]
7. 数组的实例方法 entries() keys() values() 用于遍历数组,分别返回键值对,键,值。
for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
8.数组实例方法includes() 用来查找数组中是否含有给定的值 ,返回布尔值,可以用来判断NaN,比indexOf()好用.
[1,2,3].includes(2) //true
9.数组实例方法 flat() 可以将多维数组拉伸成一维数组,数组内值位置不变,返回新数组,另外可以自动去掉空位
[1,[2,3]].flat() // [1,2,3] 默认展开一层,也可以传参,展开多层
[1,2,[[3,4],5],6].flat(2) //[1,2,3,4,5,6] //或者传入Infinity,有几层展开几层
[1,2,[[3,4],5],6].flat(Infinity) //[1,2,3,4,5,6]
[1,,3,4].flat() //[1,3,4] 自动把空位去掉
flatMap() 可以传入两个参数,第二个参数可以用来绑定this对象,第一个参数是一个函数(可以传三个值,当前数组成员,当前数组成员位置,原数组),可以用来对每个值操作,然后执行flat()方法,但是只能展开一层,返回值组成一个新数组。
[2,3,4].flatMap(i => {[i,i*2]}) // [2,4,3,6,4,8]
10.数组空位 指数组某一个位置没有任何值,不是undefined,对数组空位的处理每个方法都不一样,尽量避免出现,可以使用flat()方法把空位去掉。