精华内容
下载资源
问答
  • 数组的深拷贝

    2018-10-13 10:47:00
    slice 方法实现数组的深拷贝 这个代码实现非常简单。原理也比较好理解,他是将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝。代码如下: var arr = [1,2,3,4,5] var ...
    slice 方法实现数组的深拷贝
    
    这个代码实现非常简单。原理也比较好理解,他是将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝。代码如下:
    
    var arr = [1,2,3,4,5]
    var arr2 = arr.slice(0)
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    --------------------- 
    作者:FungLeo 
    来源:CSDN 
    原文:https://blog.csdn.net/fungleo/article/details/54931379?utm_source=copy 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

    转载于:https://www.cnblogs.com/loveMis/p/9782150.html

    展开全文
  • 数组的深拷贝和浅拷贝数组的浅拷贝数组的深拷贝对象的浅拷贝对象的深拷贝 数组的浅拷贝 var arr1 = [1,2,3,4]; var arr2 = arr1; arr2[2] = 'fqniu'; console.log(arr1); // [1, 2, "fqniu", 4] console.log...

    数组的浅拷贝

       var arr1 = [1,2,3,4];
       var arr2 = arr1;
       arr2[2] = 'fqniu';
       console.log(arr1); // [1, 2, "fqniu", 4]
       console.log(arr2); // [1, 2, "fqniu", 4]
    

    数组的深拷贝

    以slice方法为例

     var arr1 = [1, 2, 3, 4];
     var arr2 = arr1.slice(0); //从0开始到末尾截取数组,然后返回一个新的数组
     arr2[2] = 'fqniu';
     console.log(arr1[2]);  // 输出结果为  'fqniu'
     console.log(arr1);  // [1, 2, 3, 4]
     console.log(arr2);  // [1, 2, "fqniu", 4]
    

    当然还有其他方法:concat()、map()

    ES6的扩展运算符

      var arr1 = [1, 2, 3, 4];
      var [...arr2] = arr1; //ES6扩展运算符实现数组的深拷贝
      arr2[0] = 'fqniu';
      console.log(arr1[0]);  // 输出结果为 1
      console.log(arr2[0]);  // 输出结果为'fqniu'
      console.log(arr1);  // [1, 2, 3, 4]
      console.log(arr2);  // ["fqniu", 2, 3, 4]
    

    对象的浅拷贝

    1、直接赋值

    2、Object.assign()

          var obj1 = {
                name:'fqniu',
                age:'26',
                job:{
                    part:'FE',
                    openId:'9527'
                }
            }
            obj2 = Object.assign({}, obj1)
            obj2.name = 'xiaoniuniu'
            obj2.job.part = 'xiaoniuniu'
            console.log(obj1);
            console.log(obj2);
    
      // 注意当对象只有第一层时,是深拷贝
      // 注意当对象有多层时,是浅拷贝
    

    在这里插入图片描述
    3、扩展运算符

            var obj1 = {
                name: 'fqniu',
                age: '26',
                job: {
                    part: 'FE',
                    openId: '9527'
                }
            }
            obj2 = { ...obj1 }
            obj2.name = 'xiaoniuniu'
            obj2.job.part = 'xiaoniuniu'
            console.log(obj1);
            console.log(obj2);
    

    在这里插入图片描述

    对象的深拷贝

    1、JSON.parse(JSON.stringify())

    缺点:

    1、拷贝的对象的值中如果有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失;
    2、无法拷贝不可枚举的属性,无法拷贝对象的原型链;
    3、拷贝Date引用类型会变成字符串;
    4、拷贝RegExp引用类型会变成空对象;
    5、对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null;
    6、无法拷贝对象的循环应用(即obj[key] = obj);

    2、递归

        var obj1 = {
            name: 'fqniu',
            age: '26',
            job: {
                part: 'FE',
                openId: '9527'
            }
        };
        function deepClone(obj) {
            var cloneObj = {}; //在堆内存中新建一个对象
            for (var key in obj) { //遍历参数的键
                if (typeof obj[key] === 'object') {
                    cloneObj[key] = deepClone(obj[key]) //值是对象就再次调用函数
                } else {
                    cloneObj[key] = obj[key] //基本类型直接复制值
                }
            }
            return cloneObj
        }
        var obj2 = deepClone(obj1);
        obj2.job.part = 'UI';
        console.log(obj1);
        console.log(obj2);
    

    在这里插入图片描述

    注意:实现深拷贝。但是当遇到两个互相引用的对象,会出现死循环的情况。
    为了避免相互引用的对象导致死循环的情况,则应该在遍历的时候判断是否相互引用对象,如果是则退出循环。

        function deepCopy(original, result) {
            var result = result || {};
            for (var i in original) {
                var prop = original[i];  // 避免相互引用对象导致死循环
                if (typeof prop === 'object') {
                    //要考虑深拷贝问题
                    if (prop.constructor === Array) {
                        //数组
                        result[i] = [];
                    } else {
                        //对象
                        result[i] = {};
                    }
                    deepCopy(prop, result[i]);
                } else {
                    result[i] = prop;  //一般数据的直接拷贝
                }
            }
            return result;
        }
    
    展开全文
  • ES6 对象数组的深拷贝

    2020-04-02 13:40:15
    对于数组的深拷贝,习惯性的使用 […arr] 建立新地址,偶然间对某份对象数组数据进行同样的深拷贝时,发现修改新数组内部对象的元素依旧会影响到原数组对象 例如 let a = [ { name: "小李" } ]; let b = [...a]; b...

    对于数组的深拷贝,习惯性的使用 […arr] 建立新地址,偶然间对某份对象数组数据进行同样的深拷贝时,发现修改新数组内部对象的元素依旧会影响到原数组对象

    例如

    let a = [
    	{ name: "小李" }
    ];
    let b = [...a];
    b[0].name = "小张";
    console.log(a[0].name);
    // 输出结果为"小张"
    

    所以对于对象数组的整体深拷贝,其内部对象则依旧为浅拷贝

    接下来你就应该知道该怎么做了:

    let b = [...a.map(aInfo => {
    	return Object.assign({}, aInfo)
    })]
    b[0].name = "小张";
    console.log(a[0].name);
    // 输出结果为"小李"
    
    展开全文
  • 目录一、深拷贝与浅拷贝解析浅拷贝深拷贝二、数组拷贝方式1.for循环来拷贝2.System.arraycopy( )拷贝3.Arrays.copyOf( )拷贝4.clone( )拷贝5.解释三、四种拷贝方式效率比较1. System.arraycopy( )2.Arrays.copyOf...
  • 对象数组的深拷贝

    2019-06-10 14:44:00
    var obj=[ {a:1,b:2}, {a:3,b:4} ]; //深拷贝 var copy = obj.map(o => ({...o}));   很多人会用  ...这种方法来处理对象数组的深拷贝,但是这种方法有很大的缺陷。 JSON.string...

     

     

    var obj=[
    	{a:1,b:2},
    	{a:3,b:4}
    ];
    //深拷贝
    var copy = obj.map(o => ({...o}));  
    

     很多人会用 

    var copy=JSON.parse(JSON.stringify(obj));  

    这种方法来处理对象数组的深拷贝,但是这种方法有很大的缺陷。

    JSON.stringify() 将编码 JSON 支持的值。包含 Boolean,Number,String,以及对象,数组。其他任何内容都将被特殊处理。

    处理undefinedFunctionSymbol 时,它被忽略掉
    InfinityNaN 会被变成 null
    Date 对象会被转化为 String (默认调用date.toISOString())

     

    转载于:https://www.cnblogs.com/wangyunhui/p/10997555.html

    展开全文
  • 一、什么是浅拷贝  在js当中,我们常常遇到数组复制的的情况,...然而,正如上面代码所示,一旦对数组a做出修改,实际上会影响拷贝出来的其他数组,这并不是我们所想要的结果,因此就必须用到数组的深拷贝来解决这个问
  • js对象数组的深拷贝 前言 在javascript 以及 其他的很多编程语言中,对象与数组的赋值往往是引用类型的赋值,若a和b是两个对象,则赋值语句a=b,仅仅是把a “指向” 了 b,而不是把a原本的对象变为了b对象。这种赋值...
  • 复制一个数组内容且两个数组相互独立,原有一个数组A,现在要新建一个数组B,数组B默认等于数组A...使用for循环、forEach()、slice()、concat()、map()、Array.from()、Array.of()、扩展运算符等方式实现数组的深拷贝
  • 最近写js 。 发现对数组拷贝 是一个知识点。 写点。 关键词: js对一维数组拷贝,二维数组拷贝,三维。多维呢? js 中多维数组的深拷贝的多种实现方式 这是直接必应到的。
  • 关于vue数组的深拷贝问题 试了很多网上的concat方法,splic方法等都无效,下面这种方式有效 copyArray(arr){ return JSON.parse(JSON.stringify(arr)); },
  • javascript中数组的深拷贝的方法 一、什么是浅拷贝  在js当中,我们常常遇到数组复制的的情况,许多人一般都会使用“=”来直接把一个数组赋值给一个变量,如 1 var a=[1,2,3]; 2 var b=a; 3 console.log(b); //...
  • JS如何实现多层对象或数组的深拷贝 在js中我们时常要实现数据的克隆,也是我们这里所要谈到到的拷贝。数据的拷贝分为浅拷贝和深拷贝。 浅拷贝:拷贝的只是在对中存放的对象或者数组的指针,对拷贝后的数据进行修改时...
  • 如何实现数组的深拷贝和浅拷贝 目录 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论 1.背景介绍 在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份. ...
  • Java对象的clone()以及对二维数组的深拷贝 最近踩了 Object.clone()的大坑,发现了拷贝的一些机制。 有关clone()方法以及实现对象的深克隆,参考: Java对象clone()方法 对二维数组实现深拷贝: ​ //克隆 this.arr ...
  • js 二维数组的深拷贝

    2016-05-11 18:56:22
    二维数组的深拷贝,下记共同函数调用//二维数组深拷贝function deepcopy(obj) { var out = [],i = 0,len = obj.length; for (; i < len; i++) { if (obj[i] instanceof Array){ out[i] = deepcopy(obj...
  • 实现JS数组的深拷贝

    2016-04-24 13:23:40
    实现JS数组的深拷贝 最近在网上看到一篇关于js数组复制最有效的方法是直接使用slice和concat方法。这2个方法的确是最快的把数组成功复制,而不是引用。可以运行实例: <!-- var arr1=["1","2","3"],arr2; arr2...
  • 通常我们对数组、对象、对象数组进行简单赋值运算只是创建...一、数组的深拷贝 方法1:遍历复制 var arr = ["a", "b"], arrCopy = []; for (var item in arr){ arrCopy[item] = arr[item];...
  • JS实现数组的深拷贝

    2021-01-03 16:12:51
    实现数组(一维数组)深拷贝有两种比较常用的方法,一种是使用concat()方法,另一种方式是使用...在这里可以利用这一特性,来实现js的深拷贝 res.push(queue.concat()); slice()方法 slice() 方法可提取字符串的某
  • js数组的深拷贝

    2019-04-21 01:28:33
    NULL 博文链接:https://13521308103.iteye.com/blog/1922763
  • js 数组的深拷贝

    2021-03-31 21:40:32
    1.Array.from() 2.slice() ...// 的拷贝仅仅拷贝了内存地址,并没有给予新内存地址进行保存 // 比如: var newArr = oldArr.slice() oldArr[0] = 10 console.log(oldArr[0]) // 10 console.log(ne
  • 1、对于普通数组数组元素为数字或者字符串),深拷贝很简单,拷贝之后两个数组指针指向存储地址不同,从而完成深拷贝var _test = [1,2,3];//原数组var _testCopy = [].concat(_test);//拷贝数组_testCopy[0]=4;...
  • 深拷贝和浅拷贝是只针对Object和Array这样引用数据类型。 问题: 以下四种拷贝方式中,哪一种拷贝方式速度最快? 答:System.arraycopy,在源码当中我们可以看到,其被native所修饰,底层由c/c++所实...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,753
精华内容 1,101
关键字:

数组的深拷贝