ClojureScript深入等于JavaScript对象
问题描述:
我遇到了问题,因为(= var1 var2 var3 ...)只适用于Clojure/ClojureScript集合和数字,所以如何比较两个JavaScript对象在ClojureScript中的深度平等。ClojureScript深入等于JavaScript对象
(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false
虽然我写了这个问题,我找到了解决办法......但是我会问和回答这个问题也许它会帮助别人。
答
既然“=”功能可以比较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
上实例化对象不起作用最可靠的解决方案是使用Google's Closure Library的goog.equals方法。
(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库具有强大的解决方案来处理普通的JavaScript。