ResidualoperatorResidualoperator:...variable可以将数组的值分解成一个单一的参数序列console.log(...[1,2,3,4,5]);//12345let{a,b,...z}={a:1,b:2,c:3,d:4}//a1//b2//z{c:3,d:4}剩下的运算符是深拷贝吗?1.如果剩下的算子只有一层,就是深拷贝//Arrayleta=[1,2,3,4]letb=[...a]b[0]=5console.log(a);//[1,2,3,4]console.log(b);//[5,2,3,4]//objectletaa={name:'Western'}letbb={...aa}bb.name='Defeat'console.log(aa);//{name:'Western'}console.log(bb);//{name:'求败'}2.如果剩余算子有多层,则数据为基本类型,为深拷贝letc=[1,2,3]letd=[4,5,6]让e=[...c,...d]e[0]=9console.log(c);//[1,2,3]console.log(d);//[4,5,6]控制台。日志(e);//[9,2,3,4,5,6]3.如果rest算子有多层,对象和数组中的参数序列是引用类型,是浅拷贝。内部引用类型对象实际复制的是指针,所以是浅拷贝,基本类型是深拷贝。leta2=[{name:'Eastern'},5]letb2=[...a2]b2[0].name='Undefeated'b2[1]=6console.log(a2);//[{Undefeated},5]console.log(b2);//[{undefeated},6]Array.from()Array.from()可以将类数组对象或可遍历对象转换为真正的数组。需要注意的是:length属性必须可以转换。//Badletar={'0':'a','1':'b','2':'c',}console.log(ar);//{0:'a',1:'b',2:'c'}console.log(ar.length);//undefinedconsole.log(Array.from(ar));//[]//正确让ar2={'0':'a','1':'b','2':'c',长度:3}console.log(ar2);//{0:'a',1:'b',2:'c',长度:3}console.log(ar2.length);//3console.log(Array.from(ar2));//['a','b','c']任何具有length属性的东西都可以通过Array.from()转换为数组Array.from({length:3});//[undefined,undefined,undefined]Array.from()的第二个参数可以处理转换后的数组的每个元素并返回Array.from([1,2,3],(x)=>x+1);//[2,3,4]Array.from('123',(x)=>x+1);//['11','21','31']Array.from()返回一个新数组letarr3=[1,2,3]letarr4=Array.from(arr3,x=>x+1)控制台日志(arr3);//[1,2,3]console.log(arr4);//[2,3,4]可以通过第二个参数判断数组中的值是否存在,如果不存在或者为假(false),则返回0letarr5=[1,,2,,3,false,true]Array.from(arr5,n=>n||0);//[1,0,2,0,3,0,true]Array.fo()将一组值转换成数组数组(1,2,3);//[1,2,3]Array.of(3);//[3]find(),findIndex(),findLast()find()数组方法,返回第一个满足条件的数组成员,没有找到则返回undefinedletfi=[{id:1,name:'Orient'},{id:2,name:'不败'},{id:3,name:'东方无敌'}]letback=fi.find(el=>el.id==2)letback2=fi.查找(el=>el.id==4)console.log(返回);//{id:2,name:'Undefeated'}console.log(back2);//undefinedfindIndex()数组方法,返回满足条件的数组下标,没有找到返回-1,返回的下标从0开始letfi2=[{id:1,name:'东方'},{id:2,name:'不败'},{id:3,name:'东方无敌'}]letback3=fi2.findIndex(el=>el.id==2)letback4=fi2.findIndex(el=>el.id==4)console.log(back3);//1console.log(back4);//-1findLast()数组方法,从数组尾部向前查找,返回满足条件的项letfi3=[{id:1,name:'Orient'},{id:2,name:'Undefeated'},{id:3,name:'东部不败'}]letback5=fi2.findLast(el=>el.id==2)letback6=fi2.findLast(el=>el.id==4)控制台日志(返回5);//{id:2,name:'Undefeated'}console.log(back6);//undefinedfindLastIndex()数组方法,从末尾向前查找,返回匹配到的当前项的下标,从0开始号开始,没找到return-1letfi4=[{id:1,name:'东方'},{id:2,name:'不败'},{id:3,name:'东方无敌'}]letback7=fi2.findLastIndex(el=>el.id==2)letback8=fi2.findLastIndex(el=>el.id==4)console.log(back7);//1console.log(back8);//-1fill()用给定的参数[1,2,3].fill(5)填充数组;//[5,5,5]第二个和第三个参数分别是填充的起始位置和结束位置的第一位,从位置0开始[1,2,3,4,5].fill(9,2,4);//[1,2,9,9,5]fillhere它从数组的第2个位置开始,到第4个位置的前一个位置结束。entries(),keys(),values()keys遍历键名for(letindexof['a','b'].keys()){console.log(index)}//01valuespair键值遍历for(letindexof['a','b'].values()){console.log(index)}//一个bentries键值对遍历for(let[index,item]of['a','b'].entries()){console.log(index,item)}//0'a'//1'b'includes()includes()判断是否有对应的值数组,返回true和false[1,2,3].includes(2);//真[1,2,3].包括(4);//falselflat(),flatMap()flat()flat()可以将嵌套数组“扁平化”成一维数组[1,2,[3,4]].flat();//[1,2,3,4]flat()的参数表示需要展平的层数。这里嵌套了3层数组,压平了3层[1,2,[3,[4,5,[6,7]]].flat(3);//[1,2,3,4,5,6,7]Infinity是深度扁平化,无论嵌套多少层,都会转化为一维数组[1,2,[3,[4,5,[6,7]]]].flat(Infinity);//[1,2,3,4,5,6,7]flatMap()相当于map函数,遍历数组中的每一项,在不影响原数组的情况下返回一个新数组[1,2,3].flatMap(el=>el+1);//[2,3,4]at()at()参数是数组的正数,从数组头部索引0开始,负数从数组尾部索引-1开始,-1表示tail[1,2,3,4,5].at(2)中的数组首值;//3[1,2,3,4,5].at(-2);//4'你好世界'.at(2);//l'你好世界'.at(-3);//r超出范围返回undefined[1,2,3,4,5].at(-20);//未定义[1,2,3,4,5].at(20);//undefinedtoReversed()、toSorted()、toSpliced()、with()普通的数组方法会影响原数组,例如:push()、pop()、shift()、unshift()现在有提议即在对数组进行操作时,原数组不会受到影响,返回的原数组有四个副本:toReversed()、toSorted()、toSpliced()、with()这四个方法对应于原数组的方法数组,用法完全一样,只是不会改变原来的数组,返回一个新的数组。原数组方法和新数组方法reverse()toReversed()sort()toSorted()splice()toSplied()splice(index,1,value)with(index,value)group(),groupToMap()group()分组函数,可以对原数组进行分组,返回分组后的对象,相当于给限定的数组成员名groupletgr=[1,2,3,4,5]letg=gr.group(el=>el>3?'更大':'更少')console.log(g);//{更大:[4,5],更少:[1,2,3]}groupToMap()点group函数相当于map函数,在不影响原数组的情况下,遍历数组的每一项,返回一个新的数组。数组的空位是指数组的某个位置没有值。控制台日志(数组(3));//[emptyx3]is[,,,]需要注意的是,空格不是undefined,某个位置的值等于undefined,它其实是有值的,空格没有值,在运营商中可以直观地看到这一点。console.log(0in[undefined,undefined,undefined]);//trueconsole.log(0in[,,,]);//false上面的代码说明第一个数组的第0位有值,ES5方法对第二个数组的第0位没有值的处理与空位的处理不一致,但大多数情况下会空位ignoredforEach(),filter(),reduce(),every(),some()将跳过间隙map()将跳过间隙,但将保留此值join()和toString()将间隙视为未定义,而undefined和null会被处理成空字符串""ES6会把gap转成undefined,ES6方法不会忽略空格console.log(Array.from([1,,3]));//[1,undefined,3]console.log(...[1,,3]);//1,undefined,3entries()、keys()、values()、find()和findIndex()会将空格视为未定义。es6的两个特殊方法//copyWithin()会将空格一起复制console.log([,'a','b',,].copyWithin(2,0));//[,"a",,"a"]//fill会将空格视为正常位置console.log([4,,6].fill(1));//1,1,1js数组空间处理不统一,数组中应避免sort()中有空位sort()排序是数组中一个==很重要==的方法letarr=[2,3,6,4,5,1]//升序console.log(arr.sort((a,b)=>a-b));//[1,2,3,4,5,6]//降序console.log(arr.sort((a,b)=>b-a));//[6,5,4,3,2,1]按条件排序letarr2=[{id:1,name:'name1'},{id:3,name:'name3'},{id:2,name:'name2'},{id:6,name:'name6'},{id:4,name:'name4'},{id:5,name:'name5'}]让=arr2.sort((a,b)=>{returna.id-b.id});console.log(so);//[{id:1,name:'Name1'},{id:2,姓名:'姓名2'},{id:3,姓名:'姓名3'},{id:4,姓名:'姓名4'},{id:5,姓名:'姓名5'},{id:6,name:'name6'}]sort()的详细说明见另一篇文章:sort()排序与多属性数组对象排序(按条件排序)案例源码:https://gitee.com/wang_fan_w/es6-science-institute如果您觉得本文对您有帮助,请点亮star
