4

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

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

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

4

1 回答 1

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 闭包库中的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 的强大解决方案。

于 2017-10-17T20:53:13.343 回答