以下是 Object.is() 原理的总结,涵盖其核心机制、比较规则以及与内存引用地址的关系:
Object.is() 原理总结
定义
Object.is(value1, value2) 是 JavaScript ES6 引入的静态方法,用于比较两个值是否“相同”,基于 SameValue 算法 返回布尔值。它旨在提供比 === 更精确的相等性判断,尤其在处理特殊值时。
核心机制
- SameValue 算法:
Object.is()的比较逻辑遵循此算法,综合考虑值的类型、内容和引用,而不是单纯依赖内存地址。 - 与
===的区别:- 处理
NaN:Object.is(NaN, NaN)返回true,而NaN === NaN是false。 - 处理
0和-0:Object.is(0, -0)返回false,而0 === -0是true。 - 其他情况与
===一致。
- 处理
比较规则
- 基本类型(Primitives):
- 类型不同:返回
false。 - 数字:
- 两个
NaN:返回true(逻辑相等,不依赖内存地址)。 +0和-0:返回false(区分正负零)。- 其他数字:值相等返回
true。
- 两个
- 字符串、布尔值、null、undefined:值和类型完全相等返回
true。
- 类型不同:返回
- 对象类型(Objects):
- 比较的是 内存引用地址,只有指向同一对象(引用完全相同)时返回
true。 - 内容相同但引用不同的对象返回
false。
- 比较的是 内存引用地址,只有指向同一对象(引用完全相同)时返回
是否只依赖内存引用地址?
- 对象:是的,只有内存引用地址完全一样(即同一对象实例),
Object.is()才会返回true。 - 基本类型:不完全依赖内存地址,而是基于值的逻辑相等性:
NaN被视为相同,尽管没有固定内存表示。+0和-0被视为不同,尽管内存位模式可能一致(取决于实现)。- 其他基本类型的值相等性与内存无关。
示例
// 基本类型
Object.is(5, 5); // true,值相等
Object.is(NaN, NaN); // true,逻辑相同
Object.is(0, -0); // false,区分正负零
// 对象
const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;
Object.is(obj1, obj2); // false,引用不同
Object.is(obj1, obj3); // true,引用相同
在 React 中的应用
- React 的
useEffect使用Object.is()比较依赖项:- 对象依赖:仅引用相同视为“未变化”。
- 基本类型依赖:遵循 SameValue 算法(如
NaN不触发重复运行,+0到-0会触发)。
总结
Object.is()的本质:基于 SameValue 算法,提供精确的相等性比较。- 内存引用地址:对对象是决定性因素(必须完全一样),对基本类型则不完全依赖,而是看逻辑相等性。
- 特殊性:处理
NaN和+/-0的独特规则使其区别于===,更适合某些场景(如 React 依赖项比较)。
这个总结涵盖了 Object.is() 的原理和关键点,简洁明了又不失深度。如果你需要更详细的代码实现或某个部分的扩展,随时告诉我!
前端工程师、程序员

浙公网安备 33010602011771号