JavaScript中为何1 == {}返回false而{} == 1会抛出错误?
为什么
1 == {}返回false,而{} == 1会报错? 这个问题其实藏着两个不同的知识点:一个是==运算符的抽象相等规则,另一个是JavaScript引擎的代码解析逻辑,咱们拆开来聊清楚。
一、1 == {}返回false的原因
当你用==比较原始值和对象时,JavaScript会按照一套固定的规则把对象转换成原始值,再进行比较,具体步骤是这样的:
- 首先,
==左边是数字1(原始值),右边是对象{},所以先处理对象:调用{}.valueOf(),这个方法返回的是对象本身(不是原始值),所以继续下一步。 - 接着调用
{}.toString(),对象的默认toString方法会返回字符串"[object Object]"。 - 现在比较变成了
1 == "[object Object]",这时候==会把字符串转换成数字:Number("[object Object]")的结果是NaN(因为这个字符串不能被解析成有效数字)。 - 最后,
1 == NaN的结果是false——因为JavaScript里NaN和任何值都不相等,包括它自己。
二、{} == 1抛出错误的原因
这里的问题和比较规则没关系,纯粹是解析歧义搞的鬼:
- 当JavaScript引擎看到代码以
{}开头时,它会默认把这个{}当成一个空代码块(就像你写if(xxx) {}里的那个代码块),而不是对象字面量。 - 所以
{} == 1会被解析成:一个空代码块,然后跟着== 1——这时候==运算符左边没有任何操作数,完全不符合语法,自然就抛出Unexpected token '=='这类语法错误了。 - 如果想让它正常执行比较,你只需要给
{}加个括号,让解析器把它当成表达式:({} == 1),这时候就会和1 == {}一样返回false了。
内容的提问来源于stack exchange,提问作者peter roe




