方法1.我们可以利用js自带的方法JSON利用其中的原理将原数据深拷贝转成一个新的数据
JSON.stringify() 将真正的对象和数组转成字符串 JSON.parse()
// 数组
var arr1 = ["a","b","c",["1","2","3"]];
var arr2 = JSON.stringify(arr1);
arr2 = JSON.parse(arr2);
arr2[3][0] = "9";
console.log(arr2);// ["a","b","c",[9 2 3]]
console.log(arr1);// ["a","b","c",[1 2 3]]
方法2.使用jQuery自带的方法
var arr1 = ["a","b","c",["1","2","3"]];
var arr2 = $.extend(true,[],arr1);
arr2[3][0] = "999";
console.log(arr2);//['a', 'b', 'c', ['999', '2', '3']]
console.log(arr1);//['a', 'b', 'c', ['1', '2', '3']]
方法3 写一个原生js深拷贝
封装的时候我们不确定传入进来的复杂数据时Array还是Object类型
typeof 无法判断具体的数据类型
instanceof 也无法具体判断数据类型
我们用Object.prototype.toString.call(当前数据).slice(8,-1)
利用对象构造函数中原型属性tostring让它的this指向我的当前数据.
不嫌麻烦可以截取一下对应的字符串
function getDateType(date){
return Object.prototype.toString.call(date).slice(8,-1);
}
深拷贝原生写法
function deepDateObj(dateObj){
if(getDateType(dateObj) == "Array"){
var obj = [];
}else if(getDateType(dateObj) == "Object"){
var obj = {};
}else{
return dateObj;
}
for(var key in dateObj){
if(getDateType(dateObj[key]) == "Array" || getDateType(dateObj[key]) == "Object"){
// 如果再次遇到复杂数据类型,就将当前函数内的方法再走一次
// 把返回的新结果给到之前的位置
obj[key] = deepDateObj(dateObj[key]);
}else{
obj[key] = dateObj[key];
}
}
return obj;
}