Skip to content

Latest commit

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Quick Deep Clone (qdclone)

Quick deep cloning for JavaScript.

Unsafe for use on cyclical data structures. Does not copy functions as object properties.

Usage

Pass an object to clone as the first argument.
Pass true as the second argument to construct prototypes, empty or false to instantiate as plain objects.

Performance comes at a cost:

  • no cyclic objects
  • no protos that require arguments on construction (if cast flag is true)
  • no objects that shadow global proto properties
  • no polluted base prototypes
clone(obj,cast=false)

Example

constqdclone=require('quick-deep-clone');letx={str: 'str',num: 10,arr: [0,1,2]};functionA(){this.str='str';this.num=10;this.arr=[0,1,2];}// deep clone a plain objectconsole.log(qdclone(x));// deep clone a prototyped objectconsole.log(qdclone(newA(),true));// deep clone a prototyped object as a plain objectconsole.log(qdclone(newA(),false));

Benchmarks

PackageTime (ms)
deep-clone@3.0.31361
rfdc@1.1.41048
qdclone441
qdclone (* with casting)525

* only quick-deep-clone supports casting prototypes

const{ performance }=require('perf_hooks');constcloners={'deep-clone': require('deep-clone'),'rfdc': require('rfdc')(),'qdclone': require('quick-deep-clone')};constITERATIONS=10000;setImmediate(()=>{letx=makeX();console.log('\nRunning...\n')runBench('deep-clone',x,ITERATIONS);runBench('rfdc',x,ITERATIONS);runBench('qdclone',x,ITERATIONS);console.log('Running with prototype casting (only supported by qdclone)...\n');runBench('qdclone',x,ITERATIONS,true);});functionrunBench(type,obj,iterations, ...args){letcloned;console.log(`Clone via ${type}...`);letbenchStart=performance.now();for(leti=0;i<iterations;++i){cloned=cloners[type](obj, ...args);}console.log(`${performance.now()-benchStart} ms\n`);returncloned;}functionmakeX(){letx={str: 'str',num: 10,arr: [0,1,2],date: newDate(),bool: false,sub: {str2: 'abcdefghijklmnopqrstuvwxyz',num2: 9999999.9999999,bool2: true,arr2: [-.0000001,true,'asdf',100000.00001,[1,2,3],'loooooooooooong']}};letx2={x: JSON.parse(JSON.stringify(x))};letx3={x: JSON.parse(JSON.stringify(x)),x2: JSON.parse(JSON.stringify(x2))};letxs=[];for(leti=0;i<100;++i){xs.push(JSON.parse(JSON.stringify(x)));}returnnewclassX{constructor(){this.x=x;this.x2=x2;this.x3=x3;this.xs=xs;}}}

Contributing

Feel free to make changes and submit pull requests whenever.

License

Mousetouch uses the MIT license.

About

Quick deep cloning for JS.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages