|  |  |  |  | # 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. |