首页 > 其他分享 >深拷贝的几种方法

深拷贝的几种方法

时间:2022-10-26 09:00:31浏览次数:34  
标签:obj log newFoo 几种 数组 console 拷贝 foo 方法

一:递归调用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const Copy = (obj) => {
            if (obj === null && typeof obj !== "object") {
                return obj;
            }
            if (Object.prototype.toString.call(obj) === "[object Date]") {
                return new Date(obj);
            }
            if (Object.prototype.toString.call(obj) === "[object RegExp]") {
                return new RegExp(obj);
            }
            if (Object.prototype.toString.call(obj) === "[object Undefined]") {
                return new Error(obj);
            }
            // 判断对象是类
            let newObj = Array.isArray(obj) ? [] : {}
            for (let item in obj) {
                if (typeof obj[item] === 'object') {
                    newObj[item] = Copy(obj[item])
                } else {
                    newObj[item] = obj[item]
                }
            }
            return newObj
        };

        const foo = {
            name: "rose",
            age: 9,
            job: {
                salary: 30,
            }
        }
        const newFoo = Copy(foo)
        console.log("新数组",newFoo)
        newFoo.job.salary = 100
        console.log("修改后的新数组",newFoo)
        console.log("老数组:",foo,"新数组",newFoo)

    </script>
</body>

</html>

 

二:Js自带的函数structuredClone

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const foo = {
            name: "rose",
            age: 9,
            job: {
                salary: 30,
            }
        }
        const newFoo = structuredClone(foo)
        console.log("刚刚拷贝出来的新数组",newFoo)
        newFoo.job.salary =1000
        console.log("老数组:",foo) 
        console.log("修改后的新数组:",newFoo) 
    </script>
</body>

</html>

 

三:第三方插件用Loadsh(cloneDeep)

const _ = require('lodash')
var foo = {
    name: "rose",
    age: 99,
    job: {
      salary: 30,
    }
}
//用lodash实现深拷贝
var newFoo = _.cloneDeep(foo);
console.log("刚刚拷贝出来的新数组",newFoo)
//修改
newFoo.job.salary = 100

console.log("老数组:",foo) 
console.log("修改后的新数组:",newFoo) 

 

标签:obj,log,newFoo,几种,数组,console,拷贝,foo,方法
From: https://www.cnblogs.com/zsbb/p/16827096.html

相关文章

  • TLS1.0的加密方式升级成TSL 1.2的方法
    Theconnectionusedtoloadresourcesfromhttps://www.xxx.netusedTLS1.0orTLS1.1,whicharedeprecatedandwillbedisabledinthefuture.Oncedisabled......
  • 2 方法、数组、IDEA使用、面向对象
    五、方法1.方法定义和调用2.方法重载OverLoad六、数组1.数组的三种初始化方式:静态、动态、默认2.Arrays工具类3.二维数组七、IDEA介绍1.IDEA常用设置2.IDEA常用快......
  • 初识设计模式 - 模板方法模式
    简介在模板方法设计模式(TemplateMethodDesignPattern)中比较重要的两个概念是基本方法和模板方法。实现具体逻辑步骤的方法可以称之为基本方法,而把基本方法汇总起来......
  • ES6中好用的方法
    1、关于扁平化数组constdeps={'A组':[1,2,3],'B组':[5,8,12],'C组':[5,14,79],'D组':[3,64,105],}letmember=Object.values(deps).flat(Infinity);其中使......
  • 关于eclipse创建的Dynamic Web Project项目中没有web.xml文件的解决方法
    到目前为止我得到了两种解决DynamicWebProject项目中没有web.xml文件的方法第一种是重新建立项目,在创建DynamicWebProject项目的时候不要马上点finish先点next,点到出......
  • 齐博x1模块后期要加参数的方法
    频道或插件在后期如果要追加参数的话,可以叫用户在后台开发者设置那里手工添加,也可以程序那里强制添加.大家可以参考评论模块的\plugins\comment\admin\Setting.php$th......
  • Day4:Python基础:元祖方法一
    1、元祖打印Tu=(1,2,3,'Alex',[2,3,4,'taibai'],'egon')print(Tu[3])2、元祖字符转大写Tu=(1,2,3,'Alex',[2,3,4,'taibai'],'egon')Tu[4][3]=Tu[4][3].upp......
  • this关键字除了在实例方法中,也可以使用在构造方法中
    //this除了可以使用在实例方法中,还可以使用在构造方法中/*需求:1.定义一个日期类,可以表示年月日信息2.需求中要求:如果调用无参数构造方法,默认创建的......
  • 【Java[方法调用]】7-2 整数排序(降序)
    输入5个整数,对所有整数进行排序,按照降序输出。输入格式:输入5个整数。输出格式:按照降序输出5个整数。输入样例1:13526输出样例1:65321输入样例2:182......
  • 【Java[方法调用]】7-3 计算函数P(n,x)
    输入一个正整数repeat(0<repeat<10),做repeat次下列运算:输入一个整数n(n>=0)和一个双精度浮点数x,输出函数p(n,x)的值(保留2位小数)。1(n=0)x(n=1)((2n-1)p(n-1,x)-(......