在ClojureScript中检索数字的二进制表示

时间:2015-02-13 21:27:19

标签: javascript clojurescript

我想得到一个数字的二进制形式,例如6 - > " 0110"

我已尝试(js/toString ...),但无论我使用何种语法,repl始终返回"[object Window]"。这是什么意思?

我也很困惑因为toString是goog.math.Integer的一部分,但是当我尝试使用js / isOdd时,它是同一个库的一部分,它说它没有被定义。我尝试通过(ns user (:require [goog.math.Integer :as int]))手动要求它,但它没有任何区别。

我也对(.toString ...)(js/toString ...)之间的区别感到困惑。

对cljs中js函数的具体问题和/或细微差别的任何帮助都将非常感激。谢谢!

2 个答案:

答案 0 :(得分:3)

您应该使用(.toString 6 2)。使用(js/toString ...)金额为toString(...),您可以尝试在典型的JavaScript浏览器控制台中评估自己。你会看到你还会得到一个"对象Window"。

(js/thing)用于引用javascript运行时符号。特别是,如果您已经加载了与编译的clojurescript不同的代码(例如,通过不同的脚本加载),则可以使用js/...语法引用加载的符号。在这种情况下,js/thing会引用javascript顶级范围内的thing

例如,假设您正在使用通过ROT对象公开其API的ROT.js库。您可以使用js/ROT访问clojurescript中的函数(假设已加载库)。然后,使用(js/ROT.Display. params)创建在ROT.Display中找到的Display对象的实例。

另一方面,

加载的Closure兼容代码是根据命名空间中的需要来访问的。一般情况下,如果您已使用goog.math加载了(ns test (:require [goog.math :as math])库,则可以使用goog.math访问(math/something)下的所有内容。

(.function object params)语法用于调用javacript对象的方法,并且对应于object.function(params)。请记住,javascript对象与通过纯clojurescript代码创建的值和对象不同。如果您只想获取该对象属性的值,请使用(.-property object)。您还可以查找doto..和线程宏->->>,了解更多处理clojurescript内javascript对象的方法。在clojure中为java提供的大多数互操作设施都适用于javascript / clojurescript。我还建议您阅读http://www.spacjer.com/blog/2014/09/12/clojurescript-javascript-interop/

对于isOdd,这是goog.math.Integer实例的实例方法。首先创建一个实例(例如(def e (new math/Integer ...)),然后您可以在该实例上调用.isOdd。查看goog.math.Integer文档,了解哪些静态属性和方法可以直接从Integer范围访问。

答案 1 :(得分:2)

这是一个解析器错误,有三种方法可以使这项工作,创建一个带有数字的var并在其上调用.toString,用额外的点写一个数字或写下数字在括号内。

如果您在JavaScript控制台上尝试6.toString(2),则会收到此错误:

  

SyntaxError:意外的标记ILLEGAL

但这6..toString(2)有效。这是因为JavaScript解析器期望一个数字后跟一个点是浮点文字。当您编写6.时,解析器期望下一个字符是一个不是t的数字,当您编写6..时,第一个点将被解析为数字的一部分(创建数字6.0)和第二个点被解析为对创建的数字的方法调用。

在ClojureScript中,编译器知道这个"功能"的JavaScript,所以你可以将6个字面传递给toString

cljs.user> (.toString 6 2)
"110"
cljs.user> (.toString 6. 2)
"110"

ClojureScript编译器在两种情况下都会生成正确的代码。在第一种情况下,它会生成(6).toString(2),在第二种情况下,它会生成6.0.toString(2)

(js/toString 6)正在调用toString全局对象上定义的window。无论你传递什么,结果都是一样的。您可以在JavaScript控制台中检查window.toString()之间的呼叫。

(.toString target args)调用目标对象中定义的toString,将args作为方法的参数传递。