为什么使用_.map()的reverse2函数有效,但arr.map()在这种情况下不起作用?有语法问题吗?我无法弄明白。
function reverse2(arr){
return _.map(arr, function(val,index, arr1){return arr1.pop();});
}
console.log(reverse2([1,2,3,4,5,6])); // logs [6,5,4,3,2,1]
function reverse3(arr){
return arr.map(function(val,index, arr1){return arr1.pop();});
}
console.log(reverse3([1,2,3,4,5,6])); // logs [6,5,4,undefined, undefined, undefined]
答案 0 :(得分:5)
这是一个棘手的问题。要解释Array.prototype.map行为的原因,我们需要检查specification。所以:
要注意的重点是#2和#6。显而易见,map
创建了一个与原始相同长度的新数组。
然后关于方法的同一部分的另一件事:
...如果更改了数组的现有元素,它们传递给callbackfn的值将是时间映射访问它们时的值; >>在地图的调用开始之后和访问之前删除的元素不会被访问。
它给出了你的问题的答案:map将创建一个相同长度的数组但是因为在迭代函数中你从原始数组中移除元素(使用pop
),新数组只填充了后半部分原来。
为什么下划线_.map
功能表现不同?因为它的实现迭代原始数组的所有项。因此存在差异。
答案 1 :(得分:1)
array.map
first call: [1,2,3,4,5,6], position 0 hash value '1', so pop 6.
seconde call: [1,2,3,4,5], position 1 hash value '2', so pop 5.
third call: [1,2,3,4], position 2 hash value '3', so pop 4.
fourth call: [1,2,3], position 3 hash no value, so pop nothing.