JS浅复制的问题

   var target = {},
      source = {
         name: 'tom',
         list: ['node', 'python']
      };

   target.name = source.name;
   target.list = source.list;

   source.list.push('php');
   console.log(JSON.stringify(target)); // {"name":"tom","list":["node","python","php"]}

   console.log(target.list === source.list); // true => target.list 引用了source.list

   source.list = [1, 2, 3];
   console.log(target.list === source.list); // false target.list 不再引用 source.list

    // **第一个疑问**: 我的理解的是 source 新开了一个栈来存放 [1, 2, 3],这与target.list指向的不是同一个栈 所以才导致上述的结果 是吗?

    // 问题:给一个对象的属性赋值:
    var obj = { name: undefined };
    obj.name = 'tom'; // **第二个疑问**: 这种方式都属性新增一个属性 而不是改变原name属性(准确来说应该是覆盖)

    // **第三个疑问**: 那什么是改变原来的值呢? 像数组的 push 方法 => source.list.push('php');
阅读 2.3k
2 个回答
  1. [1, 2, 3] 是一个数组 也就是一个对象 它是存放在堆里的, source.list = [1,2,3] => 这个属性 指向了另一个对象 其实应该是存了一个指针 指向这个对象

  2. 不是很理解这个问题

  3. sourc.list 会返回原来的数组 [1, 2, 3] 对这个数组进行了push操作, sorce.list = [2, 3, 4]
    如果是这样的话 只是将soure.list的引用 变为 新数组[2, 3, 4] 原来的数组[1, 2, 3]并没有变化

第一个疑问:
ES6 中有六种基本数据类型,除此之外均为对象类型,list: ['node', 'python']['node', 'python'] 是对象, list 作为名字相当于指针,所以应当说,source 一开始与 target.list 是统一指向,然后在堆中开辟了一块新的内存存储 [1, 2, 3],并把 source 指向这块内存。而不是你说的

source 新开了一个栈来存放 [1, 2, 3]

第二个疑问:
跟楼上一样,没懂你的问题。
我的理解就是把原来的值覆盖掉了啊。

第三个疑问:
也没懂你的问题,你所说的改变原来的值是指什么?是说不改指向只改值么?那就是对该对象进行操作就是修改值,对 source.list 重新赋值就是改指向了。

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