请在 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
_Comment made by: favila_

在 CLJS-847 中的更新:原始报告者无法在 BrowserStack 中运行的 Safari 6.0.x 中复现其原始错误报告。这可能是由于 BrowserStack 的原因,但我们目前所能做的最好的了。

鉴于这个bug难以重现,受影响的人很少,以及性能回归非常显著,我仍然认为我们应该回归到简单的 {{(if (nil? x) "" (.toString x))}} 实现。然而,你也可以尝试在这次票据上的补丁(使用typeof开关),这至少在 (_手舞足蹈_) *可能* 修复Safari 6.0.x上的这个bug,并且比简单的.toString在Chrome中快一点,在其他地方并不慢多少。(我认为它可能在Safari中避免这个bug的原因是它避免了在非对象上调用.toString。)
0

回复者:darwin

我在想,你在CLJS初始化阶段考虑过交换str函数吗?

使用普通的.toString()调用实现str函数(原始解决方案)。在启动时检查Safari 6.0.x是否存在,并可选择将str替换为围绕.toString()调用进行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报告)
...