3

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

另外,我应该期望identical?==Clojurescript 快得多吗?

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

这是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 关于比较运算符的 JavaScript 参考,运算===确实比较了两个操作数是否是同一个对象实例,并且由于identical?在 clojurescript 中直接映射到===JavaScript 中,因此它会这样做。

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

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