深克隆的其他写法
在使用for...in...时,我发现该循环遍历方式对于数组同样成立,只不过遍历的是数组的下标,考虑到数组和对象都使用方括号进行访问和设置值,因此我得到了下面的深克隆写法。
function deepCopy(value1) {
var result;
if(Array.isArray(value1)){
result = [];
}else if(typeof value1 ==="object"){
result = {};
}else{
throw "must be array or object";
}
for(var attr in value1){
if(typeof value1[attr]==="object"){
result[attr] = deepCopy(value1[attr]);
}else{
result[attr] = value1[attr];
}
}
return result;
}
该深克隆函数只能对传入为数组或对象进行克隆,从通用性上不如老师的示例代码,因此我对其进行了改进,改进后的函数如下:
function deepCopy(value) {
if (Array.isArray(value)){
return copyElementFor(value,[]);
}
else if(typeof value==="object"){
return copyElementFor(value,{});
}
else return value;
function copyElementFor(value,collection) {
for(var attr in value){
collection[attr] = deepCopy(value[attr]);
}
return collection;
}
}
该深克隆函数通过两个函数之间互相调用实现深克隆,同老师视频中示例相比,语义性更好。我想请问下,这种实现方式是否推荐,在开发中使用深克隆是通过调用工具库中的函数,还是需要自己书写?
老师的代码如下,数组遍历进行了改动:
function deepClone(value) {
var result;
if(Array.isArray(value)){
result = value.map(deepClone);
}else if(typeof value ==="object"){
result = {};
for(var key in value){
result[key] = deepClone(value[key]);
}
}else{
result = value;
}
return result;
}
36
收起
正在回答
1回答
同学你好,同学对于深克隆的理解很深刻,改进后的代码也是可以的,在js中实现一个功能的方式有很多,代码也不是唯一的,所以不管是同学自己书写的关于深克隆的代码,还是对于老师的代码进行的改进都非常不错。对于在开发中使用深克隆的话,一般是将其写在工具库中,方便大家来调用,而不是哪里用到就在哪里写一套代码,这样不利于项目的开发效率和后期维护。祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星