You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动