javascript 中的严格相等(===)在比较对象时,仅比较内存地址而非内容。这意味着两个不同的对象即使拥有完全相同的属性和值,使用 === 比较也会返回 false;只有当两个变量指向堆内存中的同一个对象实例时,结果才为 true。

基本类型与引用类型的存储差异
理解对象比较的关键在于区分基本类型和引用类型在内存中的存储方式。基本类型(如 number、string)直接存储在栈内存中,而对象存储在堆内存中,栈内存中只保存一个指向堆内存的指针。因此,当我们将一个对象赋值给另一个变量时,复制的是这个指针,而不是对象本身的内容。

let objA = { name: 'Alice' };
let objB = objA; // objB 指向与 objA 相同的内存地址
console.log(objA === objB); // true,因为它们是同一个对象
let objC = { name: 'Alice' }; // 新创建的对象,位于不同的内存地址
console.log(objA === objC); // false,尽管内容相同,但地址不同
上述代码展示了这一机制。objA 和 objB 指向同一块内存区域,所以严格相等成立。而 objC 是一个全新的对象,虽然其属性值与 objA 一致,但由于它在堆内存中占据了独立的地址空间,objA === objC 的结果必然为 false。
数组与函数的比较行为
数组和函数在 JavaScript 中也是对象,因此它们遵循同样的引用比较规则。无论数组的长度是否为零,或者函数定义的逻辑是否完全一致,只要它们是不同的实例,严格相等比较就会失败。这在处理 API 返回数据或配置项时非常常见,开发者容易误以为内容相同即代表对象相同。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
console.log(arr1 === arr2); // false,两个不同的数组实例
function func1() { return 1; }
function func2() { return 1; }
console.log(func1 === func2); // false,两个不同的函数实例
const emptyArr1 = [];
const emptyArr2 = [];
console.log(emptyArr1 === emptyArr2); // false,空数组也是独立对象
通过这段代码可以验证,即使是空的数组 [] 或逻辑简单的函数,每次声明都会创建新的对象引用。arr1 和 arr2 虽然元素完全一样,但它们是两个独立的容器,内存地址不同,因此 === 比较结果为 false。这种特性要求我们在需要深度比较对象内容时,必须借助 JSON.stringify 转换或专门的深比较库,而不能依赖语言内置的运算符。
如何判断两个对象是否真正“相等”
既然 === 无法用于内容比较,我们需要明确什么情况下才算两个对象“相等”。在实际开发中,如果业务逻辑要求判断两个对象是否具有相同的键值对结构,通常需要将对象序列化为字符串进行比较,或者递归遍历所有属性。需要注意的是,JSON.stringify 并不适用于包含 undefined、函数或循环引用的对象,此时需使用更复杂的比较算法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










