1.数组的浅拷贝

    1. var a = [1,2,3,4]
    2. var b = a

    2.一维数组的深拷贝

    1.splice方法

    1. var a = [1,2,3,4]
    2. var b = a.slice()
    3. a[0] = 5
    4. console.log(a) // [5,2,3,4]
    5. console.log(b) // [1,2,3,4]

    2.cocat方法

    1. var a = [1,2,3,4]
    2. var b = a.concat()
    3. a[0] = 5
    4. console.log(a) // [5,2,3,4]
    5. console.log(b) // [1,2,3,4]

    3.循环

    1. var a = [1,2,3,4]
    2. var b = cloneArray(a);
    3. a[0] = 5
    4. console.log(a) // [5,2,3,4]
    5. console.log(b) // [1,2,3,4]
    6. function cloneArray(arr) {
    7. const newArray = []
    8. for(let i = 0; i < arr.length; i++) {
    9. newArray.push(arr[i])
    10. }
    11. return newArray
    12. }

    4.es6新特性之扩展运算符

    1. var a = [1,2,3,4]
    2. var b = [...a]
    3. a[0] = 5
    4. console.log(a) // [5,2,3,4]
    5. console.log(b) // [1,2,3,4]

    5.es6新特性之Array.from

    1. var a = [1,2,3,4]
    2. var b = Array.from(a);
    3. a[0] = 5;
    4. console.log(a) // [5,2,3,4]
    5. console.log(b) // [1,2,3,4]

    3.多维数组的深拷贝

    1.json.parse()和json.stringify()

    1. var a = [1,[2,3],4]
    2. var b = JSON.parse(JSON.stringify(a));
    3. a[1][0] = 5;
    4. console.log(a) // [1,[2,3],4]
    5. console.log(b) // [1,[5,3],4]
    • 拷贝的对象的值中如果有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失
    • 无法拷贝不可枚举的属性,无法拷贝对象的原型链
    • 拷贝Date引用类型会变成字符串
    • 拷贝RegExp引用类型会变成空对象
    • 对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null
    • 无法拷贝对象的循环应用(即obj[key] = obj)

    2.循环+递归

    1. var a = [1,[2,3],4]
    2. var b = deepClone(a);
    3. a[1][0] = 5
    4. console.log(a);
    5. console.log(b);
    6. function deepClone(arr) {
    7. if(!arr || typeof arr !== 'object'){
    8. return arr
    9. }
    10. const newArr = []
    11. for(var key in arr) {
    12. if(typeof arr[key] ==='object'){
    13. newArr[key] = deepClone(arr[key])
    14. }else {
    15. newArr[key] = arr[key]
    16. }
    17. }
    18. return newArr
    19. }