数组的拷贝

  > 数组的深拷贝,两层
var arr = [[1,2,3],[4,5,6],[7,8,9]];

var arr2 = [];
循环第一层数组
for(var i=0,len=arr.length;i<len;i++){
  循环第二层数组
for(var k=0,lens=arr[i].length;k<lens;k++){
    把每一个数组的内容添加到数组2中
arr2.push(arr[i][k]);
}
} console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(arr===arr2); //false
  > 数组的浅拷贝,一层
var arr = [1,2,3,4,5,6,7,8];
var arr2 = [];
for(var i=0,len=arr.length;i<len;i++){
arr2.push(arr[i]);
} console.log(arr2);
console.log(arr===arr2);
  > 数组的深拷贝,三层
    var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11];
var arr2 = [];
// 第一层循环
for(var i=0,len=arr.length;i<len;i++){

     // 如果第一层不是数组则直接拷贝到数组2中
     if(typeof arr[i]!=="object"){
       arr2.push(arr[i]);
     }

// 第二层
for(var k=0,len1=arr[i].length;k<len1;k++){
// 判断第二层是否是数组,这里简单的判断力一下是不是对象,没有做处理。
if(typeof arr[i][k]==="object"){
// 如果是数组,继续循环此数组。
for(var j=0,len2=arr[i][k].length;j<len2;j++){
arr2.push(arr[i][k][j]);
}
}else{
// 不是数组就按照正常情况执行。
arr2.push(arr[i][k]);
} }
} console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 9,10,11]
console.log(arr===arr2); //false
  > 数组的深拷贝,无限层,正则版 1.0
    var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11,12,13,[14,[15,16,17,[18,[19,[20]]]]]];
var arr2 = [];
// 先把数组转换成字符串,然后将字符串里面的[]删除
var str = arr.toString().replace(/\[|\]/,"");
console.log(str); //1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 // 将字符串转换成数组。
arr2 = str.split(",");
console.log(arr2); //["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"]
console.log(arr===arr2); //false

  // 这样做的话简单了不少,而且扩展性比较强,但是现在出现了个bug,就是我们原本数组里面的是数字,现在变成了字符串,下面我们来解决一下这个问题。

  > 数组的深拷贝,无限层,正则版 2.0
    var arr = [[1,2,3,[4,5]],[[6,7,8,9]],10,11,12,13,[14,[15,16,17,[18,[19,[20]]]]],"a"];
var arr2 = [];
// 先把数组转换成字符串,然后将字符串里面的[]删除
var str = arr.toString().replace(/\[|\]/,"");
console.log(str); //1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 // 将字符串转换成数组。
arr2 = str.split(",");
for(var i=0,len=arr2.length;i<len;i++){
// 判断是否可以转换成数字,如果可以则转换,否则不转换。
arr2[i] = parseFloat(arr2[i])||arr2[i]; }
console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, "a"]
console.log(arr===arr2); //false

  虽然这里解决了上面的问题,但实际上还是有些问题的,就是如果arr1里面的数字原本就是字符串那么这个就有问题了,因为这个我们设置的是只要它可以转换成数字都将被转换。如果要解决这个问题的话,我们在将数组转换成字符串之前就要进行判断里面的内容是数字还是字符串,但是如果这样的话,我们用正则的方式将会变的非常麻烦,因为技术有限,只能解决到这里,如果你有好的方法,还请告知一下。

对象的克隆和数组的克隆差不多,这里就不再说了,另外以前还写了一篇关于克隆方面的文章,有兴趣的话可以参考一下。

JS基础回顾,小练习(克隆对象,数组)

JS中实现数组和对象的深拷贝和浅拷贝的更多相关文章

  1. JS中遍历数组、对象的方式

    1.标准的for循环遍历数组 //不打印自定义属性和继承属性 var array = [1,2,3]; for (var i = 0; i < array.length; i++) { cons ...

  2. js 中数组或者对象的深拷贝和浅拷贝

    浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变! 深拷贝:就是重新复制一块内存,这样就不会互相影响. 有些时候我们定义 ...

  3. JS 数组以及对象的深拷贝总结

    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法 前言 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示:  如上,arr的修改,会影响arr2的值,这 ...

  4. javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

    前言 for,slice(0),concact() 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示:  如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不 ...

  5. JS 数组、对象的深拷贝

    博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单的数字.字符串可以通过 = 赋值拷贝 但是对于数组.对象.对象数组的拷贝,就有浅拷贝和深拷贝之分 浅拷贝就是当 ...

  6. JS中,JSON 和 对象互转,数组和字符串的转换?

    JSON 与 J对象转化 要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法: 如下: var json = JSON.stringify({a: 'Hello', b ...

  7. JS中的数组复制问题

    JS中的数组复制问题 前言 首先提到复制,也就是拷贝问题,就必须要明确浅拷贝和深拷贝. 浅拷贝:B由A复制而来,改变B的内容,A也改变 深拷贝:B由A复制而来,改变B的内容,A的内容不会改变 总的来说 ...

  8. JS中Array数组的三大属性用法

    原文:JS中Array数组的三大属性用法 Array数组主要有3大属性,它们分别是length属性.prototype属性和constructor属性. JS操作Array数组的方法及属性 本文总结了 ...

  9. JS中的内置对象简介与简单的属性方法

    JS中的数组: 1.数组的概念: 数组是在内存中连续存储的多个有序元素的结构,元素的顺序称为下标,通过下标查找对应元素 2.数组的声明: ①通过字面量声明var arr1 = [,,,,] JS中同一 ...

随机推荐

  1. zmq中zmq_poll()函数介绍

    功能: 查看指定的多个socket上哪些socket发生了指定的事件, 事件有: ZMQ_POLLIN: 有消息到来 ZMQ_POLLOUT: 当前无阻塞可以发送消息 ZMQ_POLLERR: 只对标 ...

  2. C++内存对齐的理解

    程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式. 编译器中提供了#pragma pack(n)来设 ...

  3. ansible 自动化(2)

    模块介绍: copy模块 使用copy模块,可以将本地文件一键复制到远程服务器:-a后跟上参数,参数中指定本地文件和远端路径: [root@ZABBIX ~]# ansible glq -m copy ...

  4. C++容器之Vector

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说vect ...

  5. Xamarin.Android之MvvmCross

    欢迎大家加入以下开源社区 Xamarin-Cn:https://github.com/Xamarin-Cn Mvvmcross-Cn:https://github.com/Mvvmcross-Cn  ...

  6. 设计模式之美:Iterator(迭代器)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...

  7. kali linux Python开发环境初始化

    kali linux Python 黑客编程1 开发环境初始化 为什么要选择Python? Python作为目前Linux系统下最流行的编程语言之一,对于安全工作者的作用可以和C++相提并论.Pyth ...

  8. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  9. video.js html5 视频播放器

    我个人感觉很不错 https://github.com/videojs/video.js <head> <title>Video.js | HTML5 Video Player ...

  10. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras

    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras 最近得到一些Unity官方视频教程,一看全是纯英文的讲解,没有任何字幕或者 ...