这个JavaScript破坏了控制台吗?

Did this JavaScript break the console?

只是在 google chrome 中做一些 JavaScript 的事情(暂时不想在其他浏览器中尝试,以防这真的造成了真正的伤害)并且我'我不确定为什么这似乎破坏了我的控制台。

>var x = "http://www.foo.bar/q?name=%%this%%";
<undefined
>x

x(并输入)后控制台停止工作...我重新启动 chrome 现在当我做一个简单的

console.clear();

它给了我

Console was cleared

并且不清除控制台。现在在我的脚本中 console.log 没有注册,我想知道发生了什么。 99% 确定它与双百分号 (%%) 有关。

有人知道我做错了什么或做得更好吗,如何修复控制台?

A bug report for this issue has been filed here.

编辑:感觉很蠢,但我检查了保留日志...这就是控制台未清除的原因。

正如评论中所讨论的,实际上有许多不同的构造字符串的方法会导致此问题,并且在大多数情况下不需要两个百分号。

http://example.com/%
http://%%%
http://ab%
http://%ab
http://%zz

但是,破坏 Chrome 控制台的不仅仅是百分号的存在,因为当我们输入以下格式正确的 URL 时,控制台继续正常工作并生成可点击 link.

http://ab%20cd

此外,字符串 http://%http://%% 也将正确打印,因为 Chrome 不会自动-link 和 URL-link 字符串,除非 http:// 后跟至少 3 个字符。

从这里我假设问题一定是在控制台中 linking 一个 URL 字符串的过程中,可能是在解码格式错误的 URL 的过程中。我记得 JavaScript 函数 decodeURI 会在给定格式错误的 URL 时抛出异常,并且由于 Chrome 的开发工具主要是用 JavaScript 编写的,这可能是导致开发者控制台崩溃的问题吗?

为了验证这个理论,我 运行 Chrome 通过命令 link,查看是否记录了任何错误。

事实上,如果您 运行 decodeURI 在格式错误的 URL(即 decodeURI('http://example.com/%'))上打印到控制台,您会看到同样的错误:

[4810:1287:0107/164725:ERROR:CONSOLE(683)] "Uncaught URIError: URI malformed", source: chrome-devtools://devtools/bundled/devtools.js (683)

于是,我在Chrome中打开了URLchrome-devtools://devtools/bundled/devtools.js,在第683行,我发现了下面的

{var parsedURL=new WebInspector.ParsedURL(decodeURI(url));var origin;var folderPath;var name;if(parsedURL.isValid){origin=parsedURL.scheme+"://"+parsedURL.host;if(parsedURL.port)

正如我们所见,decodeURI(url) 在 URL 上被调用,没有任何错误检查,因此抛出异常并使开发者控制台崩溃。

此问题的真正解决方法是向 Chrome 控制台代码添加错误处理,但与此同时,避免此问题的一种方法是将字符串包装在复杂的数据类型中,例如记录时防止解析的数组。

var x = "http://example.com/%";
console.log([x]);

值得庆幸的是,关闭选项卡后控制台损坏问题不会持续存在,也不会影响其他选项卡。

更新:

显然,如果选中保留日志,该问题可能会跨选项卡持续存在并重新启动。如果您遇到此问题,请取消选中此选项。

更新二:

自 Chrome 40 起,此问题已修复。