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

时间:2017-02-08 02:45:28

标签: javascript arrays ecmascript-6

Javascript有一些不错的功能,如.map,.filter等。

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

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

例如,如果你有一个范围为1000-1100的数组,你的谓词将运行1000次,传递未定义作为输入参数,最后得到你的实际数据。

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

思想?

1 个答案:

答案 0 :(得分:6)

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

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

      
        
    1. 重复,同时k < len
        一个。让Pk成为! ToString(k)
        湾让kPresent成为? HasProperty(O, Pk)
        C。如果kPresent为真,那么 [...]
    2.   
  • Array.prototype.find()的规范未在处理前测试值的存在:

      
        
    1. 重复,同时k < len
        一个。让Pk成为! ToString(k)
        湾让kValue成为? Get(O, Pk)
        C。 [...]
    2.   

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

至于此处的设计注意事项,我只能在这一点上猜测,但如果您认为这是一个错误,您可以提交错误报告here

<强>更新

似乎find()findIndex()方法的原始规范草案确实实现了数组漏洞检查/跳过。根据会议纪要,这些草案是在March 14th 2013 ECMA Technical Committee 39 meeting提出的。

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

  

Array#findArray#findIndex应将漏洞视为undefined   而不是跳过它们,以便与最近的趋势保持一致   TC39将洞视为undefined

这个问题似乎已经在discussion about the proposed behavior for Array.prototype.includes()围绕着是否

的问题得到了支持
[,,,].includes(undefined)

应该返回true或false。

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

随后在ECMAScript 6草稿的revision 27中删除了find()findIndex()方法的孔检查。

通过链接资源阅读,您可以更加全面地了解导致从find()findIndex()规范中删除漏洞检查/跳过的内容,但当时的普遍共识似乎是是&#34;漏洞:没有人想要他们&#34;