SOURCE

function a() {
    var a = [1, 2, 3, 4, 5];
    var s = a;
    var d = a[2];
    console.log(s);
    console.log(d);

    s[0] = 6;
    d = 7;
    console.log(s);
    console.log(d);
    console.log(a);
}


// 使用for...in..实现浅拷贝
function s() {
    // 原对象,【堆中】
    var _data = {
        id: 1,
        num: 10,
        list: {
            id: 1,
            num: 1
        }
    };

    var _newData = {};    //新创建一个对象,【栈中】

    // 使用for...in...进行拷贝操作
    for (var i in _data) {
        _newData[i] = _data[i];
    }

    // 对浅拷贝的新对象做操作
    _newData.id = 2;
    _newData.list.id = 2;

    console.log('_data值:', _data)
    console.log('_newData值:', _newData)

    // 输出
    // _data值:,{"id":1,"num":10,"list":{"id":2,"num":1}}
    // _newData值:,{"id":2,"num":10,"list":{"id":2,"num":1}}
}


// 使用Object.assign()实现浅拷贝
function d() {
    // 原对象,【堆中】
    var _data = {
        id: 1,
        num: 10,
        list: {
            id: 1,
            num: 1
        }
    };

    var _newData = {};    //新创建一个对象,【栈中】

    // 使用Object.assign(新对象,需要拷贝的对象)进行拷贝操作
    Object.assign(_newData, _data)

    // 对浅拷贝的新对象做操作
    _newData.id = 2;
    _newData.list.id = 2;

    console.log('_data值:', _data)
    console.log('_newData值:', _newData)

    // 输出
    // _data值:,{"id":1,"num":10,"list":{"id":2,"num":1}}
    // _newData值:,{"id":2,"num":10,"list":{"id":2,"num":1}}
}


// 使用JSON.stringify()进行深拷贝
function f() {
    // 原对象,【堆中】
    var _data = {
        id: 1,
        num: 10,
        list: {
            id: 1,
            num: 1
        }
    };

    var _newDataStr = JSON.stringify(_data),
        _newData = JSON.parse(_newDataStr);

    // 对浅拷贝的新对象做操作
    _newData.id = 2;
    _newData.list.id = 2;

    console.log('_data值:', _data)
    console.log('_newData值:', _newData)

    // 输出
    // _data值:,{"id":1,"num":10,"list":{"id":1,"num":1}}
    // _newData值:,{"id":2,"num":10,"list":{"id":2,"num":1}} 
}

// 使用递归的方式进行深拷贝
function g(data) {
    // 首先判断data是基本数据类型还是引用数据类型,如果是基本直接返回
    if (typeof data != "object") {
        return data
    }

    // 根据是数组还是对象进行新建变量
    var _newData = Array.isArray(data) ? [] : {};

    // 判断是数组还是对象
    if (data instanceof Array) {
        console.log("是数组")
        // 数组
        for (var i = 0; i < data.length; i++) {
            _newData[i] = data[i]
            if (typeof _newData[i] == 'object') {
                g(_newData[i]);
            }
        }
    } else {
        console.log("是对象")
        // 对象
        for (var i in data) {
            // 判断对象里面是否有数组或者对象
            if (typeof data[i] == 'object') {
                _newData[i] = g(data[i])
            } else {
                _newData[i] = data[i]
            }
        }
    }
    return _newData
}
console.log(g({ a: 1, s: 2, d: [1, 2, 3] }))
console 命令行工具 X clear

                    
>
console