js深浅拷贝

讲到深浅拷贝,涉及到JavaScript的数据类型。js中的数据类型分为基础型和引用型。基础型存储在栈中,引用类型存储在堆中。

基础类型并没有深浅拷贝之说,这里所说的深浅拷贝针对的是引用类型数据而言(牢牢记住这句)。

通俗点讲,区分深/浅拷贝,就是假设B复制了A,当修改A时,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。

for..in循环遍历所有可枚举的属性的键,包括继承来的属性的键。

Object.keys()返回所有自有可枚举属性的键。

Object.values()(ES7)返回所有可枚举属性的值。

Object.entries()(ES7)可返回所有可枚举属性的键和值。

实现深拷贝的方法:

1.递归

function deepCopy(obj){
    let objCopy = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                if(obj[key]&&typeof obj[key] ==="object"){
                    objCopy[key] = deepCopy(obj[key]);
                }else{
                    //如果不是,简单复制
                    objCopy[key] = obj[key];
                }
            }
        }
    }
    return objCopy;
}    
let a=[1,2,3,4],
    b=deepCopy(a);
a[0]=2;
console.log(a,b);

2.除了递归,我们还可以借用JSON对象的parse和stringify

function deepClone(obj){
    let _obj = JSON.stringify(obj),
        objClone = JSON.parse(_obj);
    return objClone
}    
let a=[0,1,[2,3],4],
    b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

3.除了上面两种方法之外,我们还可以借用JQ的extend方法。

let a=[0,1,[2,3],4],
    b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

4.该博客结合数组去重那篇博客,再去看看之前的自选功能博客,会发现有很大的优化空间!!!

你可能感兴趣的:(记录)