- Fix reference to
metaOverride
in typings and documentation (holdover from temporary API in v5 beta)
To align with other implementations common in the community, but also to be more functionally correct, the two objects being compared now must have equal constructor
s.
In previous verisons, .forEach()
was used to ensure that support for Symbol
was not required, as IE11 did not have Symbol
and therefore both Map
and Set
did not have iterator-based methods such as .values()
or .entries()
. Since IE11 is no longer a supported browser, and support for those methods is present in all browsers and Node for quite a while, the comparison has moved to use these methods. This results in a ~20% performance increase.
To better facilitate strict comparisons, but also to allow for meta
use separate from caching, the contract for createCustomEqual
has changed. See the README documentation for more details, but froma high-level:
meta
is no longer passed through to equality comparators, but rather a generalstate
object which containsmeta
cache
now also lives on thestate
object, which allows for use of themeta
property separate from but in parallel with the circular cacheequals
is now onstate
, which prevents the need to pass through the separateisEqual
method for the equality comparator
You can create a custom circular equality comparator through createCustomEqual
now by providing circular: true
to the options.
To use meta
properties for comparisons, they must be returned in a createState
method.
If you were deep-linking into a specific asset type (ESM / CJS / UMD), they have changed location.
NOTE: You may no longer need to deep-link, as the build resolution has improved.
The following new comparators are available:
strictDeepEqual
strictShallowEqual
strictCircularDeepEqual
strictCircularShallowEqual
This will perform the same comparisons as their non-strict counterparts, but will verify additional properties (non-enumerable properties on objects, keyed objects on Array
/ Map
/ Set
) and that the descriptors for the properties align.
Support for comparing all typed array values is now supported, and you can provide a custom comparator via the new areTypedArraysEqual
option in the createCustomEqual
configuration.
The library now leverages the exports
property in the package.json
to provide builds specific to your method of consumption (ESM / CommonJS / UMD). There is still a minified UMD version available if you want to use it instead.
If you want a custom comparator for primitive wrappers (new Boolean()
/ new Number()
/ new String()
) it is now available.
- Remove unnecessary second strict equality check for objects in edge-case scenarios
- #85 -
createCustomCircularEqual
typing is incorrect
- #81 - Fix typing issues related to importing in
index.d.ts
file
In previous versions, there were automatic fallbacks for certain ES2015 features if they did not exist:
Due to the omnipresence of support in both browser and NodeJS, these have been deprecated. There is still an option if you require support for these legacy environments, however; see createCustomEqual
and createCustomCircularEqual
for more details.
To allow more flexibility and customizability for a variety of edge cases, createCustomEqual
now allows override of specific type value comparisons in addition to the general comparator it did prior. See the documentation for more details.
Like createCustomEqual
, it will create a custom equality comparator, with the exception that it will handle circular references. See the documentation for more details.
Prior to 4.x.x.
, instanceof
was used internally for checking of object classes, which only worked when comparing objects from the same Realm. This has changed to instead use an object's StringTag, which is not realm-specific.
For better typing in edge-case scenarios like custom comparators with meta
values, typings have been refactored for accuracy and better narrow flow-through.
- Fix #77 - better circular object validation
- Fix #73 - support comparison of primitive wrappers
- #76 - improve speed and accuracy of
RegExp
comparison in modern environments
- Fix #71 - use generic types for better type flow-through
When creating a custom equality comparator via createCustomEqual
, the equality method has an expanded contract:
// Before
type EqualityComparator = (objectA: any, objectB: any, meta: any) => boolean;
// After
type InternalEqualityComparator = (
objectA: any,
objectB: any,
indexOrKeyA: any,
indexOrKeyB: any,
parentA: any,
parentB: any,
meta: any,
) => boolean;
If you have a custom equality comparator, you can ignore the differences by just passing additional undefined
parameters, or you can use the parameters to further improve / clarify the logic.
- Add #57 - support additional metadata for custom equality comparators
- Fix #58 - duplicate entries in
Map
/Set
can create false equality success - #60 - Add documentation for key equality of
Map
being a part ofdeepEqual
- Fix #50 - copy-pasta in cacheable check
- Optimize iterables comparisons to not double-iterate
- Optimize loop-based comparisons for speed
- Improve cache handling in circular handlers
- Improve stability of memory by reducing variable instantiation
- Fix #41 - prevent
.rpt2_cache
directory from being published for better CI environment support (thanks @herberttn)
- There are longer
fast-equals/es
,fast-equals/lib
,fast-equals/mjs
locations- Instead, there are 3 builds in
dist
for different consumption types:fast-equals.js
(UMD /browser
)fast-equals.esm.js
(ESM /module
)fast-equals.cjs.js
(CommonJS /main
)
- Instead, there are 3 builds in
- There is no default export anymore, only the previously-existing named exports
- To get all into a namespace, use
import * as fe from 'fast-equals
- To get all into a namespace, use
- Rewritten completely in TypeScript
- Improve speed of
Map
/Set
comparisons - Improve speed of React element comparisons
- Consider pure objects (
Object.create(null)
) to be plain objects - Fix typings for
createCustomEqual
- Check the size of the iterable before converting to arrays
- Fix #23 - false positives for map
- Replace
uglify
withterser
- Use
rollup
to build all the distributables (main
,module
, andbrowser
)- Maintain
lib
andes
transpilations in case consumers were deep-linking
- Maintain
- Upgrade to
babel@7
- Add
"sideEffects": false
topackage.json
for better tree-shaking inwebpack
- Add ESM support for NodeJS with separate
.mjs
extension exports
- Fix
Map
/Set
comparison to not require order to match to be equal
- Improve speed of object comparison through custom
hasKey
method
- Fix lack of support for
unicode
andsticky
RegExp flag checks
- Add
circularDeepEqual
andcircularShallowEqual
methods - Add
meta
third parameter tocomparator
calls, for use withcreateCustomEqual
method
- Fix issue where
lastIndex
was not being tested onRegExp
objects
- Add support for comparing promise-like objects (strict equality only)
- Make
react
comparison more accurate, and a touch faster
- Add support for deep-equal comparisons between
react
elements - Add comparison with
react-fast-compare
- Use
rollup
fordist
file builds
- Fix errors from TypeScript typings in strict mode (thanks @HitoriSensei)
- Surface
isSameValueZero
assameValueZeroEqual
option
- Add TypeScript typings (thanks @josh-sachs)
- Support invalid date equality via
isSameValueZero
- Replace
isStrictlyEqual
withisSameValueZero
to ensure thatshallowEqual
accounts forNaN
equality
- Only check values when comparing
Set
objects (improves performance ofSet
check by ~12%)
- Make
Map
andSet
comparisons more explicit
- Fix symmetrical comparison of iterables
- Reduce footprint
- Prevent babel transpilation of
typeof
into helper for faster runtime
- Initial release