在ClojureScript中,如何获取字符串并查看Math对象中是否存在具有该名称的函数?

时间:2014-08-14 21:25:38

标签: javascript clojurescript

我想取一个用户提供的字符串,例如"abs",并查看Math object中是否存在具有该名称的函数。

所以,比如:

(.lookup Math "abs") ;; => <function>
(.lookup Math "abdominals") ;; => nil

我也想获得这个功能本身,所以这样的事情会起作用:

((.lookup Math "abs") -1) ;; => 1

如何访问常量?

(.lookup Math "PI") => 3.14159265

如果它与函数相同,则必须有一种区分函数和常量的方法。

我尝试过使用.hasOwnProperty

(print (.hasOwnProperty Math "E"))

但这会导致错误:

TypeError: cljsfiddle.Math is undefined

2 个答案:

答案 0 :(得分:1)

使用js / Math,试试https://himera.herokuapp.com/index.html

Himera REPL v0.1.5
cljs.user> js/Math
#<[object Math]>
cljs.user> (.-abs js/Math)
#<function abs() { [native code] }>
cljs.user> (type (.-abs js/Math))
#<function Function() { [native code] }>
cljs.user> (fn? (.-abs js/Math))
true

还阅读了https://himera.herokuapp.com/synonym.html

答案 1 :(得分:1)

立即错误是Math无法访问。解决方法是使用js/Math

ClojureScript:cljs.user> (.hasOwnProperty js/Math "E")
true
ClojureScript:cljs.user> (.hasOwnProperty js/Math "Earst")
false

然后,要从Math中获取这些属性,必须使用eval

ClojureScript:cljs.user> (js/eval "Math.min")
#<function min() { [native code for Math.min, arity=2] }
>
ClojureScript:cljs.user> ((js/eval "Math.min") 1 3)
1
ClojureScript:cljs.user> (js/eval "Math.E")
2.718281828459045

在用户提供的字符串上使用eval总是很危险,但首先要检查.hasOwnProperty以确保您没有使用{{1运行任意代码}}。不过,它仍然不是最理想的。

最后,我们可以使用evalnumber?来说明常量和函数之间的区别:

fn?