es6 assign对象浅拷贝,目标对象属性值没变化?

题目描述

es6 assign对象浅拷贝,目标对象属性值没变化?

题目来源及自己的思路

学习了es6 assign后知道是浅拷贝,但是实践时有个现象很奇怪

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

const obj1 = {a: {b: 1}, c:3};
const obj2 = Object.assign({}, obj1);

obj1.a.b = 2;
obj1.c=8

console.log(obj2); // {a: {b: 2}, c:3}

为什么c的值没有变化?浅拷贝不是拷贝的引用吗?

阅读 2.6k
4 个回答

浅拷贝只克隆第一层的数据,想深度克隆需要自己实现
https://blog.csdn.net/qq_3010...

var deepclone = function(a,b){
    var a = a || {};
    for(var k in b){
        if(b.hasOwnProperty(k))
            a[k] = Object.prototype.toString.call(b[k])=='[object Object]'? 
         deepclone(a[k],b[k]):b[k];
    }
    return a;
}

这感觉你对于浅拷贝的概念理解错误了。
浅拷贝是指拷贝最外面的一层, 所以c的值是一个克隆值, obj1和obj2里面的c指向不一样

assign只拷贝最外面一层,因为a事引用类型,所以拷贝之后值跟着变了,c是值类型,所以值没跟着变。“只拷贝最外面一层”是重点

所以才叫拷贝啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题