forEach在循环之前是否创建了数组的深层副本?

时间:2016-08-10 07:11:32

标签: javascript arrays

这是一个例子

arr1 = [{ b: 2 }, { a: 1 }] // an array with 2 elements

arr1.forEach(function (element, index, array) {

    console.log(element);
    console.log('of');
    console.log(array);
    console.log('');


    arr1.push({ c: 3 });
});

console.log(arr1);

结果

{ b: 2 }
of
[ { b: 2 }, { a: 1 } ]

{ a: 1 }
of
[ { b: 2 }, { a: 1 }, { c: 3 } ]

[ { b: 2 }, { a: 1 }, { c: 3 }, { c: 3 } ]

在上面的示例中,我遍历一个数组并向其中添加更多值,并且在循环时将它们添加到原始数组中

forEach是否使用不同的数组来循环?

2 个答案:

答案 0 :(得分:3)

正如您所看到的,它不会使用不同的数组,即使您将console.log(array);推送到arr1,当您array时,仍会看到新元素。 所以我们知道arr1forEach指向相同的数组。

然而,根据polyfill on MDN,至少forEach所做的是:

在迭代之前,它将提取数组的长度,然后才开始迭代。因此,如果数组的长度在传递给// 2. Let lenValue be the result of calling the Get() internal // method of O with the argument "length". // 3. Let len be toUint32(lenValue). var len = O.length >>> 0; // 6. Let k be 0 k = 0; // 7. Repeat, while k < len while (k < len) { ... } 的函数内部发生变化,则迭代不会改变。

{{1}}

答案 1 :(得分:2)

它不会创建任何数组副本。 对原始数组的引用将传递给forEach函数的数组参数。 请点击以下链接。 http://jkoder.com/foreach-method-in-arrays-functional-programming-in-javascript-part-3/