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