deep-copy-all JavaScript object deep cloner is:
-
fast – ranking highly on common benchmark speed tests
-
compact – about 5k (minified)
-
robust – correctly handling all standard JavaScript data types, as well as custom types
$ npm install deep-copy-all
Node.js
const deepCopy = require('deep-copy-all');
/* ... */
copy = deepCopy(source);
HTML file:
<script src="dist/deepCopyAll.browser.js"></script>
<script>
/* ... */
let copy = deepCopy(source);
</script>
The accuracy of deep-copy-all compares well against other deep copying packages.
Legend: ☑️ - deep copy
🚧 - shallow copy
🗑️ - data loss
data type | JSON.* | ce | d-c | dc | cl | f-c | deep-copy-all |
---|---|---|---|---|---|---|---|
Array | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ |
ArrayBuffer | 🗑️ | 🗑️ | 🗑️ | ☑️ | 🗑️ | ☑️ | ☑️ |
BigInt | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | |
BigInt64Array | 🗑️ | 🗑️ | 🚧 | ☑️ | ☑️ | ☑️ | |
BigUint64Array | 🗑️ | 🗑️ | 🚧 | ☑️ | ☑️ | ☑️ | |
Buffer | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Date | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Error | 🗑️ | 🗑️ | 🗑️ | 🚧 | ☑️ | 🚧 | ☑️ |
Float32Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Float64Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Int8Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Int8Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Int32Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Map | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Object | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ | ☑️ |
RegExp | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Set | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Uint8Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Uint8ClampedArray | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Uint16Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
Uint32Array | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ | ☑️ |
WeakMap | 🗑️ | 🗑️ | 🗑️ | 🚧 | 🚧 | 🚧 | |
WeakSet | 🗑️ | 🗑️ | 🗑️ | 🚧 | 🚧 | 🚧 | |
enumerable:false | 🗑️ | 🗑️ | 🗑️ | 🗑️ | 🗑️ | 🗑️ | ☑️ |
custom Array | 🗑️ | 🗑️ | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ |
custom Object | 🗑️ | 🗑️ | 🗑️ | 🗑️ | ☑️ | ☑️ | ☑️ |
circular Object | ☑️ | ☑️ | ☑️ | 🗑️ | ☑️ |
JSON.* - JSON.parse(JSON.stringify())
ce - cloneextend
d-c - deep-copy
dc - deepcopy
cl - clone
f-c - fast-copy
Perform deep copy of a JavaScript object or array.
deepCopy(source [, options])
source
The item to copy.
options
{Object} [optional] - Modifies copying behavior.
options
properties:
goDeep
{Boolean} [optional] - Perform deep copy if true (default).
Set to false to perform shallow copy.
includeNonEnumerable
{Boolean} [optional] - Copies non-enumerable properties if true.
Skips non-enumerable properties if false (default).
detectCircular
{Boolean} [optional] - Detect circular references if true (default).
May be set to false if source has no circular references.
maxDepth
{number} [optional] - The maximum depth to copy, default is 20 levels.
The copied data.
The following data types — passed directly to deepCopy or embedded within another object — have been verified to be copied correctly:
Array
ArrayBuffer
Buffer
(node.js)Date
Error
RegExp
Int8Array
Uint8Array
Uint8ClampedArray
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
BigInt64Array
BigUint64Array
Map
Set
Object
- custom Array
- custom Object
Primtive data types are not deep copied. Instead, their values are copied:
Number
String
Boolean
undefined
BigInt
Symbol
null
The following object types are not deep copied, as no way has been found to copy them. They are copied by reference only:
Function
WeakMap
WeakSet
In a standard benchmark test of 14 commonly used deep copy modules, deep-copy-all was 4th fastest.