美文网首页
对象的浅拷贝

对象的浅拷贝

作者: 默成S | 来源:发表于2018-01-04 22:08 被阅读0次
    var obj = {
      count: 1
    }
    
    function output(obj) {
      obj.count = obj.count + 1;
      console.log(obj.count);
    }
    
    

    在上面代码之后,执行下面代码分别输出什么?

    output(obj);
    console.log(obj.count);
    

    1、假如两个值不一样,为什么?
    2、假如两个值一样,为什么?有没有办法保证output函数内的obj.cout的改变不影响外面的obj.count?


    执行的结果是一样的,因为在使用对象作为函数参数时,实际上传送给函数的是对象的地址,即函数体内的对象和作为参数的原对象实际上是同一个。所以,想要不影响外面的obj,就需要在函数体内定义一个局部的obj对象,并复制外部obj的值。
    本例可实现如下

    var obj = {
    count: 1
    }
    
    function output(obj) {
    var obj = JSON.parse(JSON.stringify(obj));
    obj.count = obj.count + 1;
    console.log(obj.count);
    }
    

    反思:
    对象赋值并不是复制,而是引用、映射。output函数的形参对象变量其实就是实参变量的引用,所有他们是同一个。
    在output函数内为了不影响真正的obj实体,有两种方式。

    function output(obj) {
      obj = Object.assign({}, obj);
      obj.count = obj.count + 1;
      console.log(obj.count);
    }
    
    function output(obj) {
      obj = JSON.parse(JSON.stringify(obj));
      obj.count = obj.count + 1;
      console.log(obj.count);
    }
    

    以上两种方式都是对形参obj对象重新“复制”一份新的对象.

    js中的浅拷贝和深拷贝:https://segmentfault.com/a/1190000008637489

    相关文章

      网友评论

          本文标题:对象的浅拷贝

          本文链接:https://www.haomeiwen.com/subject/akpdnxtx.html