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

发布于 2022-09-15 10:46:16 字数 1574 浏览 188 评论 0

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

循环

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) //李四

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文