为何在JS中[]==[]与{}=={}返回false,但[]和{}是真值?
为什么JS里
[]==[]、{}=={}、[]=={}都返回false? 嘿,这个问题戳中了JS里一个超容易混淆的点,很多刚上手的同学都会在这栽跟头!先帮你再确认下:你说的完全没错——0、null、undefined、false、NaN、''确实是JS里的假值,剩下的全是真值,所以[]和{}肯定属于真值范畴。那为啥它们互相比较会返回false呢?核心原因在于JS对引用类型的比较规则。
咱先把JS的数据类型分成两类掰扯清楚:
- 原始类型:比如数字、字符串、布尔值、
null、undefined、Symbol这些,它们比较的是「值本身」。比如1 == 1、'hello' == 'hello'都会返回true,因为值完全一致。 - 引用类型:数组、普通对象、函数这些都属于这类,它们比较的是「内存地址」——说白了就是:这两个东西是不是指向内存里的同一个对象?
现在逐个分析你提到的三个情况:
[] == []返回false
你写的两个[],看起来都是空数组,但JS会在你每次写[]的时候,在内存里新建一个全新的数组对象。这两个数组虽然内容一样,但它们是完全独立的两个内存块,地址不一样,所以比较的时候自然返回false。{} == {}返回false
和数组的逻辑完全一样!每次写{}都会创建一个新的普通对象,两个对象的内存地址不同,所以比较结果是false。[] == {}返回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
相关产品推荐
相关产品推荐

