興味があったのですが、周りを見回すと、Javascriptにはequals()
Javaのようなメソッドがないようです。また、どちらも、==
または===
2つの演算子が同じアイテムであるかどうかを確認するために使用することはできません。では、Clojurescriptに==
とidentical?
演算子があるのはどうしてですか?
また、Clojurescriptidentical?
よりも大幅に高速になると期待する必要がありますか?==
興味があったのですが、周りを見回すと、Javascriptにはequals()
Javaのようなメソッドがないようです。また、どちらも、==
または===
2つの演算子が同じアイテムであるかどうかを確認するために使用することはできません。では、Clojurescriptに==
とidentical?
演算子があるのはどうしてですか?
また、Clojurescriptidentical?
よりも大幅に高速になると期待する必要がありますか?==
https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/core.clj#L208の単なるマクロのようです===
@dnolenのコメントに基づいて更新
これは、 https===
:
//github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L43を呼び出すだけの関数でもあります。
HimeraClojureScriptREPLの簡単な結果は次のとおりです。
cljs.user> =
#<function (a, b) {
return cljs.core._equiv.call(null, a, b)
}>
cljs.user> ==
#<function (a, d, e) {
switch(arguments.length) {
case 1:
return!0;
case 2:
return cljs.core._equiv.call(null, a, d);
default:
return b.apply(this, arguments)
}
throw"Invalid arity: " + arguments.length;
}>
cljs.user> identical?
#<function (a, b) {
return a === b
}>
比較演算子に関するMozillaのJavaScriptリファレンスによると、===
演算子は2つのオペランドが同じオブジェクトインスタンスであるかどうかを確認するために比較します。したがってidentical?
、clojurescript===
ではJavaScriptに直接マップされるため、まさにそれを実行します。
identical?
に直接マップするという事実は、両方がへの呼び出しに変換されるよりも、またはそれ以降、a === b
大幅に高速になることも示唆しています。ただし、優れたJavaScript JITエンジンが、数値の実装が次のようにマッピングされるため、3つすべてを数値の非常に類似したマシンコードに削減したとしても、私は驚かないでしょう。=
==
cljs.core._equiv
-equiv
identical?
(extend-type number
IEquiv
(-equiv [x o] (identical? x o))