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

时间:2015-08-18 16:52:33

标签: javascript callback underscore.js higher-order-functions

为什么使用_.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]

2 个答案:

答案 0 :(得分:5)

Array.prototype.map

这是一个棘手的问题。要解释Array.prototype.map行为的原因,我们需要检查specification。所以:

  1. O 成为调用 ToObject 传递 this 值作为参数的结果。
  2. lenValue 成为使用参数" length &调用 O 的[[Get]]内部方法的结果#34;
  3. len 为ToUint32(lenValue)。
  4. 如果IsCallable( callbackfn false ,则抛出 TypeError 异常。
  5. 如果提供了 thisArg ,请 T thisArg ;否则让 T 未定义
  6. A 成为一个新的数组,就像表达式 new Array(len)一样,其中数组是标准的内置构造函数使用该名称, len len 的值。 ...
  7. 要注意的重点是#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.