我只是好奇,环顾四周,似乎Javascript没有equals()
像Java这样的方法。此外,两者都不能==
或===
不能用于检查两个运算符是否是同一个项目。那么 Clojurescript 是如何拥有 a==
和 aidentical?
运算符的呢?
另外,我应该期望identical?
比==
Clojurescript 快得多吗?
我只是好奇,环顾四周,似乎Javascript没有equals()
像Java这样的方法。此外,两者都不能==
或===
不能用于检查两个运算符是否是同一个项目。那么 Clojurescript 是如何拥有 a==
和 aidentical?
运算符的呢?
另外,我应该期望identical?
比==
Clojurescript 快得多吗?
看起来它只是===
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
这是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))