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.
相关产品推荐
相关产品推荐

