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

js 深浅拷贝

自由小鸟5年前 (2019-12-03)javascript3211

对象浅拷贝

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 判断数组,对象

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