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

js 深浅拷贝

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

对象浅拷贝

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://www.webge.net/?id=84

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

js原型链

js原型链

创建对象有几种方法:原型,构造函数,实例,原型链左边 实例对象  instanceof 构造函数  来判断是不是同一个引用原型用constructor 比instanceof来判断继承更严谨var o3=new M()o3 instanceof  M  &nb...

数组有哪些原生方法

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

正则的规则

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

最全的js运行机制

最全的js运行机制

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

js 判断数组,对象

arr=[1,2,3,4]; obj={a:'aaa'}; console.log(arr.constructor===Object) //false arr instanceof Array //true Object.prototype.toString.call(...

防抖和节流

如果我在一个时间内只执行一次,最好用防抖,如果只是想在执行时,设置一下间隔时间那么用节流 防抖是在一个时间内只能执行一次,如果频繁操作就会清除重新开始计算执行,我设置的时间内整个过程中只会执行一次/* 函数的防抖 debounce,不是某个事件触发就去执行函数,而是在指定的时间间隔内执行...