javascript - 为什么 ![] == {} 和 {} == ![] 结果不同
问题描述
我能理解[] ==! []
是正确的,{} ==! {}
是错误的,因为toPrimitive([])
返回 '' 和toPrimitive({})
返回[object object]
, ''== 0
, 和[object object] != 0
. 同样的道理,我也可以理解![] == {}
return false,但我想知道为什么要{} == ![]
报告Uncaught SyntaxError: Unexpected token ==
?结果不应该也是假的吗?
解决方案
问题的根源是{}
在 JS 中有两个含义:
{ let a = 1; }
是一个块语句
{ a: 1 }
是一个对象字面量表达式
它将选择接受哪个表达式或语句。在您的情况下,它位于语句上下文中,因此{}
被视为块语句,因此会引发错误。
现在你可以问“为什么它接受{} == {}
了?”
那是因为您的控制台有时将输入的代码评估为表达式,有时评估为语句。我的规则基本上是:如果代码以它开头{
和结尾,}
则将其解析为表达式(它包含在 中(
)。所以当你输入:
{ a: 1 }
这实际上是 JS 中的 SyntaxError,因为:
没有在块语句中定义,因此控制台很好地将其包装为:
({ a: 1})
同样的情况发生在
{} == {}
// wrapped as
({} == {})
但是这个:
{} == []
不满足条件,整个事情被视为一个语句,{}
被视为一个块语句。
推荐阅读
- spring - 将 @ModelAttribute 传递给 href Spring MVC
- laravel - 使用 Laravel 5.0 发送嵌套查询
- theano - 为什么不使用 tt.dot 或 pm.math.dot 进行 NUTS 采样?
- html - 如何为所有模板获取相同的信息?
- bash - 使用 awk 命令分割文件
- c# - 使角色统一跟随图像路线
- python - Multiprocessing.dummy.Pool 只有一名工作人员在运行
- html - 无法使文本框和按钮成行
- powershell - 如何在 Windows 10 RS5 上重新注册应用程序?
- php - 如何在 laravel 的 xampp 上防止 HTTPS 重定向