gpt4 book ai didi

javascript - 为什么 Array.apply(null, [args]) 在处理稀疏数组时表现不一致?

转载 作者:可可西里 更新时间:2023-11-01 01:18:02 24 4
gpt4 key购买 nike

我最近发现了以下 snippet of code on SO帮助使用默认值快速填充数组:

Array.apply(null, new Array(3)).map(function() {return 0;});

鉴于 Array 构造函数和 apply 方法的行为,上面的代码片段也可以这样重写:

Array.apply(null, [undefined, undefined, undefined]).map(function() {return 0;});

在处理您希望使用默认值填充的稀疏数组时,此技术也很有用:

var sparseArr = [3,,,4,1,,],
denseArr = Array.apply(null, sparseArr).map(function(e) {
return e === undefined ? 0 : e;
});

// denseArr = [3,0,0,4,1,0]

然而,其中出现了两个奇怪的现象:

  1. 如果 sparseArr 的最后一项未定义,则该项未映射到 denseArr
  2. 如果 sparseArr 仅包含单个术语(例如 sparseArr = [1])或单个术语后跟单个尾随未定义术语(例如 sparseArr = [1,]),生成的 denseArr 等于 [undefined x 1]

谁能解释这种行为?

最佳答案

new Array(3) […] can also be rewritten as [undefined, undefined, undefined]

不 - 正如您刚刚看到的,数组构造函数创建稀疏数组,因此它应该被重写为 [,,,]

If the final term of of sparseArr is undefined

没有。您忘记了尾随逗号,自 EcmaScript 5 以来这是可选的。实际上 [1] 等同于 [1,] (两者的长度均为 1).

要获得稀疏的“插槽”,您必须添加额外的逗号:

[] // empty array
[,] // empty array
[,,] // [undefined x 1]
[,,,] // [undefined x 2]

If sparseArr contains only a single term, the resulting denseArr equals [undefined x N]

考虑调用 apply method 意味着什么:

Array.apply(null, [3,,4,1]) ≡ Array(3, undefined, 4, 1)
Array.apply(null, [3,4]) ≡ Array(3, 4)
Array.apply(null, [1]) ≡ Array(1)

你知道 Array constructor 是什么在使用单个数字参数调用时执行 - 它创建一个该长度的稀疏数组......

关于javascript - 为什么 Array.apply(null, [args]) 在处理稀疏数组时表现不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22949976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com