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

jma*_*rje 5 javascript callback higher-order-functions underscore.js

为什么使用_.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]
Run Code Online (Sandbox Code Playgroud)

dfs*_*fsq 5

Array.prototype.map

这是一个棘手的问题.为了解释为什么Array.prototype.map以这种方式运行,我们需要检查规范.所以:

  1. O是调用ToObject传递值作为参数的结果.
  2. lenValue是使用参数" length " 调用O的[[Get]]内部方法的结果.
  3. len为ToUint32(lenValue).
  4. 如果IsCallable(callbackfn)为false,则抛出TypeError异常.
  5. 如果提供thisArg,则让TthisArg ; 不然,牛逼不确定.
  6. 是创建一个新的数组,就好像由表达式新阵列(LEN) ,其中阵列是标准内置构造具有该名称和LEN是的值LEN....

这里要注意的重点是#2和#6.从它们中可以看出,map创建一个与原始数组长度相同的新数组.

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

...如果更改了数组的现有元素,它们传递给callbackfn的值将是时间映射访问它们时的值; 不会访问在调用map之后和访问之前删除的元素.

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

_.地图

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