Javascript有一些不错的功能,如.map,.filter等。
无论你的数组是否稀疏,这些工作都很棒。他们在数组中每个项目触发一次callbackfn。优异。
现在还有.find和.findIndex函数,但这些工作方式不同。它们在阵列中的每个INDEX中触发一次谓词。与稀疏数组一起使用时,这是完全不正确的行为。
例如,如果你有一个范围为1000-1100的数组,你的谓词将运行1000次,传递未定义作为输入参数,最后得到你的实际数据。
我觉得...... a)所有这些函数应该以类似的方式工作(.map和.filter使它正确,而.find和.findIndex正在做错了) b)这是一个错误,应该修复
思想?
答案 0 :(得分:6)
行为符合规范。查看当前的规范草案,比较,例如:
Array.prototype.filter()
的规范测试处理前是否存在值(步骤8c):
- 重复,同时
醇>k < len
一个。让Pk
成为!ToString(k)
。
湾让kPresent
成为?HasProperty(O, Pk)
。
C。如果kPresent
为真,那么 [...]
Array.prototype.find()
的规范未在处理前测试值的存在:
- 重复,同时
醇>k < len
一个。让Pk
成为!ToString(k)
。
湾让kValue
成为?Get(O, Pk)
。
C。 [...]
因此,正如您所说,行为确实不同,而且规范也不同。
至于此处的设计注意事项,我只能在这一点上猜测,但如果您认为这是一个错误,您可以提交错误报告here。
<强>更新强>
似乎find()
和findIndex()
方法的原始规范草案确实实现了数组漏洞检查/跳过。根据会议纪要,这些草案是在March 14th 2013 ECMA Technical Committee 39 meeting提出的。
2014年8月,提出了一个bug,认为阵列孔应该被视为undefined
而不是跳过它们。
Array#find
和Array#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; 。