3

興味があったのですが、周りを見回すと、Javascriptにはequals()Javaのようなメソッドがないようです。また、どちらも、==または===2つの演算子が同じアイテムであるかどうかを確認するために使用することはできません。では、Clojurescriptに==identical?演算子があるのはどうしてですか?

また、Clojurescriptidentical?よりも大幅に高速になると期待する必要がありますか?==

4

2 に答える 2

3

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を呼び出すだけの関数でもあります。

于 2012-10-22T02:48:54.017 に答える
3

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-equividentical?

(extend-type number
  IEquiv
  (-equiv [x o] (identical? x o))
于 2012-10-22T05:05:28.637 に答える