我想得到一个数字的二进制形式,例如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函数的具体问题和/或细微差别的任何帮助都将非常感激。谢谢!
答案 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作为方法的参数传递。