我在搜索有效的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问题,对于任何混淆感到抱歉
答案 0 :(得分:1)
那是因为types
和newArr
引用相同的对象(包含相同的foods
数组)。 types
通过整数索引保存type
,newArr
的引用。但是引用将导致内存中的相同对象。因此,无论您如何通过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])