深浅拷贝理解

218 阅读2分钟

前言

主要在于一些简单的理解,而不作很细致的介绍,如果深入解释,网上有一大把很详细的说明,然而我觉得本文对于新手比较适合,整理性归纳,需要对某个拷贝理解更深入,可自行查询了解。 有错请留言指出哦!!!

1、数据基本类型区别

基本类型:Array、Object、String、Number、Null、Undefined

引用类型:Object ===> Function、Date、Array

基本类型存储在栈中,一般数据比较稳定企且小;

引用类型存储在堆中,数据量很大(无限),然后把堆的地址(指针)存储在栈中

2、拷贝简单理解

  • 浅拷贝只是拷贝某个对象的指针(地址),并未新开辟内存来存储新的对象,而是新开一个指针指向相同的(堆中的)对象指针(地址);而堆中的对象是不可以直接修改的,所以对于修改堆中的对象都是通过指针(地址)修改;简单拷贝只是拷贝地址,所以只要修改一个堆中的对象,这个与之相关联的栈中指向该地址的都会变化,既新老对象都变化。
  • 深拷贝就是在原来的堆中,完全的复制并新开一个堆存储这个对象,并重新在栈中存储一个指针(地址),新老对象完全没有影响。

3、Object.assign();深拷贝(第)一层,之后就是浅拷贝

var obj1 = {
	a:{
		c:1
	},
	b:2
};
var obj2 = Object.assign({},obj1);
obj2.a.c = 9;
obj2.b = 8;
console.log(obj1,obj2);

结果:

4、手动深拷贝

...

5、JSON_parse和JSON_stringify深拷贝

存在缺陷,对于函数没法拷贝,如下:

6、工具类库lodash提供了深拷贝方法

var _ = require('lodash');
var obj = _.cloneDeep({});

7、JQuery提供的$.extend方法深拷贝

var obj = { name:'vvmily',job:{ work:'web...' } };
var newObj = $.extend(true,{},obj);

8、slice()和concat()属于浅拷贝,如下:

var a = [1,[1,2],3,4];
var b = a.slice();
b[1][0] = 6;
alert(a); // 1,6,2,3,4
alert(b); // 1,6,2,3,4