如何(相同?a b)在Clojurescript中实现?

时间:2012-10-22 02:15:41

标签: clojure clojurescript

我只是好奇,环顾四周,似乎Javascript没有像Java这样的equals()方法。此外,=====都不能用于检查两个运算符是否相同。那么Clojurescript如何拥有==identical?运算符呢?

另外,我是否应该期望identical?比Clojurescript中的==快得多?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

以下是Himera ClojureScript REPL

的快速结果
    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's JavaScript Reference on Comparison Operators===运算符进行比较以查看两个操作数是否是同一个对象实例,并且由于clojurescript中的identical?直接映射到因此,JavaScript中的===就可以做到这一点。

identical?直接映射到a === b的事实也表明它会明显快于===,因为它们都会转换为{cljs.core._equiv的调用1}}。但是,如果一个好的JavaScript JIT引擎将所有三个代码都减少到非常相似的数字机器代码,那么我不会感到惊讶,因为数字的-equiv实现只是映射到identical?

(extend-type number
  IEquiv
  (-equiv [x o] (identical? x o))