为什么在JavaScript控制台中,}!{的结果为False?

8

如果你在Chrome的JavaScript控制台中输入}!{,你将得到false作为结果。

为什么我们没有收到错误提示?


嗯,Chrome/V8的bug还是JavaScript语言微妙之处?两者皆有可能! - maerics
}!!{ 返回 true,而 };{ 返回 undefined - funkybro
1
在IE9开发工具中,控制台会对}!{}!!{};{显示“语法错误”。 - rosscj2533
1
Firefox 也出现了语法错误,看起来是 Chrome 的一个 bug,这不是有效的语法。 - Felix Kling
可能是重复的问题?https://dev59.com/sVbTa4cB1Zd3GeqP7AzF - jacobq
2个回答

14

这种行为的原因是因为Chrome会将您输入控制台的任何内容包装在另一段代码中。

它所包装的代码(截至撰写本文时)如下:

with ((window && window.console && window.console._commandLineAPI) || {}) {
    // Your code here.
}

输入 }!{ 会关闭代码块大括号,并在末尾创建一个新的(否定的)对象。
在控制台中,你可以看到 !{} 返回了 false
我经历了相当漫长的调查过程才找到答案,我的原始评论如下所示。 原始答案: 只是一种理论;我想象在控制台中输入的代码被调用在一个函数内部。 function execUserCode() { code } 你正在创建 function execUserCode() { }!{ } 控制台返回最后的结果,实际上是 !{ } = false
编辑: 有很多关于这可能是错误的评论。我同意。这只是一种理论。
我喜欢这些类型的难题,所以我在 Chromium 源码中进行了一些挖掘,它对我来说有点太多了,但我会留下一些指针,以防其他人尝试。
JS 控制台称为“检查器”,可以在此处找到: chromium/src/third_party/WebKit/Source/WebCore/inspector/ 我一直在查看 inspector/front-end/ConsoleView.js,我认为我找到了用户代码执行的一部分。
evaluateUsingTextPrompt: function(expression, showResultOnly)
{
    this._appendCommand(expression, this.prompt.text, false, showResultOnly);
},

原因!

小小的灵感。我在控制台中完成了这个操作。

> myEval = eval
> eval = function(str) { console.log(str); myEval(str) }
> }!{

结果:

with ((window && window.console && window.console._commandLineAPI) || {}) {
}!{
}

我差点就成功了,但现在我们有答案啦 :)

代码是在chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js中生成的,目前大约在第440行。


2
我不认为是这种情况...在控制台中,return 'test';会创建语法错误。而且我不认为他们会使用字符串拼接来构建函数,他们会使用Function构造函数。 - Felix Kling
2
不错的理论,但为什么这么多人点赞和接受而没有任何证据呢?如果这个假设是正确的,那么执行 }("test");{ 应该返回 undefined,因为最后的表达式只是 {} - kapex
2
@kapep 我同意你的观点,我也很失望这个被接受了,我想看到更多(更好的)理论。我刚刚花了15分钟爬取了Chromium源代码,我的眼睛很疼 :( - Leigh
是的,console.log(arguments)会引发ReferenceError。也许像你说的那样,但它只是一个简单的块而不是函数。 - gray state is coming
@kapep 已更新,现在得到了真正的答案。 - Leigh
显示剩余3条评论

3

仅仅是猜测。如果脚本被括在 {} 中并使用 eval 执行,这种情况就会出现。

用户脚本: "}!{"

被括在 {} 中: "{}!{}"

然后 eval("{}!{}") 就会返回 false

所以我猜这就是在浏览器控制台中发生的事情。


}; console.log("测试"); { 输出 测试,这将支持你的猜测! - Amberlamps
@Diode,非常接近。我设法找到了真正的原因,在我的答案末尾。 - Leigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接