【问题标题】:Javascript _.map() vs array.map(); why does one work here and not the other?Javascript _.map() 与 array.map();为什么一个在这里工作而不是另一个?
【发布时间】:2015-08-18 16:52:33
【问题描述】:

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

【问题讨论】:

  • 永远不要在迭代数组时修改它。或者期望任何事情都能像那样工作。
  • 原生的map 方法跳过了漏洞。所以不要从中删除元素。
  • 看起来 _.map 在将数组传递给回调之前不会复制数组,就像 OEM 所做的那样。它也有一些其他的不符合项,但它们允许比原生更快的操作。

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


【解决方案1】:

Array.prototype.map

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

  1. O 成为调用 ToObject 并传递 this 值作为参数的结果。
  2. lenValue 为使用参数“length”调用 O 的 [[Get]] 内部方法的结果。李>
  3. len 为 ToUint32(lenValue)。
  4. 如果 IsCallable(callbackfn) 为 false,则抛出 TypeError 异常。
  5. 如果提供了 thisArg,则让 TthisArg;否则让 Tundefined
  6. A 是一个新数组,就像由表达式 new Array(len) 创建的一样,其中 Array 是标准的内置构造函数lenlen 的值。 ...

这里要注意的重点是#2 和#6。从他们看来,map 创建了一个与原始数组长度相同的新数组。

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

...如果数组的现有元素发生变化,它们传递给 callbackfn 的值将是 map 访问它们时的值;在对 ma​​p 的调用开始之后且在被访问之前被删除的元素不会被访问。

它回答了您的问题:map 将创建一个相同长度的数组,但由于在迭代函数中您要从原始数组中删除元素(使用pop),新数组仅填充原始数组的后半部分.

_.map

为什么 Underscore _.map 函数的行为不同?因为它的实现迭代了原始数组的所有项。因此有区别。

【讨论】:

    【解决方案2】:
    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.
    

    【讨论】:

    • 你没有说明这是如何回答问题的。
    • 它解释了为什么array.map不起作用,他可以为像你这样的人做一个更好的介绍,但是没关系。
    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2020-07-04
    • 2016-10-31
    相关资源
    最近更新 更多