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

JavaScript对象相等与值相等:请求解释以下代码输出结果

JavaScript 对象相等性详解:你的代码输出拆解

先把你的代码和对应输出整理出来,方便对照理解:

var x = 3;
var y = 3;
var obj1 = {};
var obj2 = {};
var obj3 = obj1;

console.log(x == y);     // true
console.log(x === y);    // true
console.log(obj1 == obj2); // false
console.log(obj1 === obj2); // false
console.log(obj1 == obj3); // true
console.log(obj1 === obj3); // true

下面我逐个给你拆解背后的逻辑:

1. 基本类型的相等判断:x == y 和 x === y 都为 true

JavaScript 里的基本类型(数字、字符串、布尔值、null、undefined这些)是直接把具体值存在栈内存里的。当你声明x=3和y=3时,x和y各自存了一个值为3的独立副本,但基本类型的相等判断是直接比较值本身:

  • == 是抽象相等,会先做类型转换(这里x和y都是数字,类型一致,直接比数值)
  • === 是严格相等,要求类型和值完全匹配(两者都是number类型,值都是3,自然成立)
    所以这两个判断都返回true。

2. 不同对象的相等判断:obj1 == obj2 和 obj1 === obj2 都为 false

而引用类型(对象、数组、函数这类)存的不是值本身,而是一个指向堆内存中实际对象的引用地址。当你写obj1 = {}和obj2 = {}时,看起来都是空对象,但它们是堆内存里两个完全独立的对象,obj1和obj2保存的是两个不同的引用地址。

不管是==还是===,对于引用类型来说,判断的核心都是引用地址是否相同,而不是对象内容是否一致。因为obj1和obj2指向的是不同对象,所以这两个判断都返回false。

3. 同一对象的引用判断:obj1 == obj3 和 obj1 === obj3 都为 true

当你写obj3 = obj1时,并没有创建新对象,只是把obj1保存的引用地址复制给了obj3。现在obj1和obj3指向的是堆内存里同一个对象,它们的引用地址完全相同。所以不管是抽象相等还是严格相等,结果都是true。

最后给你划个重点:

  • 基本类型比的是值本身
  • 引用类型比的是指向对象的引用地址(如果要比较对象内容,得自己写逻辑遍历属性对比)

内容的提问来源于stack exchange,提问作者Rush W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:42:57