You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在JS中[]==[]与{}=={}返回false,但[]和{}是真值?

为什么JS里[]==[]、{}=={}、[]=={}都返回false?

嘿,这个问题戳中了JS里一个超容易混淆的点,很多刚上手的同学都会在这栽跟头!先帮你再确认下:你说的完全没错——0、null、undefined、false、NaN、''确实是JS里的假值,剩下的全是真值,所以[]和{}肯定属于真值范畴。那为啥它们互相比较会返回false呢?核心原因在于JS对引用类型的比较规则。

咱先把JS的数据类型分成两类掰扯清楚:

  • 原始类型:比如数字、字符串、布尔值、null、undefined、Symbol这些,它们比较的是「值本身」。比如1 == 1、'hello' == 'hello'都会返回true,因为值完全一致。
  • 引用类型:数组、普通对象、函数这些都属于这类,它们比较的是「内存地址」——说白了就是:这两个东西是不是指向内存里的同一个对象?

现在逐个分析你提到的三个情况:

  1. [] == []返回false
    你写的两个[],看起来都是空数组,但JS会在你每次写[]的时候,在内存里新建一个全新的数组对象。这两个数组虽然内容一样,但它们是完全独立的两个内存块,地址不一样,所以比较的时候自然返回false。

  2. {} == {}返回false
    和数组的逻辑完全一样!每次写{}都会创建一个新的普通对象,两个对象的内存地址不同,所以比较结果是false。

  3. [] == {}返回false
    首先,一个是数组对象,一个是普通对象,本身就是两个不同的新对象,内存地址肯定不一样。另外,因为你用的是==(宽松相等),JS会先尝试做类型转换:

    • 数组转原始值时,会调用toString()方法,空数组转完就是''(空字符串);
    • 普通对象转原始值时,调用toString()会得到'[object Object]';
      最后比较'' == '[object Object]',显然值不一样,所以返回false。

举个直观的例子帮你理解引用类型的比较:

const arr1 = [];
const arr2 = arr1; // 把arr1的内存地址赋值给arr2,现在两者指向同一个数组
console.log(arr1 == arr2); // 这里会返回true!

因为arr1和arr2指向的是内存里同一个数组对象,所以比较就会返回true了。

内容的提问来源于stack exchange,提问作者Pranab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:50:59