语法规则constsomeNumbers={'0':10,'1':15,length:2};Array.from(someNumbers,value=>value*2);//=>[20,30]将类数组对象转换为数组您将遇到的类数组对象是:函数中的arguments关键字,或DOM集合。在下面的示例中,让我们对函数的参数求和functionsumArguments(){returnArray.from(arguments).reduce((sum,num)=>sum+num);}sumArguments(1,2,3);//=>6Array.from()的第一个参数可以是任何可迭代对象,我们继续看一些例子:Array.from('Hey');//=>['H','e','y']Array.from(newSet(['one','two']));//=>['one','two']constmap=newMap();map.set('one',1)map.set('two',2);Array.from(map);//=>[['one',1],['two',2]]浅拷贝数组vararr=[0,[1,1,1],[2,2,2],[3,3,4],]/*vararr2=arrarr2[0]=-1;arr2[1][0]=11;console.log(arr2)所有对arr2的修改都会影响arrconsole.log(arr)*/vararr2=Array.from(arr)arr2[0]=-1;arr2[1][0]=11;//arr2第一层的修改会影响arr吗?嵌套仍然会影响它。这时候我们就需要深拷贝console.log(arr2)console.log(arr)构造一个深拷贝数组函数。可以看到这是最简单的数组深拷贝方式,可以很方便的对数组进行深拷贝,但是有一个缺陷,如果数组嵌套了对象,则不能对对象进行深拷贝functiondeepCloneArray(arr){if(Array.isArray(arr)){returnArray.from(arr,deepCloneArray)//递归入口}else{returnarr}}vararr2=deepCloneArray(arr)arr2[0]=-1;arr2[1][0]=11;arr2[2][0].name=22;console.log(arr2)console.log(arr)填充数组这里,{length}用于创建一个类数组对象,具有length属性,可用于迭代constlength=3;constinit=0;constresult=Array.from({length},()=>init);结果;//=>[0,0,0]fill函数也可以快速填充,但是在用对象填充数组时有局限性//生成一个包含3个空项的数组,然后填充它constresult=Array(3).填充(0);结果;//=>[0,0,0]用对象填充数组constlength=3;constresultA=Array.from({length},()=>({}));constresultB=Array(length).fill({});resultA;//=>[{},{},{}]resultB;//=>[{},{},{}]resultA[0]===resultA[1];//=>falseresultB[0]===resultB[1];//=>数组为真。from返回的resultA使用不同的空对象实例进行初始化。发生这种情况是因为mapFunction,此处()=>({}),每次调用时都会返回一个新对象。fill填充的{}是同一个空对象,对填充对象的修改会反映在同一个堆内存中的数组中。快速去重newSet(array)创建一个包含数组的集合,Set集合将删除重复项。因为Set集合是可迭代的,所以可以使用Array.from()将其转换为新数组。functionunique(array){returnArray.from(newSet(array));}unique([1,1,2,3,3]);//=>[1,2,3]
