代码之家  ›  专栏  ›  技术社区  ›  James Monger

为什么Array.prototype.filter会删除空元素而不考虑回调?

  •  3
  • James Monger  · 技术社区  · 6 年前

    我有一个数组,其中有一些空元素,我正在调用 .filter 在该数组上使用始终返回true的回调。

    [1, 2, , 5].filter(() => true);
    

    [1, 2, 5]

    作为比较, Array.prototype.map 对空项目执行回调:

    [1, 2, , 5].map(x => x); // returns [1, 2, , 5]
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   IceMetalPunk    6 年前

    在里面 map ,则不会为每个元素调用回调(您可以通过将回调中的值记录到 ),但会保留关键帧,从而在结果中留下空插槽。过滤器不会保留关键点(因为过滤通常会移动关键点),因此这些关键点会丢失。不过,这两个操作实际上都没有在空插槽上运行回调。

        2
  •  0
  •   Nina Scholz    6 年前

    Array#map undefined 用于稀疏项,而不是调用回调,但保持数组的长度相同。

    22.1.3.16 Array.prototype.map(callbackfn[,thisArg])

    callbackfn 仅对实际存在的数组元素调用;这是不必要的

    console.log([1, 2, , 5].map((v, i) => [i, v]));