deep-copy-all v1.3.4
deep-copy-all
A fast, compact, and robust method to deep copy all JavaScript data types
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
Install
$ npm install deep-copy-allUsage
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>Comparison
The accuracy of deep-copy-all compares well against other deep copying packages.
Legend: ☑️ - deep copy 🚧 - shallow copy 🗑️ - data loss ⚠️ - Error
| 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
deepCopy()
Perform deep copy of a JavaScript object or array.
Syntax
deepCopy(source [, options])Parameters
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.
Return value
The copied data.
Performance
The following data types — passed directly to deepCopy or embedded within another object — have been verified to be copied correctly:
ArrayArrayBufferBuffer(node.js)DateErrorRegExpInt8ArrayUint8ArrayUint8ClampedArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayFloat32ArrayFloat64ArrayBigInt64ArrayBigUint64ArrayMapSetObject- custom Array
- custom Object
Primtive data types are not deep copied. Instead, their values are copied:
NumberStringBooleanundefinedBigIntSymbolnull
The following object types are not deep copied, as no way has been found to copy them. They are copied by reference only:
FunctionWeakMapWeakSet
Benchmark
In a standard benchmark test of 14 commonly used deep copy modules, deep-copy-all was 4th fastest.
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago