ClojureScript与JavaScript对象完全相同

时间:2017-10-17 20:53:13

标签: javascript interop clojurescript deepequals

我遇到了如何在ClojureScript中比较两个JavaScript对象以实现深度相等的问题,因为(= var1 var2 var3 ...)仅适用于Clojure / ClojureScript集合和数字。

(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false

当我写这个问题时,我找到了解决方案......但我会问及回答它可能对其他人有帮助。

1 个答案:

答案 0 :(得分:6)

因为" ="函数可以比较ClojureScript集合,一个直接的解决方案应该是:

(= (js->clj (js-obj "a" 1)) (js->clj (js-obj "a" 1))) ;; => true

哪个是丑陋的,并且不适用于像这样的实例对象。

(= (js->clj (js/THREE.Vector3. 10 20 30)) (js->clj (js/THREE.Vector3. 10 20 30))) ;; => false

最可靠的解决方案是使用goog.equals中的Google's Closure Library方法。

(ns my.name-space
  (:import goog.object)
  (:require [cljsjs.three]))

(.equals goog.object (js/THREE.Vector3. 10 20 30) (js/THREE.Vector3. 10 20 30))) ;; => true

一般来说,Google的Closure Library提供了处理纯JavaScript的强大解决方案。