猿问

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');


白板的微信
浏览 432回答 1
1回答

烙印99

[1, 2, 3] 是一个数组 也就是一个对象 它是存放在堆里的, source.list = [1,2,3] => 这个属性 指向了另一个对象 其实应该是存了一个指针 指向这个对象不是很理解这个问题sourc.list 会返回原来的数组 [1, 2, 3] 对这个数组进行了push操作, sorce.list = [2, 3, 4]如果是这样的话 只是将soure.list的引用 变为 新数组[2, 3, 4] 原来的数组[1, 2, 3]并没有变化
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答