美文网首页Vue+Vuex+Electron+ElementUI 开发
JS 拷贝对象、拷贝数组、拷贝复杂对象、拷贝复杂数组(深拷贝,浅

JS 拷贝对象、拷贝数组、拷贝复杂对象、拷贝复杂数组(深拷贝,浅

作者: 望穿秋水小作坊 | 来源:发表于2018-12-13 11:06 被阅读39次

    javascript中的原始值(undefined、null、布尔值、数字和字符串)与对象(包括数组和函数)有着根本区别。

    基本数据类型值不可变,基本数据类型存放在栈中。

    对象(包括数组和函数)数据类型是引用类型,引用类型存放在堆中,栈中只存放地址。

    JS 赋值:

    对于 js 的基本属性,这样的等于是赋值操作,并不会相互改值,不影响。

    let a = 1;    

    let b = a;

    b = 4 ; 

    console.log('a='+a + 'b' = b); // a=1 b=4


    JS 浅拷贝:

    let array1 = [1, 'a', true, null, undefined,{child:hello}];

    slice()方法

    let c1 = array1.slice();

    concat()方法

    let cc1 = array1.concat();

    from()方法

    let fc1 = Array.from(array1);

    push()方法

    let pc1 = [];

    Array.prototype.push.apply(pc1,array1);

    map()方法

    let mc1 = array1.map(function(item){

        return item;

        });

    以上都是现实数组浅拷贝的方法,只能拷贝里面第一层的 js 基本数据类型,对于{child:hello},仅仅只拷贝了地址,所以相互之间还是共享一个对象。改动{child:hello}会相互影响。


    JS 深拷贝:

    方法一:简易 json 转换法。

    let jsonc = JSON.parse(JSON.stringify(array1));

    这种方法可以实现深拷贝,但是这种方法也有它的限制。

    1.数组中的项如果是 undefined,那么转换后将变成 null。

    2.如果数组项为对象,那么对象之间不可相互引用。会造成循环引用,无法 json 序列化

    方法二:使用“Lodash”高性能的 JavaScript 实用工具库。

    import _ from 'lodash';

    let newObj = _.cloneDeep(array1);

    这样就能实现方便的深拷贝。

    码字不易,点个关注呗。😀,持续更新实用的技能技巧。

    相关文章

      网友评论

        本文标题:JS 拷贝对象、拷贝数组、拷贝复杂对象、拷贝复杂数组(深拷贝,浅

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