JS中内容一致的两个对象为何不相等?求原因分析
JavaScript 对象对比出现该现象的原因
核心原因:引用类型的比较逻辑
JavaScript 里对象属于引用类型,变量存储的是指向内存中对象实例的引用地址,而非对象本身的内容:
!==和!=对引用类型进行比较时,判断的是两个变量是否指向同一块内存地址,而非内容是否一致。只要两个对象是独立创建的(比如分别用{}字面量生成、通过不同的函数实例化),哪怕键值对完全一致,引用地址也不同,所以left !== right和left != right都会返回true。typeof对所有普通对象、数组(除null外)都会返回"object",所以typeof(left) !== typeof(right)返回false。
JSON对比工具的局限性
你使用的JSON对比工具是通过序列化对象为JSON字符串来比较内容,但JSON序列化会丢失JavaScript对象的部分特性,导致“JSON内容一致但实际对象不同”的情况,常见场景包括:
- 包含函数属性:JSON会直接忽略对象中的函数,哪怕两个对象的同名函数代码相同,它们也是不同的函数实例,对象引用不同,但序列化后JSON内容一致。
- 包含Symbol类型:JSON不支持Symbol作为键或值,序列化时这类内容会被忽略,导致JSON对比无差异,但实际对象存在差异。
- 原型链不同:JSON仅序列化对象自身的可枚举属性,不会包含原型链上的内容。比如一个是自定义类的实例,另一个是复制了相同属性的普通对象,它们的原型不同,但JSON对比会显示一致。
- 存在不可枚举属性:JSON只处理可枚举属性,两个对象的可枚举属性一致但不可枚举属性不同时,JSON对比无差异,但实际对象是不同的引用。
内容的提问来源于stack exchange,提问作者mordor619
相关产品推荐
相关产品推荐

