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

我只是好奇,环顾四周,似乎Javascript没有像Java那样的equals()方法.此外,无论是==还是===都不能用来检查两个运算符是否是同一个项目.那么Clojurescript如何具有==和相同的?操作符?

另外,我应该期待相同吗?在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中直接映射到JavaScript中的===,因此它就可以做到这一点.

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

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

转载注明原文:如何(相同?a b)在Clojurescript中实现? - 代码日志