J'ai rencontré le problème de comparer deux objets JavaScript pour l'égalité profonde dans ClojureScript, car (= var1 var2 var3 ...) ne fonctionne que sur les collections et les nombres Clojure/ClojureScript. Pendant que j'écrivais cette question, j'ai trouvé la solution ... mais je vais demander et y répondre peut-être que cela aidera les autres.ClojureScript égal profond pour les objets JavaScript
4
A
Répondre
6
Depuis la "=" fonction peut comparer les collections ClojureScript, une des solutions immédiates devraient être:
(= (js->clj (js-obj "a" 1)) (js->clj (js-obj "a" 1))) ;; => true
Ce qui est laid, et ne fonctionne pas sur des objets instanciés comme .:
(= (js->clj (js/THREE.Vector3. 10 20 30)) (js->clj (js/THREE.Vector3. 10 20 30))) ;; => false
Le La solution la plus fiable utilise la méthode goog.equals de 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
En général, la bibliothèque de fermeture de Google propose des solutions robustes pour gérer le langage JavaScript.