2024 Clojure状态调查!中分享您的想法。

欢迎!请查阅关于页面,了解更多关于这一功能的信息。

0
ClojureScript

示例

(str #js {"toString" (fn [] "hello") "valueOf" (fn [] 42)}) ; => "42"

问题是ClojureScript使用连接来转换值到字符串,并且这不会很好地处理那些覆盖valueOf方法的对象。

在js中的示例

`
var obj = {

toString: function() { return 'hello'; },
valueOf: function() { return 42; }

};
console.log(String(obj)); => 'hello'
console.log(obj.toString()); => 'hello'
console.log('' + obj); => '42'
`

可能的解决方案可能是使用String()函数。如本问题所述,使用toString()不会奏效:http://dev.clojure.org/jira/browse/CLJS-847

35 个回答

0

评论者:favila

忘了写测试。

0
_评论者:favila_

CLJS-847中的更新:最初报告者无法在运行在BrowserStack上的Safari 6.0.x中重现原始的错误报告。这可能是因为BrowserStack,但这是我们拥有的最好的。

鉴于此错误难以重现,受影响的人很少,以及性能回滚的严重性,我仍然认为我们应该回到简单的{{(if (nil? x) "" (.toString x))}}实现。然而,您也可以尝试在此票据上的补丁(使用typeof切换),这至少(手挥)可能解决Safari 6.0.x中的该错误,并且比简单的.toString在Chrome中快,在其他地方则慢不了多少。(我认为它可能通过避免在非对象上调用.toString来避免在Safari中发生此错误。]
0

评论人:darwin

我想知道您是否考虑在CLJS初始化阶段运行时交换str函数。

使用plain .toString()调用实现str函数(原始解决方案)。并在启动时检查Safari 6.0.x的存在,并且可选地交换str,用实现包装在一个try-catch块中,通过回退到Safari 6.0.x友好的.toString()替代品来静默TypeError异常。

我们将在所有情况下得到正确的语义。代价只是Safari 6.0.x上打印执行的稍微慢一些,而不是所有系统上都是这样。

0

评论人:mfikes

cljs-890.patch不再适用

0
参考:https://clojure.atlassian.net/browse/CLJS-890(由nbeloglazov报告)
...