js的非构造函数的继承问题

tentou
  • 671

图片描述

第三个红框--这个c[i]p[i]中的i是他们的length(数组里对应的位数)吗?那如果是位数的话,i in p 这句就应该理解为i这个角标在对象p里了啊,完全不理解晕啊···还有这整句是让c对象里的值分别指向p对象里的对应值吗?
第二个红框--为什么还要调用一次他自身这个函数呢?那样不就一直在循环调用了吗?
第一个红框--让c[i]=[]和让c[i]={}有什么区别吗,一个是对象一个是数组没有什么区别吧,在这里?

好混乱,希望能有大神帮帮我,理一下这个思路,小弟万分感谢的〒_〒

回复
阅读 2.4k
6 个回答

for...in循环是变量对象中的key的循环,并不是你理解的数组角标。

比如对于这么一个对象:

{
    a : [...],
    b : {...},
    c : 3
}

for...in循环遍历到的是a、b、c3个键。然后在循环里面会判断每个属性的类型,如果是基本类型(例如上面对象中的c),就直接拷贝。如果是对象(例如a和b),就递归地调用该函数进行深度拷贝。

至于数组和对象,它们确实区别不大,即使不进行区分也不会报错,但是既然是拷贝一个对象,那么保持新对象的属性类型与原对象的相同不是更好吗?你想想是不是这个道理。

要理解这个函数的功能。

第三个框,`i` 是"数组下标(其实它是string类型)"还是object的key,取决于p。

第二个框是递归,理解一下深拷贝

第一个框, c[key]是数组还是对象还是值取决于传进来的p。p若是对象,有数组和对象两种拷贝处理方式,这也就是[]和{}区别。

function deepCopy(p, c) {
    var c = c || {};    
    for(var i in p) {    //遍历p对象,第一次for...in时i为a,p[i] = ["1", "2"];
        if(typeof p[i] === "object") {
            c[i] = (p[i].constructor === Array) ? [] : {}; //既然是深拷贝,那就要保留原对象的类型
            deepCopy(p[i], c[i]);  
            //这里是递归,第一次for...in时执行deepCopy(["1", "2"], {});
            //此时,在deepCopy(["1", "2"], {})里,分析下就知道for(var i in p)里的i就是传入数组p(即["1", "2"])的下标,
            //那p[i]!== "object"……然后返回c = ["1", "2"]。
            //再回到刚才接着第二次for...in,此时i为b,p[i]为"a",接下来怎样,应该明白吧。
        } else {
            c[i] = p[i];  
        }
    }
    return c;
}
var p = {
    a: ["1", "2"], 
    b: "aa", 
    c: {
        a: 1, 
        b: ["1"]
    }
};
deepCopy(p);
  1. 第一个框是数组还是对象肯定有区别啊,按照代码来看,deepCopy的用途是深复制,把函数第一个形参复制给第二个形参,比如现在 p对象 有一个arr属性是数组,而 c 本来没有arr这个属性,现在初始化c.arr成{}的话,p.arr怎么赋值给c.arr?

  2. 第二个框就是递归,他是在一直循环调用,but不是无限循环,会一直循环到那个属性不是object然后不进入if语句直接执行else语句然后return,就会回到上层循环。

  3. for...in 这个方法里面的i是数组角标还是对象属性名要看p是对象还是数组。

这个问题,关键是你要去彻底弄懂
for i in的含义:

  • 数组来说,i指数组的下标,即1、2、3等等。

  • 对象来说,i指对象可枚举的属性的名称。

但是,本质上两种情况可以合并成一种情况。因为数组也是一种对象,数组的下标就是数组对象的属性。例如:

var arr = ['a', 'b', 'c'];

基本上可以等价于

var arr = {
    '1': 'a', 
    '2': 'b', 
    '3': 'c'
};

所以嘛,你把对象和数组看成一回事儿之后,就能够理解了。

jinyuelong
  • 3
新手上路,请多包涵

其它的没什么,但需要注意:typeof null === "object"

你知道吗?

宣传栏