lodash times 函数的一点疑问,bug or feature?

发布于 2022-09-12 03:07:03 字数 1253 浏览 34 评论 0

先上源码:

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_LENGTHMAX_SAFE_INTEGER 之间的数字时,只有 0MAX_ARRAY_LENGTH 之间 iteratee 得到的结果会存入结果 result 中,但是 iteratee 还是会调用 n 次,只不过后面的结果会舍弃。

按照这个的理解,后半段应该是这样才对:

while (++index < n) {
    iteratee(index)
  }

但是源码会将 n -= MAX_ARRAY_LENGTH ,即在 n - MAX_ARRAY_LENGTH 的结果比 MAX_ARRAY_LENGTH 还要大时,才会进行额外的 iteratee 调用。

所以这样做的目的是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

王权女流氓 2022-09-19 03:07:03

不对吧

index = MAX_ARRAY_LENGTH
n -= MAX_ARRAY_LENGTH
while (++index < n) {
    iteratee(index)
  }
 这段代码的意思是 n > 2 * MAX_ARRAY_LENGTH 才会额外执行吧。
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文