النسخ العميق مقابل السطحي: فخاخ JSON.parse و stringify

2025-03-19

عندما تريد نسخة قابلة للتعديل دون لمس الأصل، يبدو مسار JSON سريعًا ومريحًا. لكنه مناسب فقط للبيانات JSON النقية، وليس للكائنات الغنية.

النسخ السطحي مقابل العميق

النسخ بـ spread أو Object.assign ينسخ المستوى الأول فقط، وتبقى الكائنات المتداخلة مشتركة.

النسخ عبر JSON يحتفظ فقط بما يمكن تمثيله داخل JSON.

ما الذي يُفقد؟

undefined والدوال ومفاتيح Symbol تختفي، وDate تتحول إلى نص ISO.

Map وSet وRegExp لا تُحفظ كما هي، وNaN/Infinity قد تسبب سلوكًا غير متوقع.

const o = { d: new Date(), fn: () => 1, u: undefined };
JSON.parse(JSON.stringify(o)); // { d: "2026-06-10T..." }

المراجع الدائرية

عند وجود obj.self = obj سيظهر خطأ Converting circular structure to JSON.

لبنى الرسوم البيانية استخدم structuredClone أو اجتيازًا يعتمد WeakMap.

متى يفوز structuredClone

مدعوم في المتصفحات الحديثة وNode 17+ ويحافظ على Date وMap وSet والدورات.

لا يدعم الدوال أو عقد DOM أو سلوك النماذج الأولية المخصصة.

اختيار الاستراتيجية

للـ JSON البسيط في API أو الإعدادات، النسخ عبر JSON يظل خفيفًا.

للأنواع الغنية أو الدورات استخدم structuredClone، وللهياكل المعقدة فكّر في cloneDeep.