diff --git a/packages/utils/src/usePreviousValue.test.tsx b/packages/utils/src/usePreviousValue.test.tsx
index 785be3de2e4..ac9ad8e0791 100644
--- a/packages/utils/src/usePreviousValue.test.tsx
+++ b/packages/utils/src/usePreviousValue.test.tsx
@@ -74,6 +74,56 @@ describe('usePrevious', () => {
expect(previousValue).toBe(true);
});
+ it('should treat NaN as unchanged', () => {
+ let previousValue: any;
+ const { setProps } = render(
+
+ {(previous) => {
+ previousValue = previous;
+ return null;
+ }}
+ ,
+ );
+
+ expect(previousValue).toBe(null);
+
+ setProps({ value: Number.NaN, unrelatedProp: 1 });
+ expect(previousValue).toBe(null);
+ });
+
+ it('should return the previous value when changing to NaN', () => {
+ let previousValue: any;
+ const { setProps } = render(
+
+ {(previous) => {
+ previousValue = previous;
+ return null;
+ }}
+ ,
+ );
+
+ setProps({ value: Number.NaN });
+ expect(previousValue).toBe(1);
+ });
+
+ it('should distinguish positive and negative zero', () => {
+ let previousValue: any;
+ const { setProps } = render(
+
+ {(previous) => {
+ previousValue = previous;
+ return null;
+ }}
+ ,
+ );
+
+ setProps({ value: -0 });
+ expect(previousValue).toBe(0);
+
+ setProps({ value: 0 });
+ expect(previousValue).toBe(-0);
+ });
+
it('should ignore renders where the value does not change', () => {
let previousValue: any;
const { setProps } = render(
diff --git a/packages/utils/src/usePreviousValue.ts b/packages/utils/src/usePreviousValue.ts
index 1a21a7395d2..eae26629965 100644
--- a/packages/utils/src/usePreviousValue.ts
+++ b/packages/utils/src/usePreviousValue.ts
@@ -12,7 +12,7 @@ export function usePreviousValue(value: T): T | null {
previous: null,
});
- if (value !== state.current) {
+ if (!Object.is(value, state.current)) {
setState({ current: value, previous: state.current });
}