te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - Array.find vs Array.forEach in performance - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Array.find vs Array.forEach in performance - Stack Overflow

programmeradmin5浏览0评论

I was wondering if anyone knows if Array.find will short circuit the loop when the first item is found. I couldn't find anything googling.

Has anyone done any performance parisons between find and forEach?

I was wondering if anyone knows if Array.find will short circuit the loop when the first item is found. I couldn't find anything googling.

Has anyone done any performance parisons between find and forEach?

Share Improve this question asked Oct 16, 2019 at 15:52 techguy2000techguy2000 5,1716 gold badges36 silver badges53 bronze badges 7
  • I think it almost certainly does escape the loop – ControlAltDel Commented Oct 16, 2019 at 15:53
  • The docs for find explicitly state it returns as soon as the first match is found. – Dave Newton Commented Oct 16, 2019 at 15:53
  • 3 Yes, it does, as the MDN page clearly states – Pointy Commented Oct 16, 2019 at 15:53
  • 2 I'm voting to close this question as off-topic because this is not a benchmarking, not programming question – ControlAltDel Commented Oct 16, 2019 at 15:54
  • ah. not sure how i missed it. it does say immediately return. so it think it's safe to assume it will be more performant than forEach – techguy2000 Commented Oct 16, 2019 at 15:56
 |  Show 2 more ments

3 Answers 3

Reset to default 9

The find() method returns the value of the first element in the provided array that satisfies the provided testing function.

https://developer.mozilla/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Array.find will return the first result that matches the callback condition.

Performance wise they're both O(n), albeit find is likely to cycle through less loops, therefore would be more performent in that respect.

I was wondering if anyone knows if Array.find will short circuit the loop when the first item is found.

Yes, it will. This is clear from the spec, which shows it bailing as soon as the callback has returned a truthy value. Step 6(d):

If testResult is true, return kValue.

(Separately, it would be odd to keep searching even though a result had been found. If there had been early spec language doing that, it would have been caught and corrected before being finalized, and/or challenged by the makers of JavaScript engines [and others] as being inefficient.)

As you can see the polyfill code in here, you can notice that find loops until if there is something matched item.

Here is the part of that;

// 6. Repeat, while k < len
      while (k < len) {
        // a. Let Pk be ! ToString(k).
        // b. Let kValue be ? Get(O, Pk).
        // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
        // d. If testResult is true, return kValue.
        var kValue = o[k];
        if (predicate.call(thisArg, kValue, k, o)) {
          return kValue;
        }
        // e. Increase k by 1.
        k++;
      }

So, ∀ n ∈ [0, len - 1]: n <= len - 1

发布评论

评论列表(0)

  1. 暂无评论