This question already has answers here:
Why is {} + {} no longer NaN in Chrome console?
(3个答案)
Why does commuting the arguments of == in a console change the output?
(2个答案)
Why does {} == false throw an exception?
(1个答案)
Odd behaviour of comparison of object literals
(4个答案)
2年前关闭。
我可以将{}与true或false或它本身进行比较,但与null或undefined进行比较会产生语法错误。这是因为{}是对象值而不是引用吗?感觉很奇怪,这将是语法错误,而不是某种运行时类型错误,或者只是可以工作。
为了澄清,我很好奇为什么这是一个SyntaxError,而与做
现在REPL的任务非常艰巨:一方面,它们必须解析输入的函数和代码块,另一方面,您有时只想检查某个对象的外观。因此:
实际上是JavaScript中的SyntaxError,因为语句上下文中的
同样的情况发生在:
实际上这也是一个SyntaxError,但是REPL也会将其移动到表达式上下文中:
“移入表达式上下文”是一项复杂的任务,似乎REPL只是在这里看不到表达式:
因此将
chromium sourcecode的相关部分:
(3个答案)
Why does commuting the arguments of == in a console change the output?
(2个答案)
Why does {} == false throw an exception?
(1个答案)
Odd behaviour of comparison of object literals
(4个答案)
2年前关闭。
我可以将{}与true或false或它本身进行比较,但与null或undefined进行比较会产生语法错误。这是因为{}是对象值而不是引用吗?感觉很奇怪,这将是语法错误,而不是某种运行时类型错误,或者只是可以工作。
为了澄清,我很好奇为什么这是一个SyntaxError,而与做
{} == {}
相比,这不仅不是SyntaxError,而且根本没有错误。最佳答案
解析代码时,主要有两个上下文:表达式上下文和语句上下文。例如,函数的主体是语句上下文,赋值的右侧是表达式上下文。区分两者是有道理的,例如禁止:
if( if(true) ) alert("nonsense");
现在REPL的任务非常艰巨:一方面,它们必须解析输入的函数和代码块,另一方面,您有时只想检查某个对象的外观。因此:
{ a: 1, b: 2 }
实际上是JavaScript中的SyntaxError,因为语句上下文中的
{
启动代码块,然后:
无效。但是,REPL足够聪明,可以将该对象放入表达式上下文中,并对其进行评估,就好像它在parens中一样:({ a: 1, b: 2 })
同样的情况发生在:
{} == {}
实际上这也是一个SyntaxError,但是REPL也会将其移动到表达式上下文中:
({} == {})
“移入表达式上下文”是一项复杂的任务,似乎REPL只是在这里看不到表达式:
{} == null
因此将
{}
解析为一个块。之所以这样,是因为REPL只是天真地检查第一个和最后一个字符是否是{
和}
,这是{} == {}
的情况,而不是{} == null
的情况。chromium sourcecode的相关部分:
if (/^\s*\{/.test(text) && /\}\s*$/.test(text))
text = '(' + text + ')';
executionContext.evaluate(text, "console", !!useCommandLineAPI, false, false, true, printResult);
关于javascript - 为什么 `{} == null`给出SyntaxError? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53306680/
10-10 23:20