为了账号安全,请及时绑定邮箱和手机立即绑定

JS浅复制的问题

JS浅复制的问题

白板的微信 2018-12-21 15:14:50
   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');
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

  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]并没有变化


查看完整回答
反对 回复 2019-01-18
  • 1 回答
  • 0 关注
  • 431 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信