美文网首页
JS深拷贝

JS深拷贝

作者: 苏码码 | 来源:发表于2022-03-03 10:13 被阅读0次

1.数组的concat()、slice()方法

var arr = [1,2,3,4,5]
var arr1 = arr.concat([])
var arr2 = arr.slice(0)
arr[1] = 10
console.log(arr)   // => [1, 10, 3, 4, 5]
console.log(arr1) // =>  [1, 2, 3, 4, 5]
console.log(arr2) // =>  [1, 2, 3, 4, 5]

2.使用递归循环

 function deep(dest, obj) {
    var o = dest
    for (const key in obj) {
      if (typeof obj[key] === 'object') {
        o[key] = (obj[key].constructor === Array) ? [] : {}
        deep(o[key],obj[key])
      } else {
        o[key] = obj[key]
      }
    }

    return o
  }

  var obj1 = {
    a: 1,
    b: [1,2,3,4],
    c: function(){},
    d: {
      e: [0,6,4],
      f: 'sdf'
    }

  }
  var o1 = deep({},obj1)

3.使用lodash库中cloneDeep()

 import _ from 'lodash'
  let obj = {a: {b: {c: 1}}}
  let o = _.cloneDeep(obj)

  o.a.b.c = 10
  console.log(o.a.b.c)  // => 10
  console.log(obj.a.b.c) // => 1

4.使用JQ的extend方法。

// $.extend( [deep ], target, object1 [, objectN ] )
// deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
// target**** Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
// object1 objectN可选。 Object类型 第一个以及第N个被合并的对象
let a=[0,1,[2,3],4],
    b=$.extend(true,[],a);
    a[0]=1;
    a[2][0]=1;
    console.log(a , b);

5.我们还可以借用JSON对象的parse和stringify

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}    
let a=[0,1,[2,3],4],
      b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a); // => [1,1,[1,3],4]
console.log(b); // => [0,1,[2,3],4]

相关文章

网友评论

      本文标题:JS深拷贝

      本文链接:https://www.haomeiwen.com/subject/kepyrrtx.html