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

js 深浅拷贝

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

对象浅拷贝

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 深浅拷贝” 的相关文章

函数参数会生成新的作用域

函数参数会生成新的作用域

如果函数定义了参数就会自动生成新的作用域,这时候里面的变量值就会先从参数新的作用域找,如果没有就会再往上面找直到全局...

正则的规则

正则的两个特点:懒惰:如果没有设置全局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 判断数组,对象

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

防抖和节流

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

IOS软键盘收起留白问题及Input光标过长问题

1.Input光标过长问题iso 中input 光标长度与line-height有关,input本身字体就是上下居中的因此不需要设置,但如果想控制光标的长度可以通过设置line-height高度来控制; 2.IOS软键盘收起留白 1.可以通过输入框失去焦点 <div class=&quo...