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中(handwaving)*可能*修复此问题,并且在Chrome中略快,在其他地方几乎没慢。(我认为它可能在Safari中避免这个问题的原因是它避免了在非对象上调用.toString。)
0 投票

评论者:darwin

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

使用纯.toString()调用实现str函数(原始方案)。并在启动时检查Safari 6.0.x是否存在,可选地交换str实现,在try-catch块中封装.toString()调用,通过回退到Safari 6.0.x兼容的.toString()替代方案来静默TypeError异常。

我们将能够在所有情况下获得正确的语义。代价只是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报告)
...