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中修复此错误,并且比简单的.toString在Chrome中快一些,在其他地方慢不了多少。(我认为它可能避免在Safari中这个错误的理由是它避免在非对象上调用.toString。)
0

评论者:darwin

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

使用直接调用 .toString() 的方法实现str函数(原始解决方案)。并在启动时检查Safari 6.0.x是否存在,并可选择在try-catch块中包装 .toString() 调用,以静默处理TypeError异常,并回退到Safari 6.0.x兼容的 .toString() 替代方案。

在所有情况下我们都会得到正确的语义。代价仅仅是在Safari 6.0.x上的打印执行速度会慢一些,而不会影响其他系统。

0

评论者:mfikes

cljs-890.patch 已不再适用

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