请在 2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解有关此工作的一些更多信息。

0
ClojureScript
动力

ES6 可迭代对象: https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Iteration_protocols

在 React 中的使用: https://github.com/facebook/react/blob/30dac4e78de02fb427ee82013160ae875128d7a2/packages/react/src/ReactElementValidator.js#L195-L204


(defn es6-iterator**
  [coll]
  (if (implements? IIterable coll)
    (let [it (-iterator ^not-native coll)]
      #js{:next (fn []
                      (if ^boolean (.hasNext it)
                    #js{:value (.next it), :done false}
                    #js{:value nil, :done true}))})
    ;; 转换为朴素的第一/下一次迭代器
    (ES6Iterator. (seq coll))))

;; 测试可以使用往返测试
(es6-iterator-seq (es6-iterator (hash-map 0 1 2 3)))

(defn es6-iter-consume
  [it]
  (while (not (.-done (.next it)))))

(dotimes [_ 3]
  (let [xs (vec (range 3000))
        runs 1000]
    (simple-benchmark []
      (es6-iter-consume (es6-iterator xs)) runs)
    (simple-benchmark []
      (es6-iter-consume (es6-iterator** xs)) runs)))


大约在 Chrome 上提高了 4 倍的速度。还请注意,生成的垃圾对象要少得多。

1 答案

0
参考:[https://clojure.atlassian.net/browse/CLJS-2472](https://clojure.atlassian.net/browse/CLJS-2472) (由 aralo 报告)
...