CyrefJS
CCyrefJS
EN
بازگشت به مستندات
آبجکت/از نسخه 1.38.0

deepClone

یک کپی عمیق از یک مقدار ایجاد می‌کند و prototypeها، descriptorهای ویژگی‌ها، انواع داخلی خاص و ارجاع‌های دوری را حفظ می‌کند.

deepClone(value):T

پارامترها

valueTالزامی

مقداری که باید clone شود.

مقدار بازگشتی

T

یک کپی عمیق از مقدار ورودی را برمی‌گرداند.

خطاها

اگر مقدار شامل WeakMap باشد، یک TypeError ایجاد می‌کند.

اگر مقدار شامل WeakSet باشد، یک TypeError ایجاد می‌کند.

مثال‌ها

01

استفاده پایه

یک کپی عمیق و مستقل از یک شیء تو در تو ایجاد می‌کند.

TypeScript
const original = {
  name: "Alice",
  profile: {
    age: 25,
  },
};

const copy = deepClone(original);

copy.profile.age = 30;

console.log(original.profile.age);
// 25

console.log(copy.profile.age);
// 30
02

آرایه‌های تو در تو

آرایه‌های تو در تو به‌صورت بازگشتی clone می‌شوند.

TypeScript
const original = [
  [1, 2],
  [3, 4],
];

const copy = deepClone(original);

copy[0][0] = 99;

console.log(original[0][0]);
// 1

console.log(copy[0][0]);
// 99
03

Date

نمونه‌های Date با همان timestamp clone می‌شوند.

TypeScript
const original = new Date("2026-01-01");

const copy = deepClone(original);

console.log(copy.getTime() === original.getTime());
// true

console.log(copy === original);
// false
04

RegExp

نمونه‌های RegExp مقدار source، flags و lastIndex خود را حفظ می‌کنند.

TypeScript
const original = /hello/gi;

original.lastIndex = 3;

const copy = deepClone(original);

console.log(copy.source);
// hello

console.log(copy.flags);
// gi

console.log(copy.lastIndex);
// 3
05

Map

کلیدها و مقادیر Map به‌صورت بازگشتی clone می‌شوند.

TypeScript
const original = new Map([
  ["user", { name: "Alice" }],
]);

const copy = deepClone(original);

copy.get("user")!.name = "Bob";

console.log(original.get("user")!.name);
// Alice

console.log(copy.get("user")!.name);
// Bob
06

Set

مقادیر Set به‌صورت بازگشتی clone می‌شوند.

TypeScript
const original = new Set([
  { id: 1 },
]);

const copy = deepClone(original);

const clonedItem = [...copy][0];

clonedItem.id = 2;

console.log([...original][0].id);
// 1

console.log(clonedItem.id);
// 2
07

ارجاع‌های دوری

ارجاع‌های دوری بدون ایجاد recursion بی‌نهایت حفظ می‌شوند.

TypeScript
const original: {
  name: string;
  self?: unknown;
} = {
  name: "Node",
};

original.self = original;

const copy = deepClone(original);

console.log(copy !== original);
// true

console.log(copy.self === copy);
// true
08

ارجاع‌های مشترک

چند ارجاع به یک شیء اصلی، پس از clone نیز به یک شیء clone‌شده مشترک اشاره می‌کنند.

TypeScript
const shared = {
  value: 42,
};

const original = {
  first: shared,
  second: shared,
};

const copy = deepClone(original);

console.log(copy.first === copy.second);
// true

console.log(copy.first === shared);
// false
09

حفظ prototype

اشیاء با استفاده از prototype شیء اصلی ایجاد می‌شوند.

TypeScript
class User {
  constructor(public name: string) {}
}

const original = new User("Alice");
const copy = deepClone(original);

console.log(copy instanceof User);
// true

console.log(copy === original);
// false
10

Property descriptorها

descriptorهای ویژگی‌های own حفظ می‌شوند و مقدار آن‌ها clone می‌شود.

TypeScript
const original = {};

Object.defineProperty(original, "value", {
  value: { count: 1 },
  writable: false,
  enumerable: false,
  configurable: true,
});

const copy = deepClone(original);

const descriptor = Object.getOwnPropertyDescriptor(
  copy,
  "value",
);

console.log(descriptor?.writable);
// false

console.log(descriptor?.enumerable);
// false
11

مقادیر primitive

مقادیر primitive مستقیماً برگردانده می‌شوند چون نیازی به clone شدن ندارند.

TypeScript
console.log(deepClone(42));
// 42

console.log(deepClone("hello"));
// hello

console.log(deepClone(true));
// true

console.log(deepClone(null));
// null
12

WeakMap

نمونه‌های WeakMap قابل clone شدن نیستند و باعث TypeError می‌شوند.

TypeScript
const value = new WeakMap();

deepClone(value);
// TypeError: Cannot clone WeakMap
13

WeakSet

نمونه‌های WeakSet قابل clone شدن نیستند و باعث TypeError می‌شوند.

TypeScript
const value = new WeakSet();

deepClone(value);
// TypeError: Cannot clone WeakSet
ساخته شده با@cyref/js·مستندات رسمی