• 技术文章 >web前端 >js教程

    一文了解JavaScript中合并和克隆对象的方法

    青灯夜游青灯夜游2021-06-04 10:39:53转载198
    本篇文章给大家介绍一下JavaScript中合并和克隆对象的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

    当我们想要复制原始值和引用值(对象)时,它们的行为会大不相同。

    原始值

    我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。

    let name="前端小智";
    let name2= name;
    console.log (name, name2); // 前端小智, 前端小智
    name="王大冶";
    console.log (name,name2); // 王大冶 前端小智

    引用值

    但是,如果我们对引用类型的值进行相同的操作,则我们对一个变量所做的任何更改也将反映在另一个变量中,因为两个变量都指向同一对象。

    数组

    要拷贝数组,slice()方法用于创建数组的新副本。 可以独立修改此副本,而不会影响原始数组。

    如果未传递任何参数,则它会精确复制数组,但数字也可以作为参数传递。 如果仅传递一个数字,它将确定我们要从其进行复制的索引的值,而如果传递两个数字,则将标记开始和结束。

    // 示例1
    const names = ['前端小智', '王大冶', '小力'];
    const names2 = names;
    console.log(names, names2);
    // ["前端小智", "王大冶", "小力"] 
    // ["前端小智", "王大冶", "小力"] 
    
    // 示例2
    names2[2] = '前端小力';
    console.log(names, names2);
    //  ["前端小智", "王大冶", "前端小力"] 
    //  ["前端小智", "王大冶", "前端小力"] 
    
    // 示例3
    const name2 = names.slice();
    names[2] = '我是隔壁老智';
    console.log(name2, names2)
    // ["前端小智", "王大冶", "前端小力"]
    //  ["前端小智", "王大冶", "我是隔壁老智"]

    对象

    当引用值是一个对象时,也会发生同样的情况,对其属性之一的任何修改都会影响这两个变量。 若要克隆对象,请使用 Object.assign() 方法,该方法会将一个或多个源对象的所有可枚举属性的值复制到目标对象,但是此方法仅对对象的一个浅拷贝。

    // 示例1
    const names = {
      name: '前端小智',
      surname: '隔壁老智'
    }
    
    const names2 = names;
    console.log(names, names2) // 打印结果是一模一样的
    
    // 示例2
    names2.surname ='隔壁老王';
    console.log(names, names2)
    
    // {name: "前端小智", surname: "隔壁老王"}
    // {name: "前端小智", surname: "隔壁老王"}
    
    // 示例3
    const names3 = Object.assign({}, names);
    names3.surname = '隔壁老色P';
    console.log(names, names3)
    
    // {name: "前端小智", surname: "隔壁老王"}
    // {name: "前端小智", surname: "隔壁老色P"}

    要对对象进行深拷贝,需要使用其他方法。

    正如我们所说,Object.assign()方法只是一个浅拷贝(即,当我们的对象没有其他对象作为属性时)才有效。 在这些情况下,必须对对象进行深拷贝。

    与浅拷贝不同,深拷贝以递归方式复制每个子对象,直到所有涉及的对象都被复制为止。

    我们可以使用什么方法复制对象的深层副本?

    JSON.parse(JSON.stringify(obj))

    此方法使用JSON.stringify()将对象转换为字符串,然后再用JSON.parse()将其转换回对象。 此方法对简单对象有效,但如果对象属性是函数时无效。

    const names = {
      name: '前端小智',
      surname: '隔壁老智',
      social: {
        wx: '大迁世界',
        url: 'www.lsp.com'
      }
    }
    const names2 = JSON.parse(JSON.stringify(names));
    names2.social.url = 'www.baidu.com';
    console.log(names, names2);
    
    /** 
    {
      name: "前端小智"
      social: {wx: "大迁世界", url: "www.lsp.com"}
      surname: "隔壁老智"
    }
    */
    
    /** 
    {
      name: "前端小智"
      social: {wx: "大迁世界", url: "www.baidu.com"}
      surname: "隔壁老智"
    }
    */

    深度拷贝

    另一种非常有趣和优雅的对象深度复制方法是使用递归函数。

    我们创建了一个deepClone(object)函数,将想要克隆的对象作为参数传递给它。在函数内部,将创建一个局部变量克隆,这是一个空对象,其中将从起始对象克隆的每个属性都将添加到该对象中。

    具体思路:

    function deepClone(object) {
      var clone = {};
      for (var key in object) {
        var value = object[key];
        if (typeof(value) !== 'object') {
          clone[key] = value;
        } else {
          clone[key]=deepClone(value);
        }
      }
      return clone;
    } 
    
    deepClone({value1:1,value2:{value3:2}});
    //{value1:1,value2:{value3:2}}
    deepClone({value1:1,value2:{value3:{value3b:3}}});
    //{value1:1,value2:{value3:{value3b:3}}}

    英文原文地址:https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone-objects

    作者:Luigi Nori

    译者:前端小智

    更多编程相关知识,请访问:编程视频!!

    以上就是一文了解JavaScript中合并和克隆对象的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:javascript 克隆对象
    上一篇:手把手带你弄懂JavaScript中的异步编程 下一篇:浅谈Nodejs如何进行多线程处理
    第16期线上培训班

    相关文章推荐

    • JavaScript中解析parseInt()的怪异行为• 聊聊JavaScript中eval()函数的用法• 浅谈JavaScript中的事件委托• JavaScript中如何更好地使用数组• 深入解析JavaScript中的作用域• 手把手带你弄懂JavaScript中的异步编程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网