步遥——数组的扩展

数组的扩展

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()的默认排序算法必须稳定

你可能感兴趣的:(步遥——数组的扩展)