当前位置: 首页 > 科技观察

14JS复制数组的小技巧

时间:2023-03-13 20:35:06 科技观察

数组复制经常被误解,不是因为复制过程本身,而是因为缺乏对JS如何处理数组及其元素的理解。JS中的数组是可变的,也就是说数组创建后可以修改数组的内容。这意味着要复制一个数组,我们不能简单地将旧数组分配给一个新变量,它也是一个数组。如果这样做,它们将共享相同的引用,并且在更改一个变量后,另一个变量也会受到更改的影响。这就是为什么我们需要克隆这个数组。我本人是一个从事多年开发的老web前端程序员。目前正在辞职做自己的web前端私人定制课程。今年年初,我花了一个月的时间整理了一个最适合2019年学习的web前端学习干货,各种框架整理出来送给每一位前端小伙伴。想要获取的可以关注我的头条号,后台私信我:前端,即可免费获取。让我们来看看复制和克隆数组的一些有趣的方法和技巧。Tip1-使用`Array.slice`方法constnumbers=[1,2,3,4,5]constcopy=numbers.slice()copy.push(6)//添加新项证明原数组不会待修改控制台。log(copy)console.log(numbers)//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧2-使用`Array.map`methodconstnumbers=[1,2,3,4,5]constcopy=numbers.map(num=>num)copy.push(6)//添加新项证明原数组不会被修改console.log(复制);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧3-使用`Array.from`方法constnumbers=[1,2,3,4,5];constcopy=Array.from(newSet(numbers));copy.push(6);//添加新项证明原数组不会被修改console.log(复制);console.log(numbers);//Output//[1,2,3,4,5,6]//[1,2,3,4,5]技巧4-使用展开运算符constnumbers=[1,2,3,4,5];constcopy=[...numbers];copy.push(6);//新增一项证明不会修改原数组console.log(copy);console.log(numbers);//Output//[1,2,3,4,5,6]//[1,2,3,4,5]技巧5-使用`Array.of`方法与传播operatorconstnumbers=[1,2,3,4,5];constcopy=Array.of(...numbers);copy.push(6);//添加新项证明原数组不会被修改控制台.log(复制);控制台。log(numbers);//output//[1,2,3,4,5,6]//[1,2,3,4,5]Array.of()方法创建了一个数组,其中的数字是可变的ofparameters一个新的数组实例,无论参数的数量或类型如何。Array.of()和Array构造函数之间的区别在于对整数参数的处理:Array.of(7)创建一个包含单个元素7的数组,而Array(7)创建一个长度为7的空数组(注意:this指有7个空位的数组(empty),不是7个undefined组成的数组。Array.of(7);//[7]Array.of(1,2,3);//[1,2,3]Array(7);//[,,,,,,]Array(1,2,3);//[1,2,3]技巧6-使用数组构造函数和展开运算符constnumbers=[1,2,3,4,5];constcopy=newArray(...numbers);copy.push(6);//添加新项,证明原数组不会被修改console.log(copy);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧7-使用解构constnumbers=[1,2,3,4,5];const[...copy]=numbers;copy.push(6);//添加新项,证明原数组不会被修改console.log(copy);控制台日志(数字);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧8-使用Array.concat方法constnumbers=[1,2,3,4,5];constcopy=numbers.concat();copy.push(6);//添加新项以证明原数组不会被修改console.log(copy);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧9-使用`Array.push`方法thespreadoperatorconstnumbers=[1,2,3,4,5];letcopy=[];copy.push(...numbers);copy.push(6);//添加新项证明原数组不会被修改console.log(copy);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧10-使用`Array.unshift`方法thespreadoperatorconstnumbers=[1,2,3,4,5];letcopy=[];copy.unshift(...numbers);copy.push(6);//增加一个新项证明原数组不会被修改console.log(copy);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧11-使用`Array.forEach`方法和扩展运算符constnumbers=[1,2,3,4,5];letcopy=[];numbers.forEach((value)=>copy.push(value));copy.push(6);//添加新项证明原数组不会被修改console.log(copy);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧12-使用`for`循环constnumbers=[1,2,3,4,5];letcopy=[];for(leti=0;i{acc.push(x);returnacc;},[]);copy.push(6);//增加新项,证明原数组不会被修改console.log(copy);console.log(numbers);//输出//[1,2,3,4,5,6]//[1,2,3,4,5]技巧14-使用旧的`apply`方法constnumbers=[1,2,3,4,5];letcopy=[];Array.prototype.push.apply(copy,numbers);copy.push(6);//新增一项证明不会被修改原数组console.log(copy);console.log(numbers);//代码部署后输出//[1,2,3,4,5,6]//[1,2,3,4,5]可能的bug无法实时获知.之后为了解决这些bug,花费了大量的时间在日志调试上。这里顺便给大家推荐一个好用的BUG监控工具,Fundebug原文:https://twitter.com/protic_milos总结请注意,以上方法执行的是浅拷贝,即当数组为元素或对象时,我们改变对象的值,其他的也会随之改变,如技巧4,如果我们的数组元素是对象,如下图:constauthors=[{name:'前端小智',age:25},{name:'王大爷',age:30},]constcopy=[...authors]copy[0].name='改头换面的小智'console.log(copy)console.log(authors)输出所以上面的技巧适用于简单的数据结构,复杂的结构应该使用深拷贝。数组复制经常被误解,不是因为复制过程本身,而是因为缺乏对JS如何处理数组及其元素的理解。好了,分享就到这里。