第三个红框--这个c[i]
和p[i]
中的i
是他们的length
(数组里对应的位数)吗?那如果是位数的话,i in p
这句就应该理解为i
这个角标在对象p
里了啊,完全不理解晕啊···还有这整句是让c
对象里的值分别指向p
对象里的对应值吗?
第二个红框--为什么还要调用一次他自身这个函数呢?那样不就一直在循环调用了吗?
第一个红框--让c[i]=[]
和让c[i]={}
有什么区别吗,一个是对象一个是数组没有什么区别吧,在这里?
好混乱,希望能有大神帮帮我,理一下这个思路,小弟万分感谢的〒_〒
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
for...in
循环是变量对象中的key
的循环,并不是你理解的数组角标。比如对于这么一个对象:
for...in
循环遍历到的是a、b、c
3个键。然后在循环里面会判断每个属性的类型,如果是基本类型(例如上面对象中的c
),就直接拷贝。如果是对象(例如a和b
),就递归地调用该函数进行深度拷贝。至于数组和对象,它们确实区别不大,即使不进行区分也不会报错,但是既然是拷贝一个对象,那么保持新对象的属性类型与原对象的相同不是更好吗?你想想是不是这个道理。
要理解这个函数的功能。
第三个框,`i` 是"数组下标(其实它是string类型)"还是object的key,取决于p。
第二个框是递归,理解一下深拷贝
第一个框, c[key]是数组还是对象还是值取决于传进来的p。p若是对象,有数组和对象两种拷贝处理方式,这也就是[]和{}区别。
第一个框是数组还是对象肯定有区别啊,按照代码来看,deepCopy的用途是深复制,把函数第一个形参复制给第二个形参,比如现在 p对象 有一个arr属性是数组,而 c 本来没有arr这个属性,现在初始化c.arr成{}的话,p.arr怎么赋值给c.arr?
第二个框就是递归,他是在一直循环调用,but不是无限循环,会一直循环到那个属性不是object然后不进入if语句直接执行else语句然后return,就会回到上层循环。
for...in
这个方法里面的i
是数组角标还是对象属性名要看p是对象还是数组。这个问题,关键是你要去彻底弄懂
for i in
的含义:对数组来说,
i
指数组的下标,即1、2、3等等。对对象来说,
i
指对象可枚举的属性的名称。但是,本质上两种情况可以合并成一种情况。因为数组也是一种对象,数组的下标就是数组对象的属性。例如:
基本上可以等价于
所以嘛,你把对象和数组看成一回事儿之后,就能够理解了。
其它的没什么,但需要注意:typeof null === "object"