js-deep-clone
v2.1.1
Published
A TypeScript module for deep cloning objects and arrays, with support for Date, RegExp, Set, Map, ArrayBuffer, TypedArrays, Error, and other built-in types, while handling circular references and preserving prototypes.
Maintainers
Readme
Deep Clone Utility
deepClone is a dependency-free TypeScript (ESM) utility that performs a deep
copy of any value: nested objects and arrays, built-in types, class instances,
sparse arrays, symbol keys, property descriptors (getters/setters,
non-enumerable properties) and circular references.
Features
- Deep cloning of objects and arrays, including sparse arrays and non-index array properties.
- Built-in types:
Date,RegExp(incl.lastIndex),Set,Map,ArrayBuffer,SharedArrayBuffer, allTypedArrays,DataView, boxed primitives,Error(incl. subclasses and custom properties). - Prototypes preserved for class instances and objects with arbitrary
prototypes (including
null). - Property descriptors preserved: getters/setters, non-enumerable and non-writable properties.
- Symbol keys on both objects and arrays.
- Circular & shared references handled via an internal
WeakMap. - Written in TypeScript with full type definitions.
Installation
npm install js-deep-cloneUsage
import { deepClone } from 'js-deep-clone';
// or: import deepClone from 'js-deep-clone';
const original = {
name: 'Alice',
birthDate: new Date(),
pattern: /hello/gi,
tags: new Set(['a', 'b']),
scores: new Map([['math', 5]]),
friends: ['Bob', 'Charlie'],
};
// Create a circular reference
original.self = original;
const cloned = deepClone(original);
console.log(cloned !== original); // true
console.log(cloned.birthDate instanceof Date); // true
console.log(cloned.self === cloned); // trueFunction signature
deepClone<T>(input: T, map?: WeakMap<object, unknown>): Tinput: the value to clone.map(optional): InternalWeakMapfor circular reference tracking. Exposed only for backward compatibility; do not pass in normal usage.- Returns a deep copy of the input.
Behavior notes
- Functions are returned as-is (they are not cloneable, this mirrors the original value).
- Unsupported types (DOM nodes, etc.) are cloned as plain objects (not thrown).
Requirements
Node.js 18+ or any modern browser. Pure JavaScript (ES modules).
Running tests
npm install
npm testBuilding
npm run buildDevelopment
npm run devThis starts a Vite dev server with the demo at index.html.
License
MIT
