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}))})
    ;; 使用简单的 first/next 迭代器作为后备
    (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(由 aralo 报告)
...