AI智能
改变未来

jQuery深拷贝和浅拷贝详解

在了解深拷贝和浅拷贝之前首先要明白数据在内存中是如何存放的

在js中,数据可以分为基本数据类型(字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined))和复杂数据类型(对象(Object)、数组(Array)、函数(Function))。

在定义变量时,基本数据类型会存放在内存的栈中,而复杂数据类型会存放在内存的堆中,由栈中的名字指向队中的地址。例如下图:


明白了基本数据类型和复杂数据类型之后就可以研究深拷贝和浅拷贝的问题了

jQuery的$.extend();用法

$.extend( [deep ], target, object1 [, objectN ] )

第一个属性可以设定是深拷贝还是浅拷贝,true的话就是深拷贝。默认flase浅拷贝。

浅拷贝:
在拷贝基本数据类型时,会在栈中生成和被拷贝对象一样的变量名和值,如果遇到相同的属性,拷贝对象的属性值会覆盖掉自己原本的属性值。而在浅拷贝复杂数据类型时,只把复杂数据类型在堆中的地址拷贝给新变量,这时被拷贝的复杂变量和新拷贝出来的复杂类型对象都指向这个复杂对象的地址。例下图。这时无论改变小丽的age,还是改变小红的age,另外的一个人的会随之改变。相当于两个人公用一套数据。

深拷贝:
在深拷贝中,无论是基本数据类型还是复杂数据类型,都会完全的拷贝一份数据给到新的变量,复杂数据会在堆中重新开辟一个地址,让新变量指向新的地址而不是指向之前自己的地址,例下图。这样两个变量都指向自己的地址,更改数据不会影响到对方的数据的变化。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » jQuery深拷贝和浅拷贝详解