为什么`{} == null`会产生SyntaxError错误?

时间:2018-11-14 18:32:51

标签: javascript google-chrome

我可以将{}与true或false或它本身进行比较,但与null或undefined进行比较会产生语法错误。这是因为{}是对象值而不是引用吗?感觉很奇怪,这可能是语法错误,而不是某种运行时类型错误,或者只是可以工作。

要澄清一下,我很好奇为什么这是一个SyntaxError,而与之相比,{} == {}不仅不是SyntaxError,而且根本没有错误。

Example of weird behavior

1 个答案:

答案 0 :(得分:6)

解析代码时,主要有两个上下文:表达式上下文和语句上下文。例如,函数的主体是语句上下文,赋值的右侧是表达式上下文。区分两者是有道理的,例如:

 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);