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

为什么}!{在JavaScript控制台中是否导致False?,javascript,Javascript,如果你把}!{在Chrome中的JavaScript控制台中,结果会得到false 为什么我们没有得到一个错误?这种行为的原因是因为Chrome用另一段代码将您输入控制台的任何内容包装起来 它包装的代码(在编写本文时)如下所示: with ((window && window.console && window.console._commandLineAPI) || {}) { // Your code here. } 正在输入}!{关闭代码块大括号,并

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


为什么我们没有得到一个错误?

这种行为的原因是因为Chrome用另一段代码将您输入控制台的任何内容包装起来

它包装的代码(在编写本文时)如下所示:

with ((window && window.console && window.console._commandLineAPI) || {}) {
    // Your code here.
}
正在输入
}!{
关闭代码块大括号,并在末尾创建一个新的(否定的)对象

正如您在控制台中看到的那样,
!{}
返回
false


我经过了相当长的调查过程才找到了答案,我的原始评论保留在下面

原始答案:

只是一个理论;我想象输入控制台的代码在函数中被调用

函数execUserCode(){code}

你所做的就是创造

函数execUserCode(){}!{}

控制台正在返回最后一个结果,实际上是
!{}
=
false


编辑:

很多关于这可能是错误的评论。我同意。这只是一个理论

我喜欢这种拼图,所以我对铬的来源进行了挖掘,这对我来说有点太多了,但我会留下一些提示,以防其他人有刺伤

JS控制台称为“检查器”,可在以下位置找到:

chromium/src/第三方/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\u party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js中生成的,目前大约在第440行。

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

用户脚本:
“}!{”

包含在
{}
中:
“{}!{}”

然后
eval(“{}!{}”)
给出
false


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

Hmm,Chrome/V8错误或JavaScript语言的细微差别?可能是任何一种方式!
}!!{
给出
true
};{
给出了
未定义的
在IE9开发工具中,控制台给出了
的“语法错误”!{
}!!{
};{
Firefox中的语法错误,似乎也是Chrome中的一个错误,它的语法无效。可能重复?我不认为是这种情况…
返回'test';
在控制台中创建了语法错误。我不认为他们会使用字符串连接来构建函数,他们会使用
函数
构造函数。很好是的,但是为什么这么多人投票并没有任何证据就接受了这个假设呢?如果这个假设是正确的,那么做
}(“test”);{
应该返回
未定义的
然后,因为最后一个表达式是
{}
@kapep我同意你的观点,我很失望它被接受了,我希望自己能看到更多(更好)的理论。我刚刚花了15分钟爬铬源代码,我的眼睛很痛:(是的,
console.log(arguments)
给出了ReferenceError。可能就像你说的,但它是一个简单的块而不是一个函数。@kapep更新了,现在得到了一个真实的答案。
};console.log(“TEST”);{
outputs
TEST
这将支持你的猜测!@Diode,非常接近。我设法找到了真正的原因,答案就在最后。