Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用ES5JavaScript进行深度复制?_Javascript - Fatal编程技术网

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

是否可以使用ES5JavaScript进行深度复制?,javascript,Javascript,是否可以使用ES5JavaScript进行深度复制 我目前面临的问题是,嵌套深度超过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]

是否可以使用ES5JavaScript进行深度复制

我目前面临的问题是,嵌套深度超过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
最后一个更改了
a
b
对象中
c
的值。
c
属性似乎是引用类型


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

您正在克隆嵌套对象,但随后用原始对象再次覆盖它们:

if(typeof obj[prop] === 'object') {
    newObj[prop] = clone(obj[prop]);
}
newObj[prop] = obj[prop]

请尝试以下方法:

if(typeof obj[prop] === 'object') {
    newObj[prop] = clone(obj[prop]);
} else {
    newObj[prop] = obj[prop]
}

你可以通过串接然后解析来使用可怜人的深层克隆:

功能克隆(obj){
返回JSON.parse(JSON.stringify(obj));
};
常数a={a:1,b:{c:2};
常数b=克隆(a);
a、 a=10;
console.log(b.a==a.a);//假的
console.log(a.b=10);
console.log(b.b==10);//假的
console.log(a.b.c=10);
console.log(a.b.c==b.b.c);//使用ES5时为true

var a=JSON.parse(JSON.stringify(b))

使用ES6

变量a=对象分配(b)

使用下划线/Lodash

变量a=u0.map(b,0.clone)


注意:别忘了这不会复制
函数
RegExp
,而且这是非常慢的。注意,非常慢总是相对的。天哪。这是漫长的一天!但谢谢你发现了这一点。作品