clone vs rfdc vs immer vs fast-copy
JavaScript Object Cloning Libraries Comparison
1 Year
clonerfdcimmerfast-copySimilar Packages:
What's JavaScript Object Cloning Libraries?

JavaScript object cloning libraries are essential tools for developers who need to create deep copies of objects without mutating the original data. These libraries provide various methods for cloning, each with its own performance characteristics, mutability handling, and ease of use. They are particularly useful in state management scenarios, where immutability is crucial for predictable state updates and efficient rendering in frameworks like React. Understanding the differences between these libraries can help developers choose the right tool for their specific use case, balancing performance, simplicity, and functionality.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
clone37,263,796780-287 years agoMIT
rfdc23,265,62465927.1 kB198 months agoMIT
immer13,027,11328,112627 kB5410 months agoMIT
fast-copy4,556,0821,136198 kB3a year agoMIT
Feature Comparison: clone vs rfdc vs immer vs fast-copy

Performance

  • clone:

    The clone package is relatively straightforward and performs adequately for basic use cases. However, it may not be the fastest option for large or complex objects due to its simplicity.

  • rfdc:

    Rfdc is highly optimized for speed and can handle deep cloning with circular references efficiently. It is one of the fastest options available, making it ideal for applications that require frequent cloning.

  • immer:

    Immer is not primarily a cloning library but rather a state management tool that allows for immutable updates. Its performance is excellent for state updates, but it may not be as fast as dedicated cloning libraries for deep copies.

  • fast-copy:

    Fast-copy is designed with performance in mind, making it one of the fastest cloning libraries available. It employs optimized algorithms to handle various data structures efficiently, making it suitable for performance-critical applications.

Mutability Handling

  • clone:

    Clone creates a deep copy of the object, ensuring that the original object remains unchanged. It is a straightforward approach to achieving immutability without additional complexity.

  • rfdc:

    Rfdc focuses on deep cloning without mutating the original object. It effectively handles complex structures, ensuring that the original data remains intact.

  • immer:

    Immer allows you to write code that appears to mutate the state but actually creates a new immutable state. This approach simplifies working with nested objects while ensuring immutability is preserved.

  • fast-copy:

    Fast-copy also creates deep copies, ensuring that the original object is not mutated. It is efficient in handling various data types while maintaining immutability.

Ease of Use

  • clone:

    Clone is very easy to use, with a simple API that requires minimal setup. It is suitable for developers who need a quick solution without additional complexity.

  • rfdc:

    Rfdc is easy to use but may require some familiarity with its performance optimizations to get the most out of it. Its API is straightforward, making it accessible to most developers.

  • immer:

    Immer has a slightly steeper learning curve due to its unique approach to immutability. However, once understood, it simplifies state management significantly, especially in complex applications.

  • fast-copy:

    Fast-copy has a straightforward API, but its performance optimizations may require some understanding of its usage patterns to fully leverage its capabilities.

Circular Reference Support

  • clone:

    Clone does not handle circular references well, which can lead to errors or unexpected behavior when cloning objects with circular dependencies.

  • rfdc:

    Rfdc is designed to handle circular references efficiently, ensuring that deep cloning works correctly even with complex object graphs.

  • immer:

    Immer does not directly deal with cloning but allows for immutable updates. Circular references are managed within the context of state updates, making it suitable for complex state management scenarios.

  • fast-copy:

    Fast-copy can handle circular references, making it a robust choice for complex data structures that may include loops or references to parent objects.

Use Cases

  • clone:

    Clone is best suited for simple applications where deep cloning is needed without additional features or performance considerations.

  • rfdc:

    Rfdc is suitable for scenarios requiring frequent deep cloning of complex data structures, especially when performance is a priority.

  • immer:

    Immer is perfect for applications using state management libraries like Redux, where immutable updates are necessary for predictable state changes.

  • fast-copy:

    Fast-copy is ideal for performance-critical applications that require frequent cloning of large or complex objects, such as in data-heavy applications.

How to Choose: clone vs rfdc vs immer vs fast-copy
  • clone:

    Choose clone if you need a simple and straightforward solution for deep cloning objects without additional features. It is lightweight and easy to use, making it suitable for small projects or when minimal dependencies are preferred.

  • rfdc:

    Choose rfdc if you need a highly efficient cloning solution that can handle circular references and complex data types. It is designed for performance and can be particularly useful in scenarios where deep cloning is frequently required.

  • immer:

    Choose immer if you are working with immutable state management and want to simplify the process of updating nested objects. Immer allows you to write code that appears to mutate state while maintaining immutability, making it perfect for Redux or similar state management libraries.

  • fast-copy:

    Choose fast-copy if performance is a critical factor in your application. It is optimized for speed and can handle complex data structures efficiently. This package is ideal for applications that require frequent cloning of large objects or arrays.

README for clone

clone

build status downloads

offers foolproof deep cloning of objects, arrays, numbers, strings, maps, sets, promises, etc. in JavaScript.

XSS vulnerability detected

Installation

npm install clone

(It also works with browserify, ender or standalone. You may want to use the option noParse in browserify to reduce the resulting file size, since usually Buffers are not needed in browsers.)

Example

var clone = require('clone');

var a, b;

a = { foo: { bar: 'baz' } };  // initial value of a

b = clone(a);                 // clone a -> b
a.foo.bar = 'foo';            // change a

console.log(a);               // show a
console.log(b);               // show b

This will print:

{ foo: { bar: 'foo' } }
{ foo: { bar: 'baz' } }

clone masters cloning simple objects (even with custom prototype), arrays, Date objects, and RegExp objects. Everything is cloned recursively, so that you can clone dates in arrays in objects, for example.

API

clone(val, circular, depth)

  • val -- the value that you want to clone, any type allowed

  • circular -- boolean

    Call clone with circular set to false if you are certain that obj contains no circular references. This will give better performance if needed. There is no error if undefined or null is passed as obj.

  • depth -- depth to which the object is to be cloned (optional, defaults to infinity)

  • prototype -- sets the prototype to be used when cloning an object. (optional, defaults to parent prototype).

  • includeNonEnumerable -- set to true if the non-enumerable properties should be cloned as well. Non-enumerable properties on the prototype chain will be ignored. (optional, defaults to false)

clone.clonePrototype(obj)

  • obj -- the object that you want to clone

Does a prototype clone as described by Oran Looney.

Circular References

var a, b;

a = { hello: 'world' };

a.myself = a;
b = clone(a);

console.log(b);

This will print:

{ hello: "world", myself: [Circular] }

So, b.myself points to b, not a. Neat!

Test

npm test

Changelog

v2.1.2

2018-03-21

  • Use Buffer.allocUnsafe() on Node >= 4.5.0 (contributed by @ChALkeR)

v2.1.1

2017-03-09

  • Fix build badge in README
  • Add support for cloning Maps and Sets on Internet Explorer

v2.1.0

2016-11-22

  • Add support for cloning Errors
  • Exclude non-enumerable symbol-named object properties from cloning
  • Add option to include non-enumerable own properties of objects

v2.0.0

2016-09-28

  • Add support for cloning ES6 Maps, Sets, Promises, and Symbols

v1.0.3

2017-11-08

  • Close XSS vulnerability in the NPM package, which included the file test-apart-ctx.html. This vulnerability was disclosed by Juho Nurminen of 2NS - Second Nature Security.

v1.0.2 (deprecated)

2015-03-25

  • Fix call on getRegExpFlags
  • Refactor utilities
  • Refactor test suite

v1.0.1 (deprecated)

2015-03-04

  • Fix nodeunit version
  • Directly call getRegExpFlags

v1.0.0 (deprecated)

2015-02-10

  • Improve browser support
  • Improve browser testability
  • Move helper methods to private namespace

Caveat

Some special objects like a socket or process.stdout/stderr are known to not be cloneable. If you find other objects that cannot be cloned, please open an issue.

Bugs and Issues

If you encounter any bugs or issues, feel free to open an issue at github or send me an email to paul@vorba.ch. I also always like to hear from you, if you’re using my code.

License

Copyright © 2011-2016 Paul Vorbach and contributors.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.