为什么}!{ 在 JavaScript 控制台中导致 False
Why does }!{ result in False in a JavaScript console?
如果你把}!{
放在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
所以我想这就是浏览器控制台中发生的事情。
- 如果 a 为 false,则 if(a) === if(false)
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 控制台返回var不是't定义,但它是
- 如何将localStorage值设置为false
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-切换“;全部检查”;复选框true/false
- 如何使用Protractor从Chrome控制台获取所有日志
- gulp Iconify任务抛出错误TypeError:Path必须是字符串.收到false
- 为什么我能够从javascript控制台发送跨域ajax请求
- 当浏览器控制台未打开时,为什么要求会导致Internet Explorer 9超时
- 在量角器中创建一个.txt错误输出文件是手动的,而不是控制台错误
- 按压“;输入“;将值打印到控制台日志
- 如何让JS脚本在导航后继续运行(谷歌chrome控制台)
- 将数组的拼接分配给自身时,Javascript控制台打印不起作用
- 如何使用javascript将字段强制设置为false
- PHP REST服务抛出异常——希望避免控制台错误
- (false==false==true)怎么可能是真的
- js文件未加载js控制台say's”;不允许加载本地资源”;
- Array.every返回false,而不是类型error
- Javascript控制台日志在if语句计算结果为false后自行清除