美文网首页
原生JS中对象的深浅拷贝

原生JS中对象的深浅拷贝

作者: 浪荡小树人 | 来源:发表于2019-08-11 10:29 被阅读0次

在使用原生JS时,我们有时候会遇到要对对象进行拷贝的情况,而对象是基于堆存储的,不能直接进行赋值操作,不然新对象操作的也是旧对象的地址,引出不必要的麻烦,所以我们需要对对象进行拷贝来重新操作。而拷贝时也分为深拷贝和浅拷贝,他们的不同就是是否对对象里面的对象再进行拷贝,这里提供两种原生的方法供大家参考:

第一种:

function extend(o1,deep){

    var obj = {};

    if(o1 instanceof Array){

        obj = [];

    }

    for(var key in o1){

        var value = o1[key];

        //判断是深拷贝还是浅拷贝,浅拷贝的话直接赋值,深拷贝的话判断是否是 引用类型并且不是null

        obj[key] = (!!deep && typeof value === "object" && value !== null) ? extend(value,deep) : value;

    }

    return obj;

}

var obj1 = {

    a : 1,

    b : ["a",{

        c : ["x"]

    }]

}

var obj2 = extend(obj1,true);

obj2.b[1].c.push("y");

console.log("obj1:");

console.log(obj1);

console.log("obj2:");

console.log(obj2);

打印结果如下:

可以看到我们对新对象中的c对象进行操作时不会去改变旧对象中的数据,这种方法中的extend第一个参数是要拷贝的对象,第二个是可传可不传的boolean值,表示是否进行深拷贝,默认是false。

第二种:

var obj3 = {

    a : 1,

    b : ["a",{

        c : ["x"]

    }]

}

var obj4 = JSON.parse(JSON.stringify(obj3));

obj4.b[1].c.push("y");

obj4.b[1].c.push("z");

console.log("obj3:");

console.log(obj3);

console.log("obj4:");

console.log(obj4);

打印结果如下:

可以看到我们对新对象中的c对象进行操作时不会去改变旧对象中的数据,这种方法的原理是用JSON提供的序列化和反序列化来实现的,这种方法不支持里面有函数的情况。

相关文章

  • 原生JS中对象的深浅拷贝

    在使用原生JS时,我们有时候会遇到要对对象进行拷贝的情况,而对象是基于堆存储的,不能直接进行赋值操作,不然新对象操...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • JS文集的目录

    js基础心法 深浅拷贝(递归)深浅拷贝(首层浅拷贝) js 数据处理 数组对象查找的常见操作数组对象去重的常见操作...

  • 详解js中对象的深浅拷贝

    在JavaScript中,对对象进行拷贝的场景比较常见。但是简单的复制语句只能对对象进行浅拷贝,即复制的是一份引用...

  • 重新认识js复杂类型数据的引用和深浅拷贝

    js 基本概念———— 数据类型 js 深浅拷贝之概念 代码实现 —— 数组和对象的j浅拷贝 代码实现 —— 数组...

  • JS实现深拷贝、instanceof、判断是否为数组

    JS深拷贝 JS中拷贝对象可以按照拷贝的程度可以分为浅拷贝和深拷贝,有些时候我们需要拷贝之后的对象和拷贝之前的对象...

  • js对象的深浅拷贝辨析

    在网上浏览了不少关于深浅拷贝的解析,在此,要总结的几点内容大致如下: 基本类型和引用类型 浅拷贝与深拷贝的区别 常...

  • 关于JS对象的深浅拷贝

    JavaScript中的数据类型主要分为基本数据类型和引用数据类型。常见基本数据类型主要有:undefined, ...

  • JS中的深浅拷贝

    这几乎是前端面试的高频问题。 什么是深浅拷贝? 浅拷贝 把对象a的值赋值给b,再修改b.name的值, a.nam...

  • 对象深浅拷贝

    关于对象的深浅拷贝,个人有以下几点见解: 1.深拷贝和浅拷贝只针对像Object, Array这样的引用类型数据。...

网友评论

      本文标题:原生JS中对象的深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/ncujjctx.html