4

(= var1 var2 var3...) は Clojure/ClojureScript のコレクションと数値でのみ機能するため、ClojureScript で 2 つの JavaScript オブジェクトを比較して完全に等しいかどうかという問題に遭遇しました。

(= (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 の 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 Library には、プレーンな JavaScript を処理するための堅牢なソリューションがあります。

于 2017-10-17T20:53:13.343 に答える