请在 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
by

由darwin发表的评论:

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

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

我们将在所有情况下得到正确的语义。代价只是在Safari 6.0.x上打印执行速度变慢,而非所有系统。

0
by

由mfikes发表的评论:

cljs-890.patch不再适用

0
by
...