我只是好奇,环顾四周,看来Javascript没有像Java这样的equals()方法。同样,如果两个运算符是同一项目,则=====都不能用于检查。那么Clojurescript如何具有==identical?运算符呢?

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

最佳答案

这是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的调用。但是,如果一个好的JavaScript JIT引擎将这三个数字都简化为非常相似的数字机器代码,这不会让我感到惊讶,因为数字的-equiv实现只是映射到identical?:
(extend-type number
  IEquiv
  (-equiv [x o] (identical? x o))

10-01 06:52