由:thheller 发表的评论
很抱歉重新打开。
我在对我的代码进行性能分析时,注意到性能输出中有关 cljs.core/str 的警告。
Chrome 抱怨:"未优化。参数值上下文不正确",进一步查看 goog.string.buildString 的实现。
goog.string.buildString = function(var_args) { return Array.prototype.join.call(arguments, ''); }
考虑到我们从不使用超过一个参数来调用它,这可能不是最好的实现选择。
可能可以跳过调用,直接内联如下
`
(defn str
"如果无参数,返回空字符串。如果有一个参数x,返回
x.toString()。((str nil) 返回空字符串。如果参数超过一个,返回
各个参数的字符串值的连接。")
([] "")
([x] (if (nil? x)
""
(.join #js [x] "")))
([x & ys]
(loop [sb (StringBuffer. (str x)) more ys]
(if more
(recur (. sb (append (str (first more)))) (next more))
(.toString sb)))))
`
我没有理解这个问题,但为什么我们不使用.toString呢?buildString/数组的做法看起来有些 hackish?
我对整体影响不太确定,但鉴于cljs.core/str在我的配置文件中出现得相当频繁,我认为应该进一步调查。