javascript中,===和object.is()对复杂数据类型均比较内存引用地址是否相同:同一实例返回true,内容相同但不同实例返回false;object.is()在nan和±0上更严格,但引用比较行为与===一致。

JavaScript 中,复杂数据类型(如对象、数组、函数、正则、日期等)默认用 === 或 == 比较时,判断的就是它们的内存引用地址是否相同——也就是是否指向堆内存中的同一个实例。
用 === 直接比较引用地址
这是最常用、最直接的方式。只要两个变量指向同一块堆内存,结果就是 true;哪怕内容一模一样但各自独立创建,结果也是 false。
-
let a = { x: 1 };和let b = { x: 1 };→a === b是 false -
let c = a;→a === c是 true(因为 c 只是 a 的另一个引用) - 数组、Set、Map、Date 等同理:
[1] === [1]为 false,new Date() === new Date()也为 false
用 Object.is() 辅助确认引用一致性
Object.is(a, b) 行为和 === 基本一致,但对 NaN 和 -0/+0 更严格。对于引用类型,它同样只看是否为同一内存地址。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
Object.is({a:1}, {a:1})→ false -
const obj = {}; Object.is(obj, obj)→ true - 在需要精确判定“是否为同一个实例”(比如 React 中的 memo 判断、状态更新条件)时,
Object.is是更稳妥的选择
获取并对比实际内存地址(仅限调试用途)
JavaScript 不提供直接读取内存地址的 API,但可通过一些间接方式辅助验证引用关系:
- 利用
console.log(obj)在支持的浏览器控制台中点击对象,观察是否展开为同一棵树 - 给对象临时加唯一标识:
obj.$$id = Math.random(),再比a.$$id === b.$$id(仅用于开发调试,不可用于生产逻辑) - 使用
WeakMap做引用级标记:const refMap = new WeakMap(); refMap.set(obj, 'seen');,再查refMap.has(another)—— 这才是真正依赖引用地址的机制
注意常见误区
别把值相等和引用相等混为一谈:
-
JSON.stringify(a) === JSON.stringify(b)看似能比内容,但会丢失undefined、函数、Symbol、循环引用,且属性顺序敏感 —— 它不是引用比较,也不是可靠的内容比较 -
==对对象的行为和===一致,不会做类型转换,所以也只比引用 - 小字符串或数字字面量(如
'hi' === 'hi'或42 === 42)看似“值比较”,实则是引擎内部优化(字符串驻留、小整数缓存),但===本身语义仍是“同一性判断”,不是“值相等判断”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










