深拷贝

javascript 数据类型

  1. 原始类型(基本类型):按值访问,可以操作保存在变量中实际的值。原始类型汇总中null和undefined比较特殊。
  2. 引用类型:引用类型的值是保存在内存中的对象。

与其他语言不同的是,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。所以引用类型的值是按引用访问的。

javascript 拷贝

浅拷贝:

假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。

  1. ECMAScript2015实现方法,Object.assign(target, ...sources) 返回目标对象。(不会跳过那些值为 nullundefined 的源对象)

  2. 循环赋值

    1
    2
    3
    4
    5
    6
    7
    function simpleClone(initalObj) {    
    var obj = {};
    for ( var i in initalObj) {
    obj[i] = initalObj[i];
    }
    return obj;
    }

深拷贝

拷贝基本类型及引用类型

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
function clone(item){
if(!item){
return item;
}
var types = [String, Number, Boolean];
var result;
types.forEach(function(e){
if(item instanceof e){
result = e(item);
}
})
if(result === void 0){
if(Object.prototype.toString.call(item) === '[object Array]'){
result = [];
item.forEach(function(e, i){
result[i] = e;
})
}else if(typeof item === 'object'){
result = {};
for(var i in item){
result[i] = clone(item[i]);
}
}else{
result = item;
}
}
return result;
}
var a = {
b: 1,
c: [2, 3],
d: {e: 4}
}
var r = clone(a);
console.log(r);