赋值、浅拷贝和深拷贝
2019-10-14 本文已影响0人
Xu涵
ECMAScript的数据类型
基本数据类型
-
基本数据类型主要是:undefined,boolean,number,string,null,symbol
-
基本数据类型以名值存储在栈中:
let a = 1 let b = a
执行第一个语句之后,栈是这样的
avatar执行第二个语句,就变成这样了
avatar此时如果修改a的值,对b不会造成任何影响
引用数据类型的存储
-
包括:对象、数组、函数等
-
引用类型存储在堆中
avatarlet person1 = {} let person2 = {}
avatarlet a = [1,2,3] let b = a
引用类型的赋值就是将a的引用给b,两者指向同一块内存,两者的操作会互相影响
a[1] = 5 console.log(b[1]) //5 console.log(a === b) //true
赋值和浅拷贝的区别
-
赋值:简单地把变量的引用给目标变量
-
浅拷贝:把对象的一级属性拷贝给另一个对象,但不包括子对象
-
举个栗子:
avatarlet a=[0,1,[2,3],4], b=a.slice(); //slice方法是实现浅拷贝的一种方式 a[0]=1; a[2][0]=1; console.log(a,b);
深拷贝的方法
-
深拷贝:把一个对象的所有子对象都拷贝给另一个对象,两个对象之间互不影响
-
常用方法:
-
可以用递归的方法
-
用jQuery的extend方法
-
用json对象
function deepClone2(obj) { var _obj = JSON.stringify(obj), objClone = JSON.parse(_obj); return objClone; }
-