JavaScript中的克隆分为浅层克隆和深层克隆。
浅层克隆:
var obj = {
name : 'abc',
age : 123,
sex : 'female',
card:['visa','unionpay']
}
var obj1 = {}
function clone (origin,target) {
var target = target || {};
for (var prop in origin) {
target[prop] = origin[prop];
}
return target;
}
clone(obj,obj1)
创建两个对象obj和obj1,对象obj里面是由属性和属性值的,而obj1是一个空的对象,里面什么东西都没有,现在我们是想把对象obj中的属性克隆到空对象obj1里面。
封装一个克隆功能的函数clone,遍历对象中的原始值或者引用值,然后进行克隆。再返回克隆的结果。
改变各自的原始值不会互相影响到,
不过这种浅层克隆存在一个不足就是:改变引用值会互相影响到
所以就引出了深层克隆:
深层克隆:克隆过来的属性是一样的,改变原始值或者引用值不会互相影响到。
var obj = {
name : 'sunny',
age : 10,
card : ['visa','master'],
wife : {
name : 'xiaoming',
son : {
name : 'zhangsan'
}
}
}
var obj1 = {
}
首先我们要遍历对象 for(var prop in obj)
1.判断是不是原始值, typeof() object–>引用值
2.如果是引用值,判断是数组还是对象
(instanceof toString constructor)
3.建立相应的数组或对象
4.递归
封装一个克隆功能函数:
function deepClone(origin,target){
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
//对克隆对象进行遍历
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
//判断是不是引用值
if(typeof(origin[prop]) == 'object'){
//引用值情况为数组的时候
if(toStr.call(origin[prop]) == arrStr){
target[prop] = [];
//引用值情况为对象的时候
}else{
target[prop] ={};
}
//递归
deepClone(origin[prop],target[prop]);
//是原始值的时候
}else{
target[prop] = origin[prop];
}
}
}
return target;//返回克隆后的对象
}
改变引用值不会互相影响到。