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