1.38.0deepClone
یک کپی عمیق از یک مقدار ایجاد میکند و prototypeها، descriptorهای ویژگیها، انواع داخلی خاص و ارجاعهای دوری را حفظ میکند.
deepClone(value):Tپارامترها
valueTالزامیمقداری که باید clone شود.
مقدار بازگشتی
Tیک کپی عمیق از مقدار ورودی را برمیگرداند.
خطاها
اگر مقدار شامل WeakMap باشد، یک TypeError ایجاد میکند.
اگر مقدار شامل WeakSet باشد، یک TypeError ایجاد میکند.
مثالها
استفاده پایه
یک کپی عمیق و مستقل از یک شیء تو در تو ایجاد میکند.
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آرایههای تو در تو
آرایههای تو در تو بهصورت بازگشتی clone میشوند.
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]);
// 99Date
نمونههای Date با همان timestamp clone میشوند.
const original = new Date("2026-01-01");
const copy = deepClone(original);
console.log(copy.getTime() === original.getTime());
// true
console.log(copy === original);
// falseRegExp
نمونههای RegExp مقدار source، flags و lastIndex خود را حفظ میکنند.
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);
// 3Map
کلیدها و مقادیر Map بهصورت بازگشتی clone میشوند.
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);
// BobSet
مقادیر Set بهصورت بازگشتی clone میشوند.
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ارجاعهای دوری
ارجاعهای دوری بدون ایجاد recursion بینهایت حفظ میشوند.
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ارجاعهای مشترک
چند ارجاع به یک شیء اصلی، پس از clone نیز به یک شیء cloneشده مشترک اشاره میکنند.
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حفظ prototype
اشیاء با استفاده از prototype شیء اصلی ایجاد میشوند.
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);
// falseProperty descriptorها
descriptorهای ویژگیهای own حفظ میشوند و مقدار آنها clone میشود.
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مقادیر primitive
مقادیر primitive مستقیماً برگردانده میشوند چون نیازی به clone شدن ندارند.
console.log(deepClone(42));
// 42
console.log(deepClone("hello"));
// hello
console.log(deepClone(true));
// true
console.log(deepClone(null));
// nullWeakMap
نمونههای WeakMap قابل clone شدن نیستند و باعث TypeError میشوند.
const value = new WeakMap();
deepClone(value);
// TypeError: Cannot clone WeakMapWeakSet
نمونههای WeakSet قابل clone شدن نیستند و باعث TypeError میشوند.
const value = new WeakSet();
deepClone(value);
// TypeError: Cannot clone WeakSet