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

标签 clojure clojurescript

我只是好奇,环顾四周,似乎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))

关于clojure - 如何在 Clojurescript 中实现(相同?a b)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004222/

相关文章:

clojure - 使 Clojure 的 defprotocol 与现有函数很好地(多态地)配合使用

emacs - 有没有更简单的方法可以从 emacs/cider 同时使用 BOTH clj + cljs REPL?

javascript - 协助将 JS 翻译为 CLJS

javascript - ClojureScript-Lib 和我在同一页上的 ClojureScript

clojure - 为什么算?在一种情况下返回 true 而在另一种情况下返回 false?

java - 设置 Datomic 类路径函数以供 Windows 中的事务处理程序使用

clojure - 制作数独解算器

java : Intelligent text splitting

clojure - 在Clojure中定义我自己的阅读器宏

emacs - Clojure & ClojureScript REPL (emacs + cider + boot)