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-all
Usage
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:
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:
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
Benchmark
In a standard benchmark test of 14 commonly used deep copy modules, deep-copy-all was 4th fastest.