我可以理解[] ==! []
是正确的,{} ==! {}
是错误的,因为toPrimitive([])
返回'',而toPrimitive({})
返回[object object]
,''== 0
,和[object object] != 0
。同样的原因,我也可以理解![] == {}
返回false,但是我想知道为什么{} == ![]
报告Uncaught SyntaxError: Unexpected token ==
吗?结果不应该也是假的吗?
答案 0 :(得分:0)
问题的根源是{}
在JS中有两个含义:
{ let a = 1; }
是 block语句
{ a: 1 }
是对象文字表达式
它将选择期望表达式或语句的方式。在您的情况下,它处于语句上下文中,因此{}
被视为阻塞语句,因此会引发错误。
现在您可以问“为什么它接受{} == {}
?”
好吧,因为您的控制台有时会将输入的代码评估为表达式,有时则评估为语句。我的规则基本上是:如果代码以{
开头并以}
结尾,则将其解析为 expression (包装在(
中)。所以当您输入:
{ a: 1 }
在JS中实际上是一个SyntaxError,因为:
并未在block语句中定义,因此控制台非常适合将其包装为:
({ a: 1})
同样的情况发生在
{} == {}
// wrapped as
({} == {})
但这:
{} == []
没有满足条件,整个事情被当作一条语句,{}
被当作一条块语句。