推送

时间:2017-08-08 09:49:21

标签: javascript arrays

我在搜索有效的javascript groupBy方法

时偶然发现了这段代码
  function transformArr(orig) {
        var newArr = [],
            types = {},
            i, j, cur;
        for (i = 0, j = orig.length; i < j; i++) {
            cur = orig[i];
            if (!(cur.type in types)) {
                types[cur.type] = {type: cur.type, foods: []};
                newArr.push(types[cur.type]);
            }
            types[cur.type].foods.push(cur.food);
        }
        return newArr;
    }

从这里开始:https://stackoverflow.com/a/15888145/2527122

从上面的代码中可以看出,只有当types数组为空时才会调用newArr.push()。

我的问题是什么时候

types[cur.type].foods.push(cur.food);
调用了

,newArray元素中的食物数组也被修改了。

我发现这个控制流程令人困惑,因为在types被填满之后没有更多的推送需要newArray。

任何人都可以帮我解释一下为什么会这样吗?

这是我的第一个StackOverflow问题,对于任何混淆感到抱歉

1 个答案:

答案 0 :(得分:1)

那是因为typesnewArr引用相同的对象(包含相同的foods数组)。 types通过整数索引保存typenewArr的引用。但是引用将导致内存中的相同对象。因此,无论您如何通过types[cur.type]newArr[someIndex]访问此对象都将获得完全相同的对象。

如果使用push修改数组,然后通过引用访问它,您会注意到修改过的数组。

实际上与

相同

var a = [];

var b = {refToArray: a}; // reference the same array
var c = [a]; // reference the same array

// if you do
a.push(1); // or b.refToArray.push(1), c[0].push(1)

// then when you access the array via b property
// you still get the same array
console.log(b.refToArray)

// same via c index
console.log(c[0])

// because
console.log(a === b.refToArray, a === c[0], b.refToArray === c[0])