JavaScript 浅克隆与深度克隆

一、浅克隆

 1、基本数据类型的克隆(赋值即可)

var a = 1;
var b = a;

console.info(a); //1
console.info(b); //1
a = 2;
console.info(a); //2
console.info(b); //1

把一个值赋给另一个变量时,当那个变量的值改变的时候,另一个值不会受到影响。

2、数组克隆

 如果我们采取基本数据类型的方式(赋值)来进行克隆,案例如下:

var arr1 = [1, 2, 3];
var arr2 = arr1;
console.info(arr1); //1,2,3
console.info(arr2); //1,2,3
arr1.push(4);
console.info(arr1); //1,2,3,4
console.info(arr2); //1,2,3,4

因为arr2引用了arr1,他们指向了内存中的同一块地址,所以arr1的改变也会导致arr2的改变!那如果要实现数组的浅克隆要怎么操作呢?

我们利用的数组的slice方法进行了克隆,代码如下:

var arr1 = [1, 2, 3];
var arr2 = arr1.slice();
console.info(arr1); //1,2,3
console.info(arr2); //1,2,3
arr1.push(4);
console.info(arr1); //1,2,3,4
console.info(arr2); //1,2,3

二、深度克隆 

function clone(obj) {
    var o, i, j, k;
    if (typeof(obj) != "object" || obj === null) {
        return obj;
    }
    if (obj instanceof(Array)) {
        o = [];
        i = 0;
        j = obj.length;
        for (; i < j; i++) {
            if (typeof(obj[i]) == "object" && obj[i] != null) {
                o[i] = arguments.callee(obj[i]);
            } else {
                o[i] = obj[i];
            }
        }
    } else {
        o = {};
        for (i in obj) {
            if (typeof(obj[i]) == "object" && obj[i] != null) {
                o[i] = arguments.callee(obj[i]);
            } else {
                o[i] = obj[i];
            }
        }
    }
    return o;
}
 
原文地址:https://www.cnblogs.com/mangoniki/p/5484930.html