diff --git a/src/common.js b/src/common.js index f5c7bd49..1ad126b3 100644 --- a/src/common.js +++ b/src/common.js @@ -118,3 +118,12 @@ export function verifyReturnValue(value) { `Immer callback expects no return value. However ${typeof value} was returned` ) } + +export function is(x, y) { + // From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js + if (x === y) { + return x !== 0 || 1 / x === 1 / y + } else { + return x !== x && y !== y + } +} diff --git a/src/es5.js b/src/es5.js index 3821ba08..d3814f56 100644 --- a/src/es5.js +++ b/src/es5.js @@ -2,6 +2,7 @@ // @ts-check import { + is, isProxyable, isProxy, freeze, @@ -46,7 +47,7 @@ function get(state, prop) { function set(state, prop, value) { assertUnfinished(state) if (!state.modified) { - if (Object.is(source(state)[prop], value)) return + if (is(source(state)[prop], value)) return markChanged(state) prepareCopy(state) } @@ -189,7 +190,7 @@ export function produceEs5(baseState, producer) { function shallowEqual(objA, objB) { //From: https://github.com/facebook/fbjs/blob/c69904a511b900266935168223063dd8772dfc40/packages/fbjs/src/core/shallowEqual.js - if (Object.is(objA, objB)) return true + if (is(objA, objB)) return true if ( typeof objA !== "object" || objA === null || @@ -204,7 +205,7 @@ function shallowEqual(objA, objB) { for (let i = 0; i < keysA.length; i++) { if ( !hasOwnProperty.call(objB, keysA[i]) || - !Object.is(objA[keysA[i]], objB[keysA[i]]) + !is(objA[keysA[i]], objB[keysA[i]]) ) { return false } diff --git a/src/proxy.js b/src/proxy.js index a1e20795..fa7ba030 100644 --- a/src/proxy.js +++ b/src/proxy.js @@ -2,6 +2,7 @@ // @ts-check import { + is, isProxyable, isProxy, freeze, @@ -73,7 +74,7 @@ function get(state, prop) { function set(state, prop, value) { if (!state.modified) { if ( - (prop in state.base && Object.is(state.base[prop], value)) || + (prop in state.base && is(state.base[prop], value)) || (prop in state.proxies && state.proxies[prop] === value) ) return true