2017-10-17 92 views
4

我遇到了問題,因爲(= var1 var2 var3 ...)只適用於Clojure/ClojureScript集合和數字,所以如何比較兩個JavaScript對象在ClojureScript中的深度平等。ClojureScript深入等於JavaScript對象

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

雖然我寫了這個問題,我找到了解決辦法......但是我會問和回答這個問題也許它會幫助別人。

回答

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 

上實例化對象不起作用最可靠的解決方案是使用Google's Closure Librarygoog.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。