JS中的浅拷贝和深拷贝。

//浅拷贝
var o1 = { a: 10, b: 20, c: 30 };
var o2 = o1;
o2.a = 100;
console.log(o1);

//深拷贝
var o1 = { a: 10, b: 20, c: 30 };
var o2 = { a: o1.a, b: o1.b, c: o1.c };
o2.a = 100;
console.log(o1);

//深拷贝 只适用于一维数组
var o1 = { a: 10, b: 20, c: 30 };
var o2 = { ...o1 };
o2.a = 100;
console.log(o1);

//简单深拷贝,将对象转成json字符串再转回来
var o1 = { a: { d: 40 }, b: 20, c: 30 };
var o2 = JSON.parse(JSON.stringify(o1));
o2.a.d = 100;
console.log(o1);

//多维数组
var o1 = { a: { d: 40 }, b: 20, c: 30 };
var o2 = { ...o1 };
o2.a.d = 88;
console.log(o1);

//Object.assign 能够实现一层深拷贝
var o1 = {
    name: "Gucci",
    age: 13,
    gender: "female",
    hobby: {
        a: ‘Chinese‘,
        b: ‘Math‘,
        c: ‘English‘
    }
};
var o2 = Object.assign({}, o1);
o2.hobby.a = "Math";
o1.age = 1000;
console.log(o1);

//终极大杀器 递归复制实现深拷贝

//注意typeof []结果为object
typeof []
"object"
typeof {}
"object"
typeof "111"
"string"
typeof null
"object"

function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判断ojb子元素是否为对象,如果是,递归复制
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}
let a=[1,2,3,4],
    b=deepClone(a);
a[0]=2;
console.log(a,b);

  

//运算结果按顺序打印
{ a: 100, b: 20, c: 30 }
{ a: 10, b: 20, c: 30 }
{ a: 10, b: 20, c: 30 }
{ a: { d: 40 }, b: 20, c: 30 }
{ a: { d: 88 }, b: 20, c: 30 }
{ name: ‘Gucci‘,
  age: 1000,
  gender: ‘female‘,
  hobby: { a: ‘Math‘, b: ‘Math‘, c: ‘English‘ } }
[ 2, 2, 3, 4 ] [ 1, 2, 3, 4 ]

  

原文地址:https://www.cnblogs.com/ft039x/p/9986285.html

时间: 2024-10-11 15:37:18

JS中的浅拷贝和深拷贝。的相关文章

浅谈JS中的浅拷贝与深拷贝

前端工程师应该都比较熟悉浅拷贝和深拷贝的概念,在日常业务代码的过程中,特别是做数据处理的时候,经常行的会遇到,比如如何在不修改原对象的基础上,重新生成一个一模一样的对象,加以利用,又或是,如何巧妙地运用相关的内置API,来达成自己所需要的结果,比如数组相关的操作,splice和slice就是截然相反的处理,虽然同样是对数组进行截取操作,但是前者会影响原数组,后者则是返回一个新的数组对象,而对原来的数组并不会产生任何影响,这其中的差别,需要有一定的开发经验才能明白. 好了,废话也不多说,下面来简单

js对象的浅拷贝与深拷贝

浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用(堆和栈的关系,原始(基本)类型Undefined,Null,Boolean,Number和String是存入堆,直接引用,object array 则是存入桟中,只用一个指针来引用值,如果拷贝后的对象发生变化,原对象也会发生变化.只有深拷贝才是真正地对对象的拷贝. 1.浅拷贝 默认是浅拷贝,只是将地址进行了复制,示例如下: //浅拷贝 var obj1={name:"cat"}; var obj2=obj1; o

Javascript中的浅拷贝和深拷贝

很多开发语言中都有浅拷贝和深拷贝的说法,这里简单区分一下它们在Javascript中的区别,以及jQuery中深拷贝的实现. 在谈浅拷贝和深拷贝之前,先要屡清楚Javascript中的按值访问和按引用访问这两个概念. 按值访问是针对基本类型(string.number.boolean.null.undefined).基本类型以值的形式被存放在栈内存中,我们通过变量操作的是栈内存中实际的值. 按引用访问时针对引用类型(Object.Array.Date.RegExp.Function).引用类型以

C#中的浅拷贝和深拷贝

#中有两种类型变量,一种是值类型变量,一种是引用类型变量. 对于前者,copy是属于全盘复制:而对于后者,一般的copy只是浅copy,只copy引用地址,相当于只传递一个引用指针一样.因此对于后者进行真正copy的时候,也是最费事的,具体的说,必须为其实现 ICloneable接口中提供的Clone方法,从而产生一个全新的对象. 浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.

Objective-C中的浅拷贝和深拷贝详解

  浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.如: 1 2 char* str = (char*)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针. iOS 里面的浅拷贝: 在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝.他既让几个指针共用同一片内存空间,又可以在release

Python中的浅拷贝与深拷贝

以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外一个变量的值也改变了.比如: person = ['name', ['saving', 100]] hubby = person wifey = person hubby[0] = 'joe' wifey[0] = 'jane' print hubby, wifey hubby[1][1] = 50 print hubby, wifey >>>['jane',

Objective-C中的浅拷贝和深拷贝

浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.如: char* str = (char*)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针. iOS 里面的浅拷贝: 在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝.他既让几个指针共用同一片内存空间,又可以在release 由于计数的存

Objective-C中的浅拷贝和深拷贝差异和区别

浅拷贝  浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.如: char* str = (char*)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针. iOS 里面的浅拷贝:  在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝.他既让几个指针共用同一片内存空间,又可以在release 由于计数

python中的浅拷贝和深拷贝

1.浅拷贝 copy.copy() 浅拷贝是拷贝只拷贝最外一层(这里所说的拷贝是重新生成一个内存地址,也就是只有最外层的地址是重新生成) import copy li=[23,45,['wew',35,[33,00]]] li1=copy.copy(li) print(id(li),id(li1)) print(id(li[0]),id(li1[0])) print(id(li[2][1]),id(li1[2][1])) #输出:35540704 5872576 # 1625084720 162