javascript - 是否可以使用 ES5 JavaScript 进行深度复制?

标签 javascript

是否可以使用 ES5 JavaScript 进行深度复制?

我目前遇到的问题是嵌套深度超过 2 层的属性似乎是按引用而不是按值进行复制。

这是我目前实现的复制...

// Clone an object and return the clone
function clone (obj) {
    var newObj = (obj instanceof Array) ? [] : {};
    for (var prop in obj) {
        if(typeof obj[prop] === 'object') {
            newObj[prop] = clone(obj[prop]);
        }
        newObj[prop] = obj[prop]
    }
    return newObj;
};

下面是用于测试的代码:

const a = { a: 1, b: { c: 2 }};
const b = clone(a);

a.a = 10;
b.a == a.a; // false

a.b = 10;
b.b == 10; // false

a.b.c = 10;
a.b.c == b.b.c; // true

最后一个更改了 ab 对象中 c 的值。 c 属性似乎是引用类型。

如何确保所有值都是按值复制而不是引用?

最佳答案

你总是可以通过字符串化然后解析来使用穷人的深度克隆:

function clone (obj) {
    return JSON.parse(JSON.stringify(obj));
};

const a = { a: 1, b: { c: 2 }};
const b = clone(a);

a.a = 10;
console.log(b.a == a.a); // false

console.log(a.b = 10);
console.log(b.b == 10); // false

console.log(a.b.c = 10);
console.log(a.b.c == b.b.c); // true

使用 stringify/parse 不会复制函数和 RegExp,因此是“可怜的人”。更好的选择是使用模块,例如 clone可以克隆一切。

关于javascript - 是否可以使用 ES5 JavaScript 进行深度复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46676378/

相关文章:

javascript - 如何使用 npm 导入 bootstrap 5 bundle js?

JavaScript全屏无法滚动

javascript - 当点击事件发生时查找哪个div被点击

javascript - 获取元素内的选中复选框

javascript - 嵌套 Redux Reducer 中的解构操作

javascript - 有人可以帮我理解这段代码吗?

javascript - 对齐 Material-UI 表中的 TableHeader 和 TableBody 数据

javascript - 我如何制作幻灯片,即加载开始时和悬停时停止

javascript - 为什么我在 Nuxt 中突然出现未知单词错误?

c# - 返回要使用 javascript 打开的文件的 Web 服务。行动!