为什么[[] == {}和{} ==![]结果不同

时间:2019-02-27 16:53:46

标签: javascript

我可以理解[] ==! []是正确的,{} ==! {}是错误的,因为toPrimitive([])返回'',而toPrimitive({})返回[object object]''== 0,和[object object] != 0。同样的原因,我也可以理解![] == {}返回false,但是我想知道为什么{} == ![]报告Uncaught SyntaxError: Unexpected token ==吗?结果不应该也是假的吗?

enter image description here

1 个答案:

答案 0 :(得分:0)

问题的根源是{}在JS中有两个含义:

{ let a = 1; } block语句

{ a: 1 }对象文字表达式

它将选择期望表达式或语句的方式。在您的情况下,它处于语句上下文中,因此{}被视为阻塞语句,因此会引发错误。

现在您可以问“为什么它接受{} == {}?”

好吧,因为您的控制台有时会将输入的代码评估为表达式,有时则评估为语句。我的规则基本上是:如果代码以{开头并以}结尾,则将其解析为 expression (包装在(中)。所以当您输入:

 { a: 1 }

在JS中实际上是一个SyntaxError,因为:并未在block语句中定义,因此控制台非常适合将其包装为:

({ a: 1})

同样的情况发生在

{} == {}
// wrapped as
({} == {})

但这:

{} == []

没有满足条件,整个事情被当作一条语句,{}被当作一条块语句。