zoukankan      html  css  js  c++  java
  • JS对象复制(深拷贝、浅拷贝)

    一、浅拷贝

    1、Object.assign(target,source,source...)   

    a、可支持多个对象复制

    b、如果source和target属性相同  source会复制target的属性

    c、target只能为Object对象

    var obj = {a:1,b:2}
    undefined
    Object.assign({c:3},obj)
    {c: 3, a: 1, b: 2}
    obj
    {a: 1, b: 2} 
    兼容性写法if(Object.assign){//兼容}else{//不兼容}

    2、 扩展运算符(spread)

    支持将多个对象复制到一个对象上“

    var obj1 = { foo: "foo" };
    var obj2 = { bar: "bar" };
     
    var copySpread = { ...obj1, ...obj2 }; // Object {foo: "foo", bar: "bar"}
    copySpread 
    {foo: "foo", bar: "bar"}
    var obj = {a:1,b:2,c:3}
    var objs = {...obj}
    objs
    {a: 1, b: 2, c: 3}
    objs.a=10
    10
    objs
    {a: 10, b: 2, c: 3}
    obj
    {a: 1, b: 2, c: 3}

    佛山vi设计https://www.houdianzi.com/fsvi/ 豌豆资源搜索大全https://55wd.com

    二、深拷贝

    1、使用对象序列化 JSON.stringify()和JSON.parse()

    注意: 此方法仅在原对象包含可序列化值类型且没有任何循环引用时才有效。不可序列化值类型的一个例子是 Date 对象 - JSON.parse 只能将其解析为字符串而无法解析回其原始的 Date 对象   或者对象中属性值为function   

    var obj = {a:1,b:[1,2,3],c:{e:3},bool:false}
    undefined
    var objs = JSON.parse(JSON.stringify(obj))
    undefined
    objs
    {a: 1, b: Array(3), c: {…}, bool: false}
    objs.bool = true
    true
    objs
    {a: 1, b: Array(3), c: {…}, bool: true}
    obj
    {a: 1, b: Array(3), c: {…}, bool: false}

    2、使用递归,对对象属性进行判断

    function deepClone(obj) {
      var copy;
     
      // 如果 obj 是 null、undefined 或 不是对象,直接返回 obj
      // Handle the 3 simple types, and null or undefined
      if (null == obj || "object" != typeof obj) return obj;
     
      // Handle Date
      if (obj instanceof Date) {
        copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
      }
     
      // Handle Array
      if (obj instanceof Array) {
        copy = [];
        for (var i = 0, len = obj.length; i < len; i++) {
            copy[i] = clone(obj[i]);
        }
        return copy;
      }
     
      // Handle Function
      if (obj instanceof Function) {
        copy = function() {
          return obj.apply(this, arguments);
        }
        return copy;
      }
     
      // Handle Object
      if (obj instanceof Object) {
          copy = {};
          for (var attr in obj) {
              if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
          }
          return copy;
      }
     
      throw new Error("Unable to copy obj as type isn't supported " + obj.constructor.name);
    }

    3、使用 lodash 

  • 相关阅读:
    rabbitMq交换机direct、topics
    rabbitMq及安装、fanout交换机-分发(发布/订阅)
    rabbitmq
    .sh文件启动 jenkins
    雪花算法、二进制运算
    收银台数据库存储AES加解密
    数据库事物
    excel技巧
    日期计算、正则、sequence、索引、表连接、mybatis
    oracle常用函数介绍
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13847439.html
Copyright © 2011-2022 走看看