سؤال

حسب http://www.ecma-international.org/publications/files/ecma-st/ecma-262.pdf، JavaScript لديه 6 أنواع: undefined, null, boolean, string, number و object.

var und;
console.log(typeof und); // <-- undefined

var n = null;
console.log(typeof n); // <--- **object**!

var b = true;
console.log(typeof b); // <-- boolean

var str = "myString"
console.log(typeof str); // <-- string

var int = 10;
console.log(typeof int); // <-- number

var obj = {}
console.log(typeof obj); // <-- object

السؤال رقم 1:

لماذا لاغية من النوع object بدلاً من null?

السؤال 2:

ماذا عن الوظائف؟

var f = function() {};
console.log(typeof f); // <-- function

عامل f لديه نوع من function. لماذا لم يتم تحديده في المواصفات كنوع منفصل؟

شكرًا،

هل كانت مفيدة؟

المحلول

حول typeof null == 'object', ، هذا خطأ يأتي منذ الأيام الأولى ، وللأسف سيبقى هذا الخطأ معنا لفترة طويلة ، كان ذلك بعد فوات الأوان ليتم إصلاحه في ecmascript 5th مواصفات الطبعة.

حول ال المهام, ، إنها مجرد أشياء ، لكن لديهم خاصية داخلية خاصة [[Call]] الذي يتم استخدامه داخليًا عند استدعاء وظيفة.

ال typeof يميز المشغل بين الكائنات العادية والوظائف فقط عن طريق التحقق مما إذا كان الكائن يحتوي على هذه الخاصية الداخلية.

نصائح أخرى

انه بسبب typeof يتم تعريفه لإرجاع "كائن" إذا كان الإدخال null, ، وإرجاع "وظيفة" إذا كانت الإدخال قابلة للاتصال. (انظر 11.4.3 typeof المشغل أو العامل.)

لا أعرف لماذا يتم تعريف المعيار مثل هذا (وقال كروكفورد إنه من الخطأ). ربما التوافق المتخلف.

الإجابة على السؤال 1:

خاصية ، عندما لا يكون لها تعريف ، غير محددة. السبب في أن NULL هو كائن بحيث يمكن أن توجد خاصية بدون قيمة ولكن لا يزال لديها تعريف.

typeof null === "object" لأن المواصفات تقول ذلك ، ولكن هذا خطأ من الإصدار الأول من JavaScript. (كما يقول Kennytm أعلاه).

typeof f === "function" لأنه ، بدون أ try/catch, ، لا توجد طريقة أخرى موثوقة وضمانية لتحديد ما إذا كان هناك شيء قابل للاتصال. استخدام f.constructor === Function قد العمل ، لكنني أعتقد أنه ليس من المضمون أن يكون كذلك.

من أجل الاكتمال ، لاحظ أن أفضل طريقة حالية للممارسات للتحقق من معلومات النوع هي شيء من هذا القبيل:

var typeInfo = Object.prototype.toString.call(yourObject);

يمنحك هذا سلسلة تبدو مثل [كائن شيء] ، حيث "شيء ما" هو اسم النوع.

NULL هي قيمة خاصة- إنها ليست خاطئة ، فهي ليست 0 ، أو السلسلة الفارغة أو NAN أو غير محددة.

NULL هو ما تحصل عليه عندما تبحث عن كائن ليس هناك- ليس خاصية غير محددة لكائن ، ولكن الشيء نفسه.

ستعود الفقرة التي تحتوي على TextNode واحدة إلى NOULLE NEXTSIBLING ، وهو regexp الذي يعيد مطابقة NULL بدلاً من الصفيف وما إلى ذلك.

ربما ينبغي أن يكون له نوعه الخاص ، ولكن بعد ذلك يبدأ في أن يكون شيئًا ، شيئًا بنوعًا ، بدلاً من عدم وجود كائن.

هناك أيضا Array.prototype كذلك.

  • Object.prototype
  • Array.Prototype
  • function.prototype
  • Number.prototype
  • String.Prototype
  • نمط منطقي

كروكفورد يقول عدم الاستخدام:

  • رقم جديد()
  • سلسلة جديدة ()
  • نيو منطقية ()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top