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 }); }