堆栈的区别
1 | 栈(stack)为自动分配的内存空间,它由系统自动释放;而堆(heap)则是动态分配的内存,大小不定也不会 |
什么是浅拷贝
1 | 对象或是数组与被拷贝的对象或是数组指向了同一块内存,所以修改其中任意的值,另一个值都会随之变化, |
什么深拷贝
1 | 被拷贝的对象或是数组指向了新的一块内存,所以修改其中任意的值,另一个值都不会随之变化,这就是深拷贝 |
关于Object的assign的拷贝问题
1 | 从mozilla.org上得知: |
1 | //浅拷贝 |
上述深拷贝出现的问题
1 | /*浅拷贝 直接赋值引用*/ |
简单封装一个深拷贝方法
递归调用实现数组和对象的深拷贝1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54function getType(obj){
var toString = Object.prototype.toString;
var map = {
'[object Boolean]' : 'boolean',
'[object Number]' : 'number',
'[object String]' : 'string',
'[object Function]' : 'function',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object RegExp]' : 'regExp',
'[object Undefined]': 'undefined',
'[object Null]' : 'null',
'[object Object]' : 'object'
};
if(obj instanceof Element) {
//Element document node
return 'element';
}
return map[toString.call(obj)];
}
function deepClone(data){
var type = getType(data),
result;
if(type == 'array'){
var len = data.length;
result = [];
} else if(type == 'object'){
result = {};
} else {
return data;
}
if(type == 'array'){
for(var i = 0; i<len;i++){
result[i] = deepClone(data[i]);
}
} else {
for(var key in data){
result[key] = deepClone(data[key]);
}
}
return result;
}
var testArr = [12,3,445,6];
var testArrB = deepClone(testArr);
var testArrC = testArr;
testArr[0] = 11;
console.log(testArr,testArrC,testArrB);
var testArr = {name:"shinelp100",age:"26",method:function(){console.log('test')},privateP:{obj:'missY',shine:function(){alert('shine')}}};
var testArrB = deepClone(testArr);
var testArrC = testArr;
testArr['privateP']['obj'] = "shineY";
console.log(testArr,testArrC,testArrB);