JS对象的浅拷贝与深度拷贝

1、js中的6个标准类型

原始类型:Undefined、Null、Boolean、String、Number

引用类型:Object  ( 最简单的引用类型var obj={} )

2、把标准类型分成了两类、这两种类型复制克隆有很大区别

原始类型:存储的是对象的实际数据( 存放在栈内存中 )

引用类型:存储的是对象的引用地址( 栈内存中存放的堆内存的地址 )

3、克隆概念

浅度克隆:原始类型为值传递、对象类型仍为引用传递

深度克隆:所有的元素与属性均完全复制、与原对象完全脱离关系( 对新对象的修改不会影响原对象 )

4、浅克隆

原始类型克隆的表现

1     var num1 = 123;
2     var num2 = num1;
3     num2 = 456;
4     console.log(num1); // 123
5     console.log(num2); // 456

常见的浅拷贝

 1     var obj = {
 2       a:10,
 3       b:20
 4     }
 5     function clone(obj){
 6       var newobj = {};
 7       for(key in obj){
 8         newobj[key] = obj[key];
 9       }
10       return newobj;
11     }
12     obj2 = clone(obj);
13     console.log(obj2.a); // 10
14     obj2.a = 100;
15     console.log(obj2.a); // 100
16     console.log(obj.a); // 10

浅拷贝可以解决常见的对象、若对象内部还有对象、如下

 1     var obj = {
 2       a:{
 3           a1:‘aa‘,
 4           a2:‘bb‘
 5       },
 6       b:20
 7     }
 8     function clone(obj){
 9       var newobj = {};
10       for(key in obj){
11         newobj[key] = obj[key];
12       }
13       return newobj;
14     }
15     obj2 = clone(obj);
16     console.log(obj2.a.a1); // aa
17     obj2.a.a1 = ‘cc‘;
18     console.log(obj2.a.a1); // cc
19     console.log(obj.a.a1); // cc
20     // 更改了obj2的a1、obj的a1也随之改变、说明a同时被obj、obj2同时引用。那么问题来了:怎么解决?

5、深度克隆

 1     var obj = {
 2         a:10,
 3         b:{
 4             bb:50,
 5             cc:60
 6         }
 7     };
 8     function deepClone(obj){
 9         var result={},oClass=isClass(obj);
10         for(key in obj){
11             var copy = obj[key];
12             if (isClass(copy)=="Object") {
13                 result[key] = arguments.callee(copy);
14             } else if(isClass(copy) == "Array"){
15                 result[key] = arguments.callee(copy); // 递归
16             }else{
17                 result[key] = obj[key];
18             };
19         }
20         return result;
21     }
22     // alert(isClass(undefined));
23     function isClass(o){
24         return Object.prototype.toString.call(o).slice(8,-1);
25     };
26     obj2 = deepClone(obj);
27     console.log(obj2.b.bb); // 50
28     obj2.b.bb = 500;
29     console.log(obj2.b.bb); // 500
30     console.log(obj.b.bb); // 50
31
32     // Object.prototype.toString.call() 所有js类型都会得到不同的字符串
33     /*
34     为了保证对象的所有属性都被复制到,我们必须知道如果for循环以后,得到的元素仍是Object或者Array,那么需要再次循环,直到元素是原始类型或者函数为止。为了得到元素的类型,我们定义一个通用函数( isClass ),用来返回传入对象的类型。
35      */

学习笔记、欢迎路过的同学们批评&指教

时间: 2024-10-07 11:20:27

JS对象的浅拷贝与深度拷贝的相关文章

Python 直接赋值、浅拷贝和深度拷贝区别

Python 直接赋值.浅拷贝和深度拷贝区别 转自https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html 直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 解析 1.b = a: 赋值引用,a 和 b 都指向同一个对象. # -*- c

Python 直接赋值、浅拷贝和深度拷贝解析

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 字典浅拷贝实例 实例 >>> a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) >>> a[1].append(4) >>

Python 直接赋值、浅拷贝和深度拷贝全解析

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 字典浅拷贝实例 实例 1 2 3 4 5 6 7 >>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) >>> a[1].appe

学习python--第八天(直接赋值、浅拷贝和深度拷贝解析)

直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象.--只拷贝第一层 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象.--克隆一份 原文地址:https://www.cnblogs.com/denny-djl/p/10348114.html

js对象深拷贝浅拷贝

对象的深拷贝于浅拷贝 对于基本类型,浅拷贝过程就是对值的复制,这个过程会开辟出一个新的内存空间,将值复制到新的内存空间.而对于引用类型来书,浅拷贝过程就是对指针的复制,这个过程并没有开辟新的堆内存空间,只是将指向该内存的地址进行了复制.然而对引用类型的浅拷贝会出现一个问题,那就是修改其中一个对象的属性,则另一个对象的属性也会改变.产生了问题那必然有相对解决的方法, 就这样深拷贝就开始入场了,深拷贝会开辟新的栈,两个对象对应两个不同的地址,这样一来,改一个对象的属性,也不会改变另一个对象的属性.

Perl的浅拷贝和深度拷贝

首先是深.浅拷贝的概念: 浅拷贝:shallow copy,只拷贝第一层的数据.Perl中赋值操作就是浅拷贝 深拷贝:deep copy,递归拷贝所有层次的数据,Perl中Clone模块的clone方法,以及Storable的dclone()函数是深拷贝 所谓第一层次,指的是出现嵌套的复杂数据结构时,那些引用指向的数据对象属于深一层次的数据.例如: @Person1=('wugui','tuner'); @Person2=('longshuai','xiaofang',['wugui','tun

js对象的浅拷贝与深拷贝

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

浅拷贝与深度拷贝(原型模式)

Delphi的VCL从TPersistent开始支持RTTI(RuntimeTypeInfo)运行时类型信息,它是通过{$M+}编译指令提供了RTTI的功能.M打开以后,Delphi在编译该对象时,会把对象的类型信息编译进可执行文件,这样在运行时就可以动态地获得对象的属性和方法等信息.因为所有的VCL可视化组件都是从TPersistent派生的,因此可以将组件信息保存到dfm也可以动态加载. Delphi还定义了一个虚方法Assign, [delphi] view plain copy proc

Python直接赋值、浅拷贝和深度拷贝解析

ython 文件 writelines() 方法用于向文件中写入一序列的字符串. 这一序列字符串可以是由迭代对象产生的,如一个字符串列表. 换行需要制定换行符 \n. 语法 writelines() 方法语法如下: 1fileObject.writelines(iterable)参数 iterable -- 可迭代对象(字符串.列表.元祖.字典). 返回值 该方法没有返回值. 原文地址:http://blog.51cto.com/98405/2145034