数组的扩展
rest参数:...变量名 ;add(...values) //函数的rest参数,用于获取函数的多余参数,变量values是一个数组,该变量将多余的参数放入数组中。
扩展运算符:... ;arr.push(...items) // 将一个数组转为用逗号分隔的参数序列。主要用于函数调用
用处:复制数组
const a1 = [1,2]
const a2 = a1 ;//指针复制,不是内容复制,属于浅克隆
深克隆方法:
const a2 = a1.concat();//复制内容
const a2 = [...a1];//复制内容
合并数组
[...a1,...a2,...a3] //浅拷贝
解构赋值
const [first ,...rest] = [1,2,3,4,5];
操作字符串
将字符串转为数组,计算4个字节的unicode字符的长度和反转
[...'hello']//['h','e','l','l','o']
将所有定义了Iterator接口的对象转为数组
例如类数组:
const param = [...arguments]
function test(){
const param = [...arguments]
console.log('param',param )
}
test(2,3) //'param' [2, 3]
Map和Set结构,Generator函数
以上都有Iterator接口,所以可以使用扩展运算符转为数组
数组新增的静态方法1:Array.from
该方法可以将类似数组,具有Iterator接口的数据,或者是没有Iterator接口,但是具有length属性的对象转换为数组,就是扩展运算符不能转换的数据类型,Array.from都可以转换
Array.from('hello'),//['h','e','l','l','o']
第二个参数传一个对转为数组后的每一项进行操作的方法,类似map方法
Array.from('hello',(x,i)=>i+x)
如果没有Array.from方法,使用数组的slice方法进行改造:
[].slice.call(obj)
第三个参数,用来绑定this
静态方法2:Array.of,用于将一组值转为数组,参数就是组成数组的成员
Array构造数组时,参数个数为1时参数表示的时数组的长度,多余1个时,参数才成为数组的成员
Array.of解决了上面的不同值问题,所以可以使用Array.of替代new Array(),它总会返回参数值组成的数组,如果没有参数,就返回一个空数组
实例方法1:copyWithin
语法:将start开始读取到end前一位结束的数据替换target开始的数据,改变原数组
Array.prototype.copyWithin(target, start = 0, end = this.length)
[1,2,3,4,5].copyWithin(2,3) //[1, 2, 4, 5, 5]
实例方法:find ,findIndex
find找出第一个符合条件的数组成员,参数时一个回调函数,找出第一个返回值为true的成员,然后返回该成员
findIndex找出第一个符合条件的数组成员的位置,否不符合则返回-1
均支持第二个参数绑定this ,并且可以发现NaN,弥补indexOf的不足
function f(v){
return v > this.age;
}
let person = {name: 'John', age: 20};
[10, 12, 26, 15].find(f, person);
实例方法:fill
使用一个值(参数),填充数组中的每一项
['a','b'].fill(4)//[4,4]
new Array(5).fill(3) //初始化数组很方便
接受第二,第三个参数,指定填充的起始位置和结束位置之前
['a', 'b', 'c'].fill(7, 1, 2) //['a',7,'c']
如果填充的类型时对象,则被赋值的时同一个内存地址的对象,不是深拷贝对象
let arr = new Array(5).fill({a:1})
arr[0] === arr[1] // true 表明是同一个对象地址
实例方法:entries,keys,values
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
可以使用for...of循环进行遍历
实例方法:includes
类似字符串的includes方法
Set和Map数据结构判断是否含有某项使用has,
Map的has用来查找键名
Set的has用来查找键值
实力方法:flat,flatMap 均不改变原数组
拉平数组
flat默认只会拉平一层,如果给参数是一个整数N,则会拉平N层
如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数
如果原数组有空位,flat()方法会跳过空位
[1,2,[3,5,[6]]].flat() //[1, 2, 3, 5, [6] ]
[1,2,[3,5,[6]]].flat(2) // [1, 2, 3, 5, 6]
flatMap,对原数组的每个成员执行一个函数,然后对返回值组成的数组执行flat,不改变原数组
只能展开一层数组
第一个参数是遍历函数,第二个参数用来绑定this
es5对数组空位的处理:
* forEach(), filter(), reduce(), every() 和some()都会跳过空位。
* map()会跳过空位,但会保留这个值
* join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串
es6对数组的空位处理:转为undefined
处理数组排序的稳定性:
排序稳定性(stable sorting)是排序算法的重要属性,指的是排序关键字相同的项目,排序前后的顺序不变
ES2019 明确规定,Array.prototype.sort()的默认排序算法必须稳定