تقنية

JSON.stringify: أين تذهب قيمة undefined عند تحويل البيانات؟

ثلاثة سياقات للتحويل: خاصية الكائن تُحذف، وعنصر المصفوفة يصبح null، والقيمة المباشرة تعيد undefined.
تختلف النتيجة بحسب موضع undefined؛ الصف الأخير يعرض قيمة JavaScript معادة، لا سلسلة JSON. [1]

وجود قيمة في JavaScript لا يعني أن لها تمثيلًا مطابقًا في JSON؛ فصيغة JSON تقبل أنواعًا محددة، ولا تتضمن undefined. [2]

تحذف JSON.stringify الخاصية ذات القيمة undefined من ناتج الكائن، وتضع null مكانها داخل المصفوفة، وتعيد undefined نفسها عند تمريرها مباشرة. [1]

الخلاصة السريعة

  • تميّز JSON بين الكائن والمصفوفة والعدد والنص والقيمة المنطقية وnull؛ undefined ليست قيمة JSON صالحة. [2]
  • في كائن عادي، تُحذف الخاصية ذات القيمة undefined من النص الناتج، بينما تبقى الخاصية ذات القيمة null. [1]
  • داخل المصفوفة، يُكتب null بدل undefined، فلا يختفي موضع العنصر من الناتج. [3]
  • عند تمرير undefined وحدها، لا تحصل على سلسلة JSON؛ أما تمرير null فيعيد سلسلة تحتوي الكلمة null. [3]

افصل بين قيمة JavaScript ونص JSON

تميّز JSON بين الكائن والمصفوفة والعدد والنص والقيمة المنطقية وnull؛ undefined ليست قيمة JSON صالحة. [2]

وجود undefined في كائن JavaScript لا يجعلها قيمة JSON صالحة. [1] [2]

تتطلب أسماء الخصائص النصية في JSON اقتباسًا مزدوجًا، ولا تقبل الصيغة الفواصل الختامية. [2]

نفّذ الأمثلة في وحدة تحكم المتصفح. نستخدم قيمًا عادية دون replacer أو دالة toJSON مخصّصة؛ هذان المساران يستطيعان تغيير عملية التحويل. [1]

خاصية الكائن: غياب من النص الناتج

في كائن عادي، تُحذف الخاصية ذات القيمة undefined من النص الناتج، بينما تبقى الخاصية ذات القيمة null. [1]

في المثال، لا يظهر اسم x ولا قيمته في objectText؛ يظهر y مع null. المقصود بالحذف هنا شكل النص الناتج، فلا تقرأ النتيجة على أنها تمثيل حرفي لكل خصائص المدخل. [1]

مرّر الشيفرة أفقيًا عند الحاجة.

const objectText = JSON.stringify({ x: undefined, y: null });
console.log(objectText); // {"y":null}

عنصر المصفوفة: موضع محفوظ بقيمة null

داخل المصفوفة، يُكتب null بدل undefined، فلا يختفي موضع العنصر من الناتج. [3]

تبقى ثلاثة مواضع بين القوسين المربعين. لذلك لا يصبح الناتج مصفوفة من العنصرين 1 و3 فقط. تعالج خوارزمية المصفوفة هذه الحالة بإضافة null إلى النص بدل تجاوز الموضع. [3]

مرّر الشيفرة أفقيًا عند الحاجة.

const arrayText = JSON.stringify([1, undefined, 3]);
console.log(arrayText); // [1,null,3]

القيمة المباشرة: افحص نوع الناتج

عند تمرير undefined وحدها، لا تحصل على سلسلة JSON؛ أما تمرير null فيعيد سلسلة تحتوي الكلمة null. [3]

الاختبار الأول يؤكد أن noText يحمل قيمة undefined الفعلية. ويطبع الثاني نوع nullText ثم محتواه؛ كلمة string هي نوع المتغير، وليست جزءًا من نص JSON. لا تخلط بين هذه النتائج لمجرد تشابه عرض الكلمات في وحدة التحكم. [3]

مرّر الشيفرة أفقيًا عند الحاجة.

const noText = JSON.stringify(undefined);
const nullText = JSON.stringify(null);
console.log(noText === undefined); // true
console.log(typeof nullText, nullText); // string null

المصادر ومتابعة القراءة

  1. MDN: JSON.stringify (يفتح في نافذة جديدة)developer.mozilla.org
  2. MDN: صيغة JSON وأنواعها (يفتح في نافذة جديدة)developer.mozilla.org
  3. ECMAScript: خوارزميات تحويل JSON (يفتح في نافذة جديدة)tc39.es

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.