Javascript Array.find()有稀疏数组的问题

Nig*_*age 1 javascript arrays ecmascript-6

Javascript有一些很好的功能,如.map,.filter等.

无论你的数组是否稀疏,这些工作都很棒.他们在数组中每个项目触发一次callbackfn.优秀.

现在还有.find和.findIndex函数,但是它们的工作方式不同.它们在阵列中的每个INDEX中触发一次谓词.与稀疏数组一起使用时,这是完全不正确的行为.

例如,如果您有一个范围为1000 - 1100的数组,则在最终获取实际数据之前,您的谓词将运行1000次传递未定义作为输入参数.

我觉得... a)所有这些函数应该以类似的方式工作(.map和.filter使它正确,而.find和.findIndex做错了)b)这是一个bug,应该修复

思考?

Rob*_*sen 6

行为符合规范.查看当前的规范草案,比较,例如:

  • Array.prototype.filter()处理前存在值的测试规范(步骤8c):

    1. 重复,而k < len
      a.我们Pk来吧!ToString(k).
      湾 我们kPresent呢?HasProperty(O, Pk).
      C.如果kPresent是真的,那么[...]
  • 规范Array.prototype.find()不会在处理之前测试值的存在:

    1. 重复,而k < len
      a.我们Pk来吧!ToString(k).
      湾 我们kValue呢?Get(O, Pk).
      C.[...]

因此,正如您所说,行为确实不同,而且规范也不同.

至于设计考虑因素,我只能在这一点上猜测,但如果您认为这是一个错误,您可以在此处提交错误报告.


更新

看起来这些find()findIndex()方法的原始规范草案确实实现了阵列孔检查/跳过.根据会议纪要,这些草案是在2013年3月14日ECMA技术委员会第39次会议上提出的.

2014年8月,提出了一个错误,认为阵列孔应该被视为undefined而不是跳过它们.

Array#find并且Array#findIndex应该对孔进行处理undefined 而不是跳过它们,以便与TC39最近将孔洞处理成趋势保持一致undefined.

这个问题似乎在讨论Array.prototype.includes()围绕是否存在的问题的拟议行为时得到了支持

[,,,].includes(undefined)
Run Code Online (Sandbox Code Playgroud)

应该返回true或false.

同样在本次讨论中,[...] TC39最近的趋势是将孔视为未定义.

随后在ECMAScript 6草案的修订版27中删除了find()findIndex()方法的孔检查.

通过链接的资源阅读,你可以得到什么导致去除孔检查/从跳过更完整find()findIndex()规范,但在当时普遍的共识似乎是"孔:没有人希望他们".

  • @nnnnnn我已经更新了我的答案.我想我已经能够找到足够的资源来说明当前指定的行为是如何形成的. (2认同)