在js里面,想要把对象克隆,主要来说就是三步:
//遍历对象 for(var prop in obj)
// 1.判断是不是原始值 typeof() object
// 2.判断是数组还是对象 instanceof ||toString ||constructor
(建议使用toString,原因:父子域的问题,判断子域的数组放到父域里面的数组打印出来是false)
// 3.建立相应的数组或者对象
//递归
var obj = {
name : "abc",
age : 123,
arr : ['visa' , 'master'],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
//把obj拷贝到obj1大致思路是这样的,如果是数组[]或者函数{},就递归,如果不是就赋值
var obj1 = {
name : obj.name ,
age : 123 ,
card : [obj.arr[0] , obj.arr[1]],
wife : {
name : obj.wife.name,
son : {
name :obj.wife.son.name
}
}
}
以下是完整深度克隆的代码:
var obj = {
name : "abc",
age : 123,
arr : ['visa' , 'master'],
wife : {
name : "bcd",
son : {
name : "aaa"
}
}
}
var obj1 = {
}
function deepClone(origin , target ) {
var target = target || {},
toStr = Object.prototype.toString,
arrStr = "[object Array]";
//遍历
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
//判断它typeof是不是object,是object那么就是数组[]或者对象{}
if(origin[prop] !== "null" && typeof(origin[prop]) == 'object'){
//用toString方法判断是数组还是对象
if(toStr.call(origin[prop]) == arrStr){
target[prop] = [];
}
else{
target[prop] = {};
}
//递归,数组或者对象里面重复执行
deepClone(origin[prop] , target[prop]);
}
//如果typeof不是object,那么是string或者number,就直接赋值
else{
target[prop] = origin[prop];
}
}
}
return target;
}
控制台得出的结果如下:
下面简单说一下JS判断是数组还是对象的toString方法:
调用toString( )方法试着将该变量转化为代表其类型的string。
var a=[];
var b={};
Object.prototype.toString.call(a) === ‘[object Array]’//true
Object.prototype.toString.call(b) === ‘[object Array]’//false