当前位置:首页 > javascript > 正文内容

js 深浅拷贝

自由小鸟6年前 (2019-12-03)javascript3369

对象浅拷贝

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;
}

版权声明:本文由Web学习之路发布,如需转载请注明出处。

本文链接:https://webge.net/?id=84

“js 深浅拷贝” 的相关文章

代理事件绑定

代理事件绑定

 代理绑定事件通用绑定事件的函数...

DOM事件

1,事件级别    DOM0-dom.onclick=fun    DOM2-dom.addEventListener('click',fun,false)    ...

数组有哪些原生方法

赋值方法:pop 和 push   pop // 删除数组最后一个元素,返回被删除的元素push // 在数组尾部插入1-N个元素,返回操作后数组的lengthshift     //  删除数组第一个元素,返回被删除的元素uns...

正则的规则

正则的两个特点:懒惰:如果没有设置全局g的情况下,只匹配1次,这时候的lastIndex的值是0贪婪:...

数组去重

var a=[1,3,4,5,6,1,3,9,6]; //代码是去重后的 function arrfn(data){ let newObj={}; for(let i=0;i<data.length;i++...

最全的js运行机制

最全的js运行机制

主线程Event Queue:(微任务,宏任务) 1,主线程执行完后2,到Event Queue里找,先执行微任务,再宏任务...