首页 > 解决方案 > 为什么 ![] == {} 和 {} == ![] 结果不同

问题描述

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

在此处输入图像描述

标签: javascript

解决方案


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

{ let a = 1; }是一个块语句

{ a: 1 }是一个对象字面量表达式

它将选择接受哪个表达式或语句。在您的情况下,它位于语句上下文中,因此{}被视为块语句,因此会引发错误。

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

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

 { a: 1 }

这实际上是 JS 中的 SyntaxError,因为:没有在块语句中定义,因此控制台很好地将其包装为:

({ a: 1})

同样的情况发生在

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

但是这个:

{} == []

不满足条件,整个事情被视为一个语句,{}被视为一个块语句。


推荐阅读