اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

هذا الأمر يعود الى القالب الافتراضي الذي تستخدمه جافاسكريبت عند تحويل الكائن الى نص. الكلمة الاولى object هي وصف عام لنوع الشيء وهي تظهر دائما بحرف صغير في هذا التنسيق القياسي. اما الكلمة الثانية Object فهي تشير الى اسم الفئة التي ينتمي اليها الكائن وبما انه كائن عادي فهو يتبع Object. هذا التحويل يحدث تلقائيا عند استخدام علامة الجمع في الكود الخاص بك لان المتصفح يحول المصفوفة والكائن الى نصوص ليتمكن من دمجهم معا.

  • 0
نشر

ذلك بسبب أن الكلمتين لهما معنيان مختلفان
فالأولى object (بحرف صغير) هو اسم نوع البيانات أما Object (بحرف كبير) هو اسم المنشئ (Constructor) أو الفئة (Class) المدمجة في JavaScript.

وكما تعلم فالعرف السائد بين المبرمجين هو كتابة أسماء الكلاسات والدوال البانية (Constructors) بحرف كبير في البداية.

  • 0
نشر

الكلمة الاولى من اليسار دائما ما تشير الى نوع البيانات والكلمة من جهة اليمين هي الصنف Class الخاص بهذا الكائن 

 

  • 0
نشر

وعليكم السلام ورحمة الله،

السبب أن الكلمتين تحملان معنيين مختلفين تماما رغم تشابه شكلهما ف "object" بحرف صغير تصف نوع البيانات (Data Type) بينما "Object" بحرف كبير هي اسم الفئة أو الدالة البانية (Constructor/Class) التي ينتمي إليها هذا الكائن أساسا في جافاسكريبت وهذا يتبع عرفا برمجيا متعارفا عليه وهو أن أسماء الأصناف (Classes) والدوال البانية تكتب دائما بحرف أول كبير بينما أنواع البيانات العادية تكتب بحرف صغير.

وهذا الشكل النصي "[object Object]" يظهر تلقائيا حين يحاول جافاسكريبت تحويل كائن إلى نص كما يحدث عند استخدام عملية الجمع (+) مع كائن فيقوم المحرك بتوليد هذا الوصف الافتراضي الذي يجمع بين نوع البيانات واسم الفئة معا.

  • 0
نشر

وعليكم السلام ورحمة الله تعالى وبركاته،

عند تنفيذ السطر:

console.log([] + {})

يقوم المحرك بتحويل كلا الطرفين إلى نص لأن عامل الجمع + حين لا يتعامل مع أرقام صرفة يلجأ إلى التحويل الضمني إلى سلسلة نصية (string coercion) وهنا المصفوفة الفارغة [] ستتحول إلى نص فارغ " " لأن دالة toString() الخاصة بالمصفوفات ترجع عناصرها مفصولة بفواصل وإذا كانت المصفوفة خالية فالناتج نص فارغ.

أما الكائن { } فليس له تمثيل نصي مخصص فيلجأ المحرك إلى الدالة الافتراضية الموروثة من Object.prototype.toString() وهذه الدالة يحددها المعيار (ECMAScript) لترجع دائما نصا بالصيغة [object Tag] حيث كلمة "object" تكتب بحروف صغيرة لأنها جزء ثابت من قالب النص كما ينص عليه المعيار نفسه بينما "Tag" وهي هنا "Object" تبدأ بحرف كبير لأنها تمثل اسم النوع الداخلي للكائن Internal Class أو ما يعرف اليوم ب Symbol.toStringTag وأسماء الأنواع في جافاسكريبت تكتب عرفا بحرف كبير في بدايتها مثل Object وArray وFunction. لهذا السبب يظهر لديك الفرق بين الحرف الصغير في "object" والحرف الكبير في "Object" داخل نفس السلسلة الناتجة "[object Object]"، وحين يتم دمج النص الفارغ من المصفوفة مع هذا النص ينتج السطر الأول والثالث نفس القيمة ويكون نوعها بطبيعة الحال "string" كما يظهر في السطر الثاني لأن ناتج عملية الجمع بين نصين هو نص دائما.

أما في السطر الثالث {} + [] فبما أن الكائن {} هنا وقع كوسيط داخل استدعاء دالة console.log(...)، فإن المحلل اللغوي يفسره كتعبير كائن حرفي (object literal) لا ككتلة برمجية فارغة (block statement)، ولذلك تكرر السلوك نفسه وأعطى نفس الناتج "[object Object]" بدل أن يتحول إلى رقم صفر كما يحدث لو كتبت {} + [] بمفردها في بداية سطر برمجي خارج أي دالة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...