首页 > 编程语言 >javascript: 复制对象时的深拷贝及浅拷贝(chrome 105.0.5195.125)

javascript: 复制对象时的深拷贝及浅拷贝(chrome 105.0.5195.125)

时间:2022-09-22 22:35:31浏览次数:77  
标签:5195.125 obj1 obj2 console log 对象 javascript 拷贝 name

一,js代码

<html>
<head>
    <meta charset="utf-8"/>
    <title>测试</title>
</head>
<body>
  <button onclick="assign()">无效:变量直接赋值</button><br/><br/><br/>
  <button onclick="assignCopy()">浅拷贝:assign复制对象</button><br/><br/>
  <button onclick="operatorCopy()">浅拷贝:对象展开运算符复制对象</button><br/><br/><br/>
  <button onclick="eachCopy()">深拷贝:遍历属性复制对象</button><br/><br/>
  <button onclick="jsonCopy()">深拷贝:json复制对象</button><br/><br/>
<script>
    //直接赋值复制对象
  function assign() {
        let obj1 = {name:'老刘',age:30,info:{address:'hebei',mobile:'13888888888'}}
        let obj2 = obj1;
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
         obj1.name = '老王测试';
         obj1.info.mobile = '13899999999';
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
        console.log('是否同一个对象:');
        console.log(obj1 === obj2 );
    }

    //Object.assign复制对象
  function assignCopy() {
        let obj1 = {name:'老刘',age:30,info:{address:'hebei',mobile:'13888888888'}}
        var obj2 = Object.assign({}, obj1);
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
         obj1.name = '老王测试';
         obj1.info.mobile = '13899999999';
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
        console.log('是否同一个对象:');
        console.log(obj1 === obj2 );
    }

    //对象展开运算符复制对象
  function operatorCopy() {
        let obj1 = {name:'老刘',age:30,info:{address:'hebei',mobile:'13888888888'}}
        let obj2 = {...obj1};
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
         obj1.name = '老王测试';
         obj1.info.mobile = '13899999999';
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
        console.log('是否同一个对象:');
        console.log(obj1 === obj2 );
    }

    //用json的属性复制对象
      function jsonCopy() {
        let obj1 = {name:'老刘',age:30,info:{address:'hebei',mobile:'13888888888'}}
        let obj2 = JSON.parse(JSON.stringify(obj1));
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
         obj1.name = '老王测试';
         obj1.info.mobile = '13899999999';
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
        console.log('是否同一个对象:');
        console.log(obj1 === obj2 );
    }

    //遍历属性复制对象
    function eachCopy() {
        let obj1 = {name:'老刘',age:30,info:{address:'hebei',mobile:'13888888888'}}
        let obj2 = deepClone(obj1);
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
         obj1.name = '老王测试';
         obj1.info.mobile = '13899999999';
        console.log('obj1:');
        console.log(obj1);
        console.log('obj2:');
        console.log(obj2);
        console.log('是否同一个对象:');
        console.log(obj1 === obj2 );
    }

//函数,遍历对象的属性复制
function deepClone(obj) {
    if(obj === null) return null 
    if(typeof obj !== 'object') return obj;
    var newObj = new obj.constructor ();  //保持继承链
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
            var val = obj[key];
            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
        }
    }  
    return newObj;  
}
</script>
</body>
</html>

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

         对应的源码可以访问这里获取: https://github.com/liuhongdi/
         或: https://gitee.com/liuhongdi

说明:作者:刘宏缔 邮箱: [email protected]

二,测试效果:

 

无效:直接赋值时:obj1、obj2是同一个对象:

浅拷贝:对象中嵌套的对象没有成功复制:

深拷贝:对象中嵌套的对象也被成功复制为新对象: 

三,查看chrome的版本:

 

标签:5195.125,obj1,obj2,console,log,对象,javascript,拷贝,name
From: https://www.cnblogs.com/architectforest/p/16721074.html

相关文章

  • JSON和JavaScript自定义对象
    JavaScript自定义对象:var对象名称={属性名称1:属性值1,属性名称2:属性值2,...,函数名称:function(形参列表){},...}; 访问对象:对象名称.属性名称......
  • JavaScript基础知识
    ##输出语句*1.window.alert()--写入警告框*2.document.write()---写入HTML输出*3.console.log()---写入浏览器控制台*alert("helloworld!");//写入警告框document......
  • JavaScript
    行为也是严格区分大小写的,可以在控制台console.log打印输出的东西1.什么是JavaScript?是一门世界上最流行的脚本语言2.引用script里面的注释用// alert("......
  • JavaScript学习笔记 第七章 原型
    原型prototypefunctionPerson(){}Person.prototype.a=123;varper=newPerson();//console.log(per.prototype);//conso......
  • JavaScript 静态方法
    静态方法:static关键字(类方法),可在实例化对象之前通过类名.方法名调用静态方法静态方法不能在对象上调用,只能在类中调用如果想在noob中使用静态方法,可以作为一个参数传递......
  • JavaScript 类继承
    使用extends关键字。super() 方法用于调用父类的构造函数。已有的类称为基类(父类),新建的类称为派生类(子类)。通过在构造方法中调用 super() 方法,我们调用了父类的构......
  • JavaScript 类(class)
    使用class关键字关键一个类,每个类中包含了一个特殊的方法 constructor(),它是类的构造函数创建类classClassName{constructor(name,url){this.name=name;this,url=u......
  • JavaScript 闭包
    私有变量可以用到闭包。闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。直观的说就是形成一个不销毁的栈环境闭包就是一个......
  • JavaScript 函数调用
    JavaScript函数有4种调用方式。每种方式的不同在于 this 的初始化。this关键字:this指向函数执行时的当前对象全局对象:当函数没有被自身的对象调用时this的值就......
  • JavaScript 函数参数
    函数显式参数(Parameters)与隐式参数(Arguments)显式参数:functionName(parameter1,parameter2,parameter3){//要执行的代码……}函数显式参数在函数定义时列出。......