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

欢迎!请参阅关于页面以获取更多关于该功能的信息。

0
ClojureScript

示例

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

问题在于ClojureScript使用连接操作将值转换为字符串,而这与覆写了valueOf()方法的对象不兼容。

JavaScript示例

`
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中的这个错误,并且比Chrome中的简单.toString更快,在其他地方则不太慢。(我认为它可能在Safari中避免这个错误,因为它避免了在非对象上调用.toString。)
0

评论者:darwin

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

(原始解决方案):使用原生的.toString()调用实现str函数。在启动时检查Safari 6.0.x版本是否存在,并可选性地互换str以使用封装.toString()调用并在捕获TypeError异常时回退到Safari 6.0.x兼容的.toString()替代方案。

我们将得到所有情况下的正确语义。代价只是Safari 6.0.x上慢一些的打印执行时间,而不会影响所有系统。

0

评论者:mfikes

cljs-890.patch不再适用

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