js中的深拷贝与浅拷贝

一、对象的深拷贝与浅拷贝

var obj = {
  name:'youbei',
  age:9,
  others:[1,2],
}

1.递归的方法实现深拷贝

function deepCopy(source){
    if(!isObject(source)) return source;
    let target = Array.isArray(source)?[]:{};
    for(var k in source){
        if(soucre.hasOwnProperty(k)){
            if(typeof source[k] =='object'){
                target[k] = deepCopy(source[k]);
            }else{
                target[k] = source[k]
            }
        }
    }
    return target;
}
function isObject(obj){
    return typeof obj==='object' && obj!==null
}
var obj1 = deepCopy(obj);
obj1.name='meituan';
obj1.age = 7;
obj1.others[2]=3;
console.log(JSON.stringify(obj1));
console.log(JSON.stringify(obj))
//{"name":"meituan","age":7,"others":[1,2,3]}
//{"name":"youbei","age":9,"others":[1,2]}

2.通过JSON对象实现深拷贝

function deepClone2(obj) {
  let _obj = JSON.stringify(obj),
  return JSON.parse(_obj);
}

注意:无法实现对象中方法的深拷贝,处理不了函数

3.通过Object.assign()拷贝(当对象只有一级属性为深拷贝;当对象中有多级属性时,二级属性后就是浅拷贝)

var obj = {
  name:'youbei',
  age:9,
}
var obj1 = Object.assign({},obj);
obj1.name='meituan';
obj1.age = 7;
console.log(obj.name,obj.age);

Object.assign 也算是浅拷贝,也就是如果源对象里的某些key对应的值是object类型,则只会拷贝对此object类型数据的引用,也就是说会多处共用一个储存空间,一个地方改变了,其他地方在取值也就变了

var obj = {
  name:'youbei',
  age:9,
  others:[1,2],
}
var obj1 = Object.assign({},obj);
obj1.name='meituan';
obj1.age = 7;
obj1.others[2]=3;
console.log(JSON.stringify(obj1));
//{"name":"meituan","age":7,"others":[1,2,3]}
console.log(JSON.stringify(obj));
//{"name":"youbei","age":9,"others":[1,2,3]}

二、 数组的深拷贝与浅拷贝

1. concat(arr1, arr2,…) 仅适用于对不包含引用对象的一维数组的深拷贝

注意:当数组中的元素均为一维是深拷贝 数组中元素一维以上是值的引用

2.slice(idx1, idx2) 仅适用于对不包含引用对象的一维数组的深拷贝

1. 没有参数是拷贝数组

2. 只有一个参数是从该位置起到结束拷贝数组元素

3. 两个参数,拷贝从起始位置到结束位置的元素(不包含结束位置的元素:含头不含尾)

注意:当数组中的元素均为一维是深拷贝,数组中元素一维以上是值的引用
    
3.es6方法 仅适用于对不包含引用对象的一维数组的深拷贝

 var a=[1,2,3]
    var b=[...a];
    b.push(4);
    console.log(b);//1,2,3,4
    console.log(a)//1,2,3

把20200901转换为2020/09/01

var str="20200901"
var pattern = /(\d{4})(\d{2})(\d{2})/;
str = str.replace(pattern, '$1-$2-$3');
str =str.replace(new RegExp(/-/gm), "/"); //将所有的'-'转为'/'即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值