SOURCE

const type = obj => {
    const toString = Object.prototype.toString;
    const map = {
        '[object Array]': 'array',
        '[object Object]': 'object',
    };

    return map[toString.call(obj)];
};

const deepClone = data => {
    const t = type(data);
    
    let o, i, length;
    if (t === 'array') {
        o = [];
        for (i = 0, length = data.length; i < length; i++) {
            o.push(deepClone(data[i]));
        }

        return o;
    }

    if (t === 'object') {
        o = {};
        for (i in data) {
            if (Object.prototype.hasOwnProperty.call(data, i)) {
                o[i] = deepClone(data[i]);
            }
        }

        return o;
    }
    else {
        return data;
    }
};

const arr = [
    {
        name: 'ljs',
        age: 28
    },
    {
        name: 'hxxx',
        age: 30
    }
];

console.log(arr);

const arrDeep = deepClone(arr);
arrDeep[1].age = 40;

const arrJson = JSON.parse(JSON.stringify(arr));
arrJson[1].age = 50;

console.log(arrDeep);
console.log(arrJson);
console.log(arr);
console 命令行工具 X clear

                    
>
console