麻烦老师看下理解是否正确
来源:2-10 对象的深浅克隆(2)
dww1
2022-03-27 17:19:53
<script>
var obj1={
a:1,
b:2,
c:[33,44,{
m:55,
n:66,
p:[77,88]
}]
};
function deepClone(o){
//判断o是对象还是数组
if(Array.isArray(o)){//Array.isArray(o) == true
//数组
var result=[];
for(var i=0;i<o.length;i++){
result.push(deepClone(o[i]));
}
}else if(typeof o =='object'){ // typeof 数组也是object
//对象
var result={};
for(var k in o){
result[k]=deepClone(o[k]);
}
}else{
//基本类型值
var result=o;
console.log(result);
}
return result;
}
var obj2=deepClone(obj1);
console.log(obj2);1
obj1是一个对象 所以 判断的时候会执行else if 语句 那么
第一次调用 deepClone
result.a=deepClone(o[1]) --result.a=deepClone(o.a==1)
result.a=deepClone(o[2]) --result.a=deepClone(o.a==2)
result.a=deepClone(o[3]) --result.a=deepClone(o.a==3)
第二次调用deepClone 再次判断是否为数组 对象 基本类型值 执行else 语句 后新建一个变量来接收这个数值 返回的result就是这个数值 相当于 deepClone(o.a==1) ==1
得到
result.a=1
result.a=2
result.c=deepClone(【33,44,{}】) 第二次调用就结束了 返回result 并且 result.a result.b 完成克隆
第三次调用deepClone 函数 再次判断是否为数组 对象 基本类型值 执行if语句,新建一个变量来接收这个数组,
result.push(deepClone(o[0]))
result.push(deepClone(o[1]))
result.push(deepClone(o[2]))
前两项为基本类型值 return 的值 为33 44
而deepClone(o[2] )--o[2]是一个对象 会再次判断
完成了 result.m=55, result.n=66 后
再次调用deepClone 函数
result.push(deepClone(o[0]))
result.push(deepClone(o[1])) 基本类型值 返回result的值 推入到result数组
函数的调用的次数貌似没有这么少 一个for循环结束后 函数都会对每个语句进行调用吗
1回答
好帮手慕慕子
2022-03-27
同学你好,对于你的问题解答如下:
1、for循环时,调用函数,执行函数内部的代码时,会对里面的每个语句进行调用
2、整体理解是可以的,不过其中有一些细节需要注意下,如下:

上图圈起来的代码推理过程有误,for...in遍历对象时,里面的k对应的是属性名,而不是索引。应该是
result.a = deepClone(obj.a) => 调用deepClone,传入的是基本类型值,直接返回结果 => result.a = 1
result.b = deepClone(obj.b) => 调用deepClone,传入的是基本类型值,直接返回结果 => result.b = 2
result.c = deepClone(obj.c) => 调用deepClone,传入的是数组[33,44,{m: 55, n: 66, p:[77,88]}] => 执行if语句 => 遍历数组 ,后面就是同学继续分析的过程
祝学习愉快~
相似问题