讲到深浅拷贝,涉及到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.该博客结合数组去重那篇博客,再去看看之前的自选功能博客,会发现有很大的优化空间!!!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217042.html原文链接:https://javaforall.net
