我只是好奇,环顾四周,似乎Javascript没有像Java这样的equals()
方法。此外,==
或===
都不能用于检查两个运算符是否相同。那么Clojurescript如何拥有==
和identical?
运算符呢?
另外,我是否应该期望identical?
比Clojurescript中的==
快得多?
答案 0 :(得分:3)
看起来它只是===
的一个宏
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
答案 1 :(得分:3)
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
的调用1}}。但是,如果一个好的JavaScript JIT引擎将所有三个代码都减少到非常相似的数字机器代码,那么我不会感到惊讶,因为数字的-equiv
实现只是映射到identical?
:
(extend-type number
IEquiv
(-equiv [x o] (identical? x o))