Nig*_*age 1 javascript arrays ecmascript-6
Javascript有一些很好的功能,如.map,.filter等.
无论你的数组是否稀疏,这些工作都很棒.他们在数组中每个项目触发一次callbackfn.优秀.
现在还有.find和.findIndex函数,但是它们的工作方式不同.它们在阵列中的每个INDEX中触发一次谓词.与稀疏数组一起使用时,这是完全不正确的行为.
例如,如果您有一个范围为1000 - 1100的数组,则在最终获取实际数据之前,您的谓词将运行1000次传递未定义作为输入参数.
我觉得... a)所有这些函数应该以类似的方式工作(.map和.filter使它正确,而.find和.findIndex做错了)b)这是一个bug,应该修复
思考?
行为符合规范.查看当前的规范草案,比较,例如:
Array.prototype.filter()处理前存在值的测试规范(步骤8c):
- 重复,而
k < len
a.我们Pk来吧!ToString(k).
湾 我们kPresent呢?HasProperty(O, Pk).
C.如果kPresent是真的,那么[...]
规范Array.prototype.find()不会在处理之前测试值的存在:
- 重复,而
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()规范,但在当时普遍的共识似乎是"孔:没有人希望他们".
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |