新原型方法Array.prototype.copyWithin函数类型:/***@author:forceddd*@desc:从数组开始位置到结束位置(不包括末尾的元素),制作末尾元素的浅表副本,并开始从目标覆盖数组。最后返回修改后的数组*@param{number}target被复制到数组的起始覆盖位置,默认值为0*@param{number}start为元素被复制的位置,默认值为0*@param{数字|undefined}end复制元素结束的位置,默认值为数组的长度*@return{any[]}改变后的数组*/(target?:number,start?:number,end?:number|undefined)=>T[]copyWithin将数组中的元素从起始位置浅拷贝到结束位置(不包括末尾的元素),并从目标覆盖数组。最后返回修改后的原数组。//当没有传入参数时,使用默认值,相当于[1,2,3].copyWithin(0,0,3)//首先是数组中[0,3)的部分被复制,即[1,2,3]//然后从数组下标0开始覆盖,得到[1,2,3]console.log([1,2,3].copyWithin());//[1,2,3]//从数组下标1开始覆盖,复制的部分为[1,2,3],从原数组下标1开始覆盖,原数组只剩下两个位置,所以结果是[1,1,2]console.log([1,2,3].copyWithin(1));//[1,1,2]有几点需要注意:第一,copyWithin会修改原数组,返回修改后的原数组,而不是新建一个数组。constarr=[1,2,3];constres=arr.copyWithin(1,0);console.log(arr===res,arr);//true[1,1,2]第二个,当target>=arr.length时,不会发生拷贝行为,会是原数组没有任何修改直接返回。constarr=[1,2,3];constres=arr.copyWithin(6,2);//返回原数组,不做任何修改console.log(arr===res,arr);//true[1,2,3]三、当target、start或end传入负数时,表示此时从数组末尾开始计算。如果传入的值为-1,则表示倒数第一个元素的位置。constarr=[1,2,3];constres=arr.copyWithin(-2,2);//从下标2复制得到[3]//从-2开始,也就是倒数第二个开始覆盖元素,得到[1,3,3]console.log(arr===res,arr);//true[1,3,3]Array.prototype.fillfunctiontype:/***@author:forceddd*@desc:将数组从开始位置到结束(不包括结束)的部分赋值*@param{any}value用于给数组中的元素赋值的值*@param{number}start赋值的起始位置,默认为0*@param{number}end的结束位置赋值,默认为数组的长度*@return{*}返回值为赋值后的原数组*/(value?:any,start?:number,end?:number)=>any[];fill给数组从起始位置到结尾(不包括结尾)的部分赋值,然后返回数组。console.log(数组(4).fill());//[未定义,未定义,未定义,未定义]console.log(Array(4).fill(0));//[0,0,0,0]console.log(Array(4).fill(0,1,2));//[<1emptyitem>,0,<2emptyitems>]fill和copyWithin一样,返回原数组,当start或end为负数时,也和copyWithin一样处理。另外从代码中也可以看出,fill会生成空元素,如果value是一个对象,则使用该对象的引用进行赋值。换句话说:constv=[];constarr=Array(4).fill(v);console.log(arr[0]===arr[1]);//truearr[0].push(1);console.log(arr);//[[1],[1],[1],[1]]Array.prototype.find函数类型:/***@author:forceddd*@desc:findarray让findFn返回第一个值为true的元素并返回*@param{FindFn}在findFn数组的每一项上执行的函数*@param{any}thisArgthis对象在回调函数中findFn*@return{*}*/(findFn:FindFn,thisArg?:any)=>any;/***@author:forceddd*@param{any}数组中的项元素*@param{number}索引数组中的当前元素Mark*@param{any}arr数组实例*@return{boolean}*/typeFindFn=(item:any,index:number,arr:any[])=>boolean;find将返回数组中的值,以便回调函数返回第一个为true的元素,如果不存在该元素,则为undefined。console.log([1,2,3].find((v)=>v>=2));//2ES6之前,使用indexOf方法需要严格匹配(===)判断元素是否存在,使用some方法可以自定义比较回调函数,但是只能返回boolean,不能返回元素本身。需要注意的是,find中回调函数的执行次数是由数组的下标决定的,下标范围[0,arr.length-1]会执行一次。它并不关心当前元素的值,所以在当前元素为空元素时,find中的回调函数会将元素值作为undefined执行一次,这一点不同于map、forEach等函数。[1,,3,4].find((v)=>console.log(v));//1未定义34[1,,3,4].map((v)=>console.log(v));//134另外,find中的回调函数在第一次执行时,其执行次数[0,arr.length-1]已经确定,不会改变。这意味着,假设我们要处理的数组arr的长度为5,在回调函数执行过程中,修改arr使其长度变为10,或者删除一个元素使其长度变为4,则回调函数将被执行5次。当元素被删除时,回调函数在执行过程中无法访问该元素,会将元素替换为undefined继续执行。[1,2,3,4].find((v,i,arr)=>{//删除一个元素i===0&&arr.pop();console.log({v,i});});//{v:1,i:0}//{v:2,i:1}//{v:3,i:2}//{v:undefined,i:3}Array.prototype.findIndexfindIndex和find方法基本一样,只是返回值不同。findIndex返回满足条件的元素的下标。如果没有这样的元素,它将返回-1。keys,values,entries函数类型:typeKeys=()=>Iterator;typeValues=()=>Iterator;类型Entries=()=>Iterator<[number,any]>;keys、Values和entry不需要任何参数,返回一个迭代器。不同的是,迭代器中的值是数组的下标,数组的元素,以及数组下标和元素组成的[i,v]形式的键值对阵列。constit=['a','b','c'].entries();console.log(it.next());//{value:[0,'a'],done:false}console.log(it.next());//{值:[1,'b'],完成:false}console.log(it.next());//{值:[2,'c'],完成:false}console.log(it.next());//{值:未定义,完成:true}