js 深浅拷贝

原创 自由小鸟  2019-12-03 12:29:41  阅读 825 次 评论 0 条

对象浅拷贝

Object.assign,也可以做到浅拷
slice
let obj=[11,22,33,44,['aa','bb','cc']]

let aaa=obj.slice(0);
aaa[4][0]='ccc'
console.log(aaa);  //[ 11, 22, 33, 44, [ 'ccc', 'bb', 'cc' ] ]
console.log(obj)  // [ 11, 22, 33, 44, [ 'ccc', 'bb', 'cc' ] ]

数组对象深拷贝

JSON.parse(JSON.stringify(obj))
1,这个方法对特殊undefined是特殊处理的
1》在对象里undefined出来的是空,过滤了这项
2》数组里出来把undefined拷贝了来的是null

数组
let obj=[1,2,3,4,undefined]
let aaa=JSON.parse(JSON.stringify(obj))
console.log(aaa);  //[1,2,3,4,null]

let obj={
    a:'1',
    b:undefined,
    c:{a:'aaa'},
    d:['111','222',['s',{'bbb':'ccc'}]]
}
let aaa=JSON.parse(JSON.stringify(obj))
console.log(aaa);
// { a: '1', c: { a: 'aaa' }, d: [ '111', '222', [ 's', [Object] ] ] }

完美的深拷贝

function deepCopy(obj) {
  let result = obj instanceof Array ? [] : {}
  let keys = Object.keys(obj), key = null, temp = null;
  for (let i = 0; i < keys.length; i++) {
    key = keys[i]
    temp = obj[key]
    if (temp && typeof temp === 'object') {
      if(temp != obj){  // 解决堆栈溢出
        result[key] = deepCopy(temp)
      }
    } else {
      result[key] = temp
    }
  }
  return result;
}
本文地址:https://webge.net/?id=84
版权声明:本文为原创文章,版权归 自由小鸟 所有,欢迎分享本文,转载请保留出处!

评论已关闭!