【发布时间】:2018-12-17 04:17:49
【问题描述】:
Mozilla 说:
map 不会改变调用它的数组(尽管回调,如果 调用,可以这样做)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
具体来说,回调传递的第三个参数是:
调用了数组映射。
我假设这意味着内存中的数组位置通过引用复制到回调中。
所以通过改变第三个参数,我们应该改变原始数组,但是下面两个 sn-p 给出的结果是冲突的:
案例1,重新赋值第三个参数并没有改变原始数组:
var A = [1, 2, 3];
A.map((v,i,_A) => {
console.log("_A is the array map invoked on: ", _A===A); // true
_A = []; // reassign an empty array
return v;
});
console.log("'A' did not mutate:", A) // [1, 2, 3] did not mutate
情况2,将第三个参数设置为零长度会改变原始数组:
var B = [1, 2, 3];
B.map((v,i,_B) => {
console.log("_B is the array map invoked on: ", _B===B); // true
_B.length = 0; // clearing the array by setting it zero length
return v;
});
console.log("'B' has mutated:", B) // [] mutated
很明显,在第二种情况下,原始数组发生了变异(迭代器只执行一次)。 但我错过了什么?为什么会出现矛盾的结果?
【问题讨论】:
-
为什么将新值重新分配给指向源数组的
Array.prototype.map的第三个参数会更改源数组?A和Array.prototype.map的第三个参数是 2 个不同的变量
标签: javascript arrays