今天的学习笔记写在了自己的网页笔记本上,没有记录到博客,但是学到一个有关深拷贝的实现方法,为加深印象,这里给大家分享一下:
深拷贝:就是拷贝到最底层的属性。
function deepCopy(object){ //这里传入一个拷贝的对象
/*这里定义一个返回的新对象,也就是拷贝完成后的对象*/
let newObject = Array.isArray(object) ? []: {}; // 首先定义对象类型,如果传入的是数组,则定义一个空数组,如果是对象,则定义一个空对象
if(object && typeof(object) === 'object'){ //这里再次判断他是一个对象,是则继续进行操作
for(key in object){ //在这里遍历他的属性,并接着判断属性是不是一个对象类型
if(object.hasOwnProperty(key)){ //如果对象却是有这个属性,接着操作
if(object[key] && typeof(object[key]) === 'object'){ //如果说这个属性还是一个对象的话,
newObject[key] = deepCopy(object[key]);//先拷贝这个属性,然后把这个对象在进行拷贝,进行一个递归,
}else{ // 如果这个属性不是对象的话,则拷贝完成,直接赋属性
newObject[key] = object[key];
}
}
}
}
return newObject; //最后把这个新对象返回出去
}
/*进行一个数组测试测试*/
let a = [1,2,3,4];
let obj = new Object();
let b = deepCopy(a);
a[0] = 10;
console.log(a,b); // => a=[10,2,3,4],b=[1,2,3,4];b的值没改变,说明实现了深拷贝
/*进行一个对象测试测试*/
let obj1 = new Object({name: '屠永涛'});
let obj2 = deepCopy(obj1);
obj1.name = '小屠永涛';
console.log(obj1.name,obj2.name);// obj1.name:小屠永涛,obj2.name:屠永涛说明实现了深拷贝
写完之后个人觉得还差点东西,如果传入的不是数组或对象呢,这时候该怎么抛出异常呢? 我尝试了一下,如果传入的是一个普通数据类型,如 Number,那么最后他会返回一个空对象,那么我尝试修改一下,先进行一个判断再操作,希望大家多指教,
function deepCopy(object){ //这里传入一个拷贝的对象
if (object && typeof(object) === 'object') { // **这里加了一个判断**
/*这里定义一个返回的新对象,也就是拷贝完成后的对象*/
let newObject = Array.isArray(object) ? []: {}; // 首先定义对象类型,如果传入的是数组,则定义一个空数组,如果是对象,则定义一个空对象
if(object && typeof(object) === 'object'){ //这里再次判断他是一个对象,是则继续进行操作
for(key in object){ //在这里遍历他的属性,并接着判断属性是不是一个对象类型
if(object.hasOwnProperty(key)){ //如果对象却是有这个属性,接着操作
if(object[key] && typeof(object[key]) === 'object'){ //如果说这个属性还是一个对象的话,
newObject[key] = deepCopy(object[key]);//先拷贝这个属性,然后把这个对象在进行拷贝,进行一个递归,
}else{ // 如果这个属性不是对象的话,则拷贝完成,直接赋属性
newObject[key] = object[key];
}
}
}
}
return newObject; //最后把这个新对象返回出去
} else{
alert("您输入的数据无法进行深拷贝");
}
}
谢谢大家耐心的读解。