1.深拷贝和浅拷贝的定义:
其实深拷贝和浅拷贝都是针对的引用类型,JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会进行地址的拷贝,最终两个变量指向同一份数据
2.浅拷贝的实现
var obj={
name:'abc',
age:123,
sex:'female',
card:['1','2','3']
}
function shallowClone(origin){
var target={};
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
target[prop]=origin[prop];
}
}
return target;
}
var obj2=shallowClone(obj);
console.log(obj2);
3.递归方法来实现深拷贝
补充知识:如何判断数组和对象
第一种方法 利用constructor
控制台打印:[].constructor -----> f Array(){[native code]}
var obj = {} 控制台打印 obj.constructor ----->f Object(){[native code]}第二种方法 利用 instanceof
[] instanceof Array ----->true
var obj = {}; obj instanceof Object ----> true第三种方法 利用toString
Object.prototype.toString.call([]); -----> [object Array]
Object.prototype.toString.call({}); -----> [object object]
Object.prototype.toString.call(123); -----> [object Number]
function deepClone(origin,target){
var target=target||{};
for(var prop in origin){
var str=Object.prototype.toString,
arrStr='[object Array]';
if(origin.hasOwnProperty(prop)){
if(typeof(origin[prop])=='object'){
if(str.call(origin[prop])==arrStr){
target[prop]=[];
}
else{
target[prop]={};
}
deepClone(origin[prop],target[prop]);
}
else{
target[prop]=origin[prop];
}
}
}
}
deepClone(obj,obj1);
3.对于数组的concat和slice方法实现的是首层深拷贝