首先认识JS的数据类型
大致分为两种:基本数据类型和引用数据类型
其中:
(1)基本数据类型:数值、字符串、布尔、null、undefined(基本类型)
(2)复杂数据类型:对象(引用类型)
保存上的区分:
基本数据类型保存在栈内存中,而引用elixir保存在堆内存中。
根本原因保存于栈内存必须是大小固定的数据,引用类型的大小不固定,只能保存在
在堆内存中,但是可以把它的地址写在栈内存中以供我们访问
举例:
var a = 1;//定义了一个number类型 var obj1 = {//定义了一个object类型 name:'obj' };
基本数据类型:按值访问,操作的就是变量保存的值
引用类型:只是通过保存在变量中的引用类型的地址来操作实际对象。
如图:
1、基本数据类型的复制
var a = 1; var b = a;//复制 console.log(b)//1 a = 2;//改变a的值 console.log(b)//1
赋值的时候,在栈内存中重新开辟内存,存放变量b,所以在栈内存中分别存放着变量a、b各自的值,修改时互不影响。
2、引用类型的复制
var list1 = ['123','456']; var list2 = list1;//复制 console.log(list2)//['123','456']; color1.push('789') ;//改变list1的值 console.log(list2)//['123','456','789']
list1与list2指向堆内存中同一地址的同一对象,复制的只是引用地址。
深拷贝:
JSON.parse(JSON.stringify(obj))
利用JSON.stringify(obj)将对象先转为json字符串,再JSON.parse()转回为json对象可以实现深拷贝,这也是比较常用的一种方法。
用js实现一个深拷贝
其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,浅拷贝时判断属性值是否是对象,如果是对象就进行递归操作,两个一结合就实现了深拷贝。
function cloneDeep(source) { if (!isObject(source)) return source; // 非对象返回自身 var target = Array.isArray(source) ? [] : {}; for (var key in source) { if (source.hasOwnProperty(i)) { if (isObject(source[key])) { target[key] = cloneDeep(source[key]); // 注意这里 } else { target[key] = source[key]; } } } return target; } function isObject(obj) { return typeof obj === 'object' && obj != null; }