麻烦老师看下理解是否正确
来源: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语句 => 遍历数组 ,后面就是同学继续分析的过程
祝学习愉快~
相似问题