|  |  | # clone
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | [](http://travis-ci.org/pvorb/node-clone)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | [](http://npm-stat.com/charts.html?package=clone)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | offers foolproof _deep cloning_ of objects, arrays, numbers, strings etc. in JavaScript.
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ## Installation
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     npm install clone
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | (It also works with browserify, ender or standalone.)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ## Example
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ~~~ javascript
 | 
						
						
						
							|  |  | 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:
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ~~~ javascript
 | 
						
						
						
							|  |  | { 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)
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | `clone.clonePrototype(obj)`
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   * `obj` -- the object that you want to clone
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | Does a prototype clone as
 | 
						
						
						
							|  |  | [described by Oran Looney](http://oranlooney.com/functional-javascript/).
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ## Circular References
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ~~~ javascript
 | 
						
						
						
							|  |  | var a, b;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | a = { hello: 'world' };
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | a.myself = a;
 | 
						
						
						
							|  |  | b = clone(a);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | console.log(b);
 | 
						
						
						
							|  |  | ~~~
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | This will print:
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ~~~ javascript
 | 
						
						
						
							|  |  | { hello: "world", myself: [Circular] }
 | 
						
						
						
							|  |  | ~~~
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | So, `b.myself` points to `b`, not `a`. Neat!
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ## Test
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     npm test
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ## 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](https://github.com/pvorb/node-clone/issues/new).
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | ## Bugs and Issues
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | If you encounter any bugs or issues, feel free to [open an issue at
 | 
						
						
						
							|  |  | github](https://github.com/pvorb/node-clone/issues) 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-2015 [Paul Vorbach](http://paul.vorba.ch/) and
 | 
						
						
						
							|  |  | [contributors](https://github.com/pvorb/node-clone/graphs/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.
 |