Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Tip
The owner of this PR can publish a preview release by commenting
/publish
in this PR. Afterwards, anyone can try it out by runningpnpm add radashi@pr<PR_NUMBER>
.Summary
Note: There are multiple unrelated PRs in here. Look for the
cloneDeep
one.I will add more details soon. Stay tuned!So my initial attempt tried to use
traverse
(#59), but I found it really only complicated things and the workarounds likely reduced performance.The current incarnation uses the concept of "cloning strategies". The default strategy aims to be comprehensive, thereby avoiding footguns at the cost of performance (not yet benchmarked).
Sane Default Logic
By default, plain objects and class instances have all non-enumerable and computed properties preserved in their clones.
Faster Cloning
You can pass the
FastCloningStrategy
for better performance as long as you don't mind all plain objects and class instances being cloned with{...obj}
(losing the original prototype, cementing any computed properties, and losing non-enumerable own keys). Note that built-in complex objects like RegExp/Date are still not cloned with this cloning strategy.Custom Cloning Strategies
You can partially override any method in the default cloning strategy. Your override can return null to use the default logic. It can return the original object to skip cloning for it.
Related issue, if any:
Depends on #77
Resolves #55
For any code change,
Does this PR introduce a breaking change?
No
Bundle impact
src/object/cloneDeep.ts