lodash times 函数的一点疑问,bug or feature?
先上源码:
const MAX_SAFE_INTEGER = 9007199254740991
const MAX_ARRAY_LENGTH = 4294967295
function times(n, iteratee) {
if (n < 1 || n > MAX_SAFE_INTEGER) {
return []
}
let index = -1
const length = Math.min(n, MAX_ARRAY_LENGTH)
const result = new Array(length)
while (++index < length) {
result[index] = iteratee(index)
}
index = MAX_ARRAY_LENGTH
n -= MAX_ARRAY_LENGTH
while (++index < n) {
iteratee(index)
}
return result
}
疑惑点在后半段
`index = MAX_ARRAY_LENGTH`
n -= MAX_ARRAY_LENGTH
while (++index < n) {
iteratee(index)
}
我的理解是,如果 n
是在 MAX_ARRAY_LENGTH
和 MAX_SAFE_INTEGER
之间的数字时,只有 0
到 MAX_ARRAY_LENGTH
之间 iteratee
得到的结果会存入结果 result
中,但是 iteratee
还是会调用 n
次,只不过后面的结果会舍弃。
按照这个的理解,后半段应该是这样才对:
while (++index < n) {
iteratee(index)
}
但是源码会将 n -= MAX_ARRAY_LENGTH
,即在 n - MAX_ARRAY_LENGTH
的结果比 MAX_ARRAY_LENGTH
还要大时,才会进行额外的 iteratee
调用。
所以这样做的目的是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不对吧