ClojureScript:获取 js/window 的哈希图

ClojureScript: Get a Hashmap of js/window

在 ClojureScript 中,我正在尝试将全局 window 对象转换(不是递归,仅是最低级别)到哈希映射中。

通常,如果 js-objects 不是由 Object 构造的,则以下互操作会有所帮助:

(defn jsx->clj [js-o]
  (reduce (fn [m v]
            (assoc m (keyword v) (aget js-o v)))
          {} (.keys js/Object js-o)))

但是,如果我将此应用到 js/window,我会收到错误消息:

#object[TypeError TypeError: Cannot convert a Symbol value to a string]
[...]

有没有人有这方面的经验?

神秘错误不在您的代码中,而是在 repl 尝试输出结果时发生。

Evaluate js/cljs in the repl to replicate,因为这是罪魁祸首。(def foo (doall (jsx->clj js/window))) 工作顺利,除了现在如果你在 repl 中评估 (pr foo) 或者只是foo 本身。

有一个ClojureScript库,dom-types,可以很好的解决这类问题。在您的 ClojureScript 中包含 lambdaisland.dom-types 之后,您可以获得各种内置类型的 print 和 pprint 处理程序。这种方式不是打印 #object[HTMLElement] 你会得到 #js/Element [:div "hello"].

使用这个库后,我们可以看到(prn js/window)显示不同的结果。

演示: