美文网首页让前端飞技术干货
怎样拷贝数组(深/浅拷贝)

怎样拷贝数组(深/浅拷贝)

作者: 前端精髓 | 来源:发表于2018-01-07 22:04 被阅读52次

拷贝数组就是把原来数组的每一项保存在一个新数组中,这样在操作数组的同时,另一个数组就不会受影响,因为数组是引用类型的值,所以在拷贝数组的同时并不能直接复制变量值,我们有一下几种方法可以使用。

循环

var ary1 = [1,2,3];

for (var i = 0, ary2 = Array(ary1.length); i < ary1.length; i++) ary2[i] = ary1[i];

slice

var ary1 = [1,2,3];

var ary2 = ary1.slice();

运算符

var ary1 = [1,2,3];

var ary2 = [...ary1];

from

var ary1 = [1,2,3];

var ary2 = Array.from(ary1);

concat

var ary1 = [1,2,3];

var ary2 = [].concat(ary1);

说到深拷贝,比较特殊的就是数组和对象了,所以在编写方法的时候要分别做不同的处理,代码如下:


let ary = [1,[2, {name: "张三"}]];

function copyAry(options) {
    return copy(options)
}

function copy(ary) {
    let newAry = []
    for (const item of ary) {
        let value = item;
        if (Object.prototype.toString.call(value) === "[object Object]") value = copyObj(value);
        if (Object.prototype.toString.call(value) === "[object Array]") value = copyAry(value);
        newAry.push(value);
    }
    return newAry;
}

function copyObj(obj) {
    let newObj = {};
    for (const key in obj) {
        let value = obj[key];
        if (Object.prototype.toString.call(value) === "[object Object]") value = copyObj(value);
        if (Object.prototype.toString.call(value) === "[object Array]") value = copyAry(value);
        newObj[key] = value;
    }
    return newObj;
}

// 测试
let newAry = copyAry(ary);
ary[1][1].name="李四"
console.log(newAry[1][1].name) //张三
console.log(ary[1][1].name) //李四

查看作者源码

相关文章

  • 关于几个拷贝的问题

    数组浅拷贝 数组深拷贝 复合数组深拷贝

  • 浅拷贝与深拷贝

    /*浅拷贝:拷贝地址*/ /*深拷贝:拷贝对象*/ 用Strong修饰不可变数组:浅拷贝 用Copy修饰不可变数组...

  • 浅拷贝和深拷贝

    数组的深拷贝和浅拷贝 浅拷贝:var arr = ["One","Two","Three"]; var arrto...

  • Object 对象

    什么是浅拷贝,如何实现浅拷贝?什么是深拷贝,如何实现深拷贝? 是什么: 浅拷贝: 将原对象或原数组的引用直接赋给新...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

  • 怎样拷贝数组(深/浅拷贝)

    拷贝数组就是把原来数组的每一项保存在一个新数组中,这样在操作数组的同时,另一个数组就不会受影响,因为数组是引用类型...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 放进收藏夹,省下时间睡觉!

    1. 数组去重 2. 深浅拷贝 浅拷贝 深拷贝 假深拷贝 真深拷贝 3. 事件委托 5. 使用push和apply...

  • C++封装(二)

    第2章 对象成员与对象数组 第3章 深拷贝与浅拷贝 浅拷贝: 深拷贝: 第4章 对象指针 对象指针: 栈中: 对象...

  • js深拷贝和浅拷贝区别

    浅拷贝和深拷贝的区别 1.浅拷贝:将源对象或者原数组的引用 ```直接赋给``` 新对象/新数组 ,新对象/新...

网友评论

    本文标题:怎样拷贝数组(深/浅拷贝)

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