分享几种javascript里克隆数组的方法

浅克隆(Shallow copy)

for 循环

const arr = [1,2,3,4]
let arr_clone = []
for(let i in arr){    // 注意这里i不是表示arr里的元素,而是元素对应的序号arr_clone.push(arr[i])
}
const arr = [1,2,3,4]
let arr_clone = []
for(let i = 0; i < arr.length; i++){arr_clone.push(arr[i])
}

while循环

const arr = [1,2,3,4]
let arr_clone = []
let i = 0
while(i < arr.length){arr_clone.push(arr[i])i++
}

扩展运算符

const arr = [1,2,3,4]
let arr_clone = [...arr]

Array.map()

const arr = [1,2,3,4]
const clone = (x) => x
const arr_clone = arr.map(clone)

Array.filter()

const arr = [1,2,3,4]
const clone = () => true
const arr_clone = arr.filter(clone)

Array.slice()

const arr = [1,2,3,4]
const arr_clone = arr.slice()

以上全部都属于浅克隆,简单地说,克隆数组主要存储原数组所引用的对象的地址。当将原数组变量的值赋给新数组时,存储在原数组中的地址被复制到新数组中。这意味着新旧数组变量都指向内存中的同一个对象。因此,如果对象的状态通过任何引用变量改变,则会同时反映在两个引用变量中。

以for为例,浅克隆对一位数组没有影响

const arr = [1,2,3,4]
const arr_clone = []for(let i in arr){arr_clone.push(arr[i])
}console.log("原数组添加5")
arr.push(5)
console.log(arr)
console.log(arr_clone)
console.log()console.log("克隆数组添加6")
arr_clone.push(6)
console.log(arr)
console.log(arr_clone)
console.log()>>>
原数组添加5
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ]克隆数组添加6
[ 1, 2, 3, 4, 5, 6 ]
[ 1, 2, 3, 4, 5, 6 ]

浅克隆对多维数组有影响。当新旧数组push变量时,不会对对方有影响。但是当修改数组里的变量时我们发现,如果修改的是克隆数组,那么原数组也会受影响。同理修改原数组,克隆的也会受影响

const arr_2D = [[1, 2], [3]]
const arr_2D_clone = []for(let i in arr_2D){arr_2D_clone.push(arr_2D[i])
}console.log("克隆2D数组[1]添加4")
arr_2D_clone[1].push(4)
console.log(arr_2D)
console.log(arr_2D_clone)
console.log()console.log("克隆2D数组添加[5]")
arr_2D_clone.push([5])
console.log(arr_2D)
console.log(arr_2D_clone)
console.log()console.log("原2D数组[1]添加6")
arr_2D[1].push(6)
console.log(arr_2D)
console.log(arr_2D_clone)
console.log()console.log("原2D数组添加[7]")
arr_2D.push([7])
console.log(arr_2D)
console.log(arr_2D_clone)>>>
克隆2D数组[1]添加4
[ [ 1, 2 ], [ 3, 4 ] ]
[ [ 1, 2 ], [ 3, 4 ] ]克隆2D数组添加[5]
[ [ 1, 2 ], [ 3, 4 ] ]
[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]原2D数组[1]添加6
[ [ 1, 2 ], [ 3, 4, 6 ] ]
[ [ 1, 2 ], [ 3, 4, 6 ], [ 5 ] ]原2D数组添加[7]
[ [ 1, 2 ], [ 3, 4, 6 ], [ 7 ] ]
[ [ 1, 2 ], [ 3, 4, 6 ], [ 5 ] ]

深克隆(Deep copy)

深克隆 就可以避免上述问题

const arr = [1,2,3,4]
const arr_2D = [[1, 2], [3]]let arr_clone = JSON.parse(JSON.stringify(arr))
let arr_2D_clone = JSON.parse(JSON.stringify(arr_2D))console.log("原数组添加5")
arr.push(5)
console.log(arr)
console.log(arr_clone)
console.log()console.log("克隆数组添加6")
arr_clone.push(6)
console.log(arr)
console.log(arr_clone)
console.log()console.log("克隆2D数组[1]添加4")
arr_2D_clone[1].push(4)
console.log(arr_2D)
console.log(arr_2D_clone)
console.log()console.log("克隆2D数组添加[5]")
arr_2D_clone.push([5])
console.log(arr_2D)
console.log(arr_2D_clone)
console.log()console.log("原2D数组[1]添加6")
arr_2D[1].push(6)
console.log(arr_2D)
console.log(arr_2D_clone)
console.log()console.log("原2D数组添加[7]")
arr_2D.push([7])
console.log(arr_2D)
console.log(arr_2D_clone)>>>
原数组添加5
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4 ]克隆数组添加6
[ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 6 ]克隆2D数组[1]添加4
[ [ 1, 2 ], [ 3 ] ]
[ [ 1, 2 ], [ 3, 4 ] ]克隆2D数组添加[5]
[ [ 1, 2 ], [ 3 ] ]
[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]原2D数组[1]添加6
[ [ 1, 2 ], [ 3, 6 ] ]
[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]原2D数组添加[7]
[ [ 1, 2 ], [ 3, 6 ], [ 7 ] ]
[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]

文章参考:

https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/What is Shallow Copy in JavaScript ? - GeeksforGeeksA Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.https://www.geeksforgeeks.org/what-is-shallow-copy-in-javascript/

【林林js笔记】克隆数组的几种方法以及浅克隆深克隆误区相关推荐

  1. js对象转换为数组的两种方法

    第一种方法: Object.values(obj) 示例: var obj = { name: '小明', age: 22 }; console.log( Object.values(obj) ); ...

  2. js 简单的数组去重13种方法

    js 数组去重 十几种数组去重的方法,有的去重构思可以大致相同. 上篇的几种数组去重 https://blog.csdn.net/weixin_47988564/article/details/106 ...

  3. 【js】创建数组的三种方法

    <html><head></head><script type="text/javascript">//数组var stuName1 ...

  4. JS 中迭代数组的三种方法

    第一种(forEach): const todo = [{id : '1',name : 'zhangsan',age : '20',},{id : '2',name : 'lisis',age : ...

  5. javascript中如何创建数组-与创建数组的几种方法

    javascript中数组的创建方式有3种,我只学了3种,还有没有其他方法我也不知道哈.... 下面我们来看看 js中创建数组的其中一种方法. //先写一种最常规的的创建JS数组的方法 var arr ...

  6. 知识点2:js(javascript)中检测是否为数组的两种方法【翻转数组案例】

    javascript基础知识 文章目录 javascript基础知识 前言 一.翻转数组案例 二.检测数组的两种方法 1.如果传输的参数不是数组 2.instanceof 运算符 可以用来检测是否满足 ...

  7. matlab合并有序数组,《数组合并》JS合并两个数组的3种方法详解

    这篇文章主要介绍了JS合并两个数组的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一个包解决你所有的JS问题,点击获取 需要将两个数组 ...

  8. js合并两个数组的三种方法

    js合并数组的三种方法 前提:两个数组a=[1,2,3,4].b=[5,6,7],将其合并为一个数组 1. concat //js的Array对象提供了一个叫concat()方法,连接两个或更多的数组 ...

  9. js类数组转化为数组的5种方法【附思路】

    arrayLike为要转化的类数组,适合有点基础的小伙伴. 1.扩展运算符...     console.log([...arrayLike]) 2.Array.form     console.lo ...

  10. js刷新页面有哪几种方法

    js刷新页面有哪几种方法 一.总结 一句话总结:location属性的reload方法即可:document.location.reload() 1.页面刷新有哪常见的8种方法? 1,history. ...

最新文章

  1. python那么慢为什么还有人用-为什么大家都说python编程的效率速度慢呢?
  2. git为私有仓库设置密码_dnf仓库密码设置不跳出 dnf仓库密码设置流程
  3. 3级软件测试试题,软件测试人员(.NET)_3级_操作技能鉴定1.1.3试题单(26页)-原创力文档...
  4. AE一键快速生成MG爆炸图形动画插件:Burst Box for Mac
  5. 类似mysqlhotcopy备份mysql myisam脚本
  6. MyBatis 一级缓存二级缓存详解
  7. IS技术:稳定压倒一切
  8. 浏览器 Cookie 的使用
  9. Google Arcore
  10. 现代三角钢琴音源 Native Instruments The Grandeur 1.2
  11. 无法定位程序输入点于动态链接库上的解决方法分享
  12. 如何免费使用xshell、xftp工具
  13. 如何安全快速的迁移你的系统到固态硬盘
  14. word转freemarker和修改的步骤
  15. nyoj-1273 宣传墙
  16. okdownload下载mp4视频文件
  17. 四旋翼定高篇之惯导加速度+速度+位置三阶互补融合方案
  18. android pm list,Android pm命令
  19. JS下载图片保存在本地
  20. python基础读后感_《python基础教程 》第一章 读书笔记

热门文章

  1. Linux 之十五 Kernel 仓库、Kernel 协作方式、订阅邮件列表、提交 PATCH
  2. 【目标检测】57、Dual Weighting Label Assignment | 专为目标检测设计的双权重标签分配
  3. php选课删除选课成绩统计,高校选修课平时成绩管理系统
  4. 针对于win8、win10无法访问,您可能没有权限使用网络资源的解决方法
  5. pcdmis怎么导出模型_3D游戏模型提取、导入、导出教程
  6. 《Machine Learning in Action》—— hao朋友,快来玩啊,决策树呦
  7. python class类_学习python中的class类
  8. OpenWrt 防火墙基础过滤--域名过滤
  9. android依赖本地工程排除,Android Gradle依赖项排除(Android Gradle dependency exclude)
  10. java gui容器_中国大学MOOC: (GUI容器)容器类java.awt.container的父类是_______。