Javascript _.map()vs array.map();为什么一个人在这里而不是另一个人?

为什么使用_.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]
最佳答案
Array.prototype.map

这是一个棘手的问题.为了解释为什么Array.prototype.map这样做,我们需要检查specification.所以:

>设O是调用ToObject传递此值作为参数的结果.
>让lenValue成为使用参数“length”调用O的[[Get]]内部方法的结果.
>让len为ToUint32(lenValue).
>如果IsCallable(callbackfn)为false,则抛出TypeError异常.
>如果提供了thisArg,则让T为thisArg;否则让T不确定.
>设A是一个新的数组,就像表达式new Array(len)一样,其中Array是具有该名称的标准内置构造函数,len是len的值.

这里要注意的重点是#2和#6.很明显,map会创建一个与原始数组长度相同的新数组.

然后关于方法的同一部分的另一件事:

… If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time map visits them; elements that are deleted after the call to map begins and before being visited are not visited.

它给出了你的问题的答案:map将创建一个相同长度的数组但是因为在迭代函数中你从原始数组中移除元素(使用pop),新数组只填充原始的后半部分.

_.地图

为什么Underscore _.map功能表现不同?因为它的实现迭代原始数组的所有项.因此差异.

转载注明原文:Javascript _.map()vs array.map();为什么一个人在这里而不是另一个人? - 代码日志