为什么}!{ 在 JavaScript 控制台中导致 False

Why does }!{ result in False in a JavaScript console?

本文关键字:False 控制台 JavaScript 为什么      更新时间:2023-09-26

如果你把}!{放在Chrome的JavaScript控制台中,结果你会得到false

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

这种行为的原因是 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) || {}) {
}!{
}

我很接近,但现在我们有答案:)

代码是在当前第 440 行附近的chromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js中生成的。

只是一个猜测。如果脚本包含在{}并使用eval执行,则会发生这种情况。

用户脚本:"}!{"

{}"{}!{}"

然后eval("{}!{}")给出false

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