麻烦老师看下理解是否正确

来源: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、整体理解是可以的,不过其中有一些细节需要注意下,如下:

https://img.mukewang.com/climg/62403822098955fb08950356.jpg

上图圈起来的代码推理过程有误,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语句 => 遍历数组 ,后面就是同学继续分析的过程

祝学习愉快~

0

0 学习 · 15276 问题

查看课程