1. الوظيفة:
يقوم مشغل typeof بإرجاع سلسلة تمثل نوع بيانات التعبير.
السلاسل الممكنة هي: "الرقم" ، "سلسلة" ، "منطقية" ، "كائن" ، "وظيفة" و "غير محددة".
2. وصف قيمة الإرجاع شائعة الاستخدام
| تعبير | قيمة الإرجاع |
| نوع غير محدد | "غير محدد" |
| typeof null | 'هدف' |
| نوع صحيح | "منطقي" |
| نوع 123 | 'رقم' |
| نوع "ABC" | 'خيط' |
| وظيفة typeof () {} | 'وظيفة' |
| typeof {} | 'هدف' |
| typeof [] | 'هدف' |
| نوع من غير معروف | "غير محدد" |
ملاحظة: قيم الإرجاع من النوع كلها سلاسل ، وكلها رؤوس صغيرة.
3. التطبيق العادي:
1). تحقق مما إذا كان هناك متغير وله قيمة.
سيعود Typeof "غير محدد" في حالتين: عندما لا يتم الإعلان عن متغير ، وعندما تكون قيمة المتغير غير محددة. على سبيل المثال:
> typeof unclaredvariable === "غير محدد" صحيح
> VAR DENARDEVARAINT ؛
> Typeof Denservariable "غير محدد"
> typeof غير محدد "غير محدد"
هناك طرق أخرى لاكتشاف ما إذا كانت القيمة غير محددة:
> vale value = غير محدد ؛
> value === غير محدد
ومع ذلك ، إذا تم استخدام هذه الطريقة على متغير غير معلن ، فسيتم إلقاء استثناء ، لأنه فقط TypeOF يمكنه اكتشاف المتغيرات غير المعلنة عادة دون الإبلاغ عن خطأ:
> undeclaredvariable === غير محدد المرجع: غير محدد غير محدد
ملاحظة: المتغيرات غير المؤهلة ، والمعلمات الرسمية التي لم يتم تمريرها في المعلمات ، ولن تواجه الخصائص غير الموجودة المشكلات المذكورة أعلاه ، لأنها يمكن الوصول إليها دائمًا والقيم غير محددة دائمًا:
> VAR DENARDEVARAINT ؛
> إعلان متغير === غير محدد صحيح
> (الدالة (x) {return x === undefined} ()) صحيح
> ({}). foo === غير محدد
ملاحظة: لذلك ، إذا (window.maybeundeclaredVariable) {}
سؤال: يبدو Typeof معقدًا عند إكمال مثل هذه المهام.
الحل: هذا النوع من العمليات ليس شائعًا جدًا ، لذلك يعتقد بعض الناس أنه لا توجد حاجة لإيجاد حل أفضل. ومع ذلك ، قد يقترح شخص ما مشغلًا خاصًا:
> محدد غير متغير كاذب
> VAR DENARDEVARAINT ؛
> تم تعريفه DESTARAREDVABLE FALSE
أو ربما يحتاج شخص ما إلى مشغل يكتشف ما إذا كان يتم الإعلان عن متغير:
> أعلن غير متغير
> VAR DENARDEVARAINT ؛
> أعلن إعلان متغير صحيح
ملاحظة المترجم: في Perl ، فإن المشغل المحدد أعلاه يعادل المعرفة () ، والمشغل المعلن أعلاه يعادل وجود () ،
2. حدد أن القيمة لا تساوي غير محددة ولا تساوي فارغًا
سؤال: إذا كنت ترغب في اكتشاف ما إذا كان قد تم تعريف القيمة (القيمة غير محددة أو خالية) ، فقد واجهت مظهرًا غريبًا من النوع (الذي يعتبر خطأً): إرجاع typeof null "كائن":
> typeof null "كائن"
ملاحظة: لا يمكن قول هذا إلا أنه خطأ في تنفيذ JavaScript الأصلي ، والمعيار الآن موحد. V8 بمجرد تصحيح وتنفيذ typeof null === "null" ، لكنه أثبت أخيرًا أنه غير ممكن. http://wiki.ecmascript.org/doku.php؟id=harmony:Typeof_null
الحل: لا تستخدم typeof للقيام بهذه المهمة ، استخدم الطريقة التالية بدلاً من ذلك: ومع ذلك ، يجب الإعلان عن المتغير X مسبقًا ، وإلا سيتم الإبلاغ عن خطأ.
دالة isdefined (x) {return x! == null && x! == undefined ؛ }
الاحتمال الآخر هو تقديم "مشغل القيمة الافتراضية". إذا لم يتم تعريف MyValue ، فسيعود التعبير التالي إلى DefaultValue:
MyValue || DefaultValue
التعبير أعلاه يعادل:
(myValue! == undefined && myvalue! == null)؟ MyValue: DefaultValue
في الواقع ، إنه تبسيط للبيان التالي:
myValue = myValue || DefaultValue
3. التمييز بين قيم الكائن والقيم الأصلية
يتم استخدام الوظيفة التالية لاكتشاف ما إذا كانت x قيمة كائن:
دالة isObject (x) {return (typeof x === "function" || (typeof x === "object" && x! == null)) ؛ }
المشكلة: الكشف أعلاه أكثر تعقيدًا لأن typeof يعامل وظائف وكائنات كنوع مختلفة ، وإرجاع typeof null "كائن".
الحل: غالبًا ما يتم استخدام الطرق التالية للكشف عن قيم الكائن:
دالة isObject2 (x) {return x === object (x) ؛ }
تحذير: قد تعتقد أنه يمكن استخدام كائن مثيل للكشف عنه هنا ، ولكن يتم استخدام مثيل ESTER للحكم على علاقة المثيل باستخدام نموذج أولي باستخدام كائن. إذن ما الذي يجب أن أفعله إذا كان كائنًا بدون نموذج أولي:
> var obj = object.create (null) ؛
> Object.getPrototypeof (OBJ) NULL
OBJ هو في الواقع كائن ، لكنه ليس مثيلًا لأي قيمة:
> typeof obj "كائن"
> OBJ مثيل الكائن FALSE
في الممارسة العملية ، نادراً ما تواجه مثل هذا الكائن ، ولكنه موجود وله غرضه.
ملاحظة المترجم: Object.prototype هو كائن موجود افتراضيًا وليس له نموذج أولي.
> object.getPrototypeof (Object.prototype) null
> typeof object.prototype "كائن"
> object.prototype مثيل كائن كائن
4. ما هو نوع القيمة الأصلية؟
Typeof هي أفضل طريقة لعرض نوع من القيمة الأصلية معينة.
> typeof "abc" "سلسلة"
> typeof غير محدد "غير محدد"
سؤال: يجب أن تعرف السلوك الغريب لـ typeof null.
> typeof null // كن حذرا! 'هدف'
الحل: يمكن للوظيفة التالية إصلاح هذه المشكلة (لحالة الاستخدام هذه فقط).
وظيفة getPrimitiVetypename (x) {
var typename = typeof x ؛
التبديل (typename) {
حالة "غير محددة": Case "Boolean": Case "Number": Case "String": Return typename ؛
حالة "كائن": if (x === null) {return "null" ؛ }
الافتراضي: // فشل الحكم السابق في تمرير Typeerror جديد ("المعلمة ليست قيمة بدائية:"+x) ؛
}}
حل أفضل: قم بتنفيذ وظيفة getTyPename () ، والتي لا يمكنها فقط إرجاع نوع القيمة الأصلية ، ولكن أيضًا إرجاع السمة الداخلية [[class]] لقيمة الكائن. هنا نتحدث عن كيفية تنفيذ هذه الوظيفة (ملاحظة المترجم: $ .type in jQuery هو التنفيذ مثل هذا)
5. ما إذا كانت القيمة وظيفة
يمكن استخدام typeof لاكتشاف ما إذا كانت القيمة وظيفة.
> typeof function () {} 'function'
> typeof object.prototype.toString 'function'
من حيث المبدأ ، يمكن أن تؤدي وظيفة مثيل OF هذا النوع من اكتشاف المتطلبات. للوهلة الأولى ، يبدو أن الكتابة أكثر أناقة. ومع ذلك ، فإن المتصفح لديه Quirk: كل إطار ونافذة لها متغير عالمي خاص بها. لذلك ، إذا قمت بتمرير كائن في إطار معين في إطار آخر ، فلن يعمل مثيل OF بشكل صحيح لأن الإطارين لهما مُنشئان مختلفان. هذا هو السبب في أن هناك طريقة. iSarray () في ecmascript5. سيكون من الرائع إذا كانت هناك طريقة تعبر الإطار للتحقق مما إذا كان الكائن مثيلًا لمؤسس معين. GetTypename () أعلاه هو حل بديل ، ولكن ربما يكون هناك حل أكثر جوهرية.
6. نظرة عامة
يجب أن تكون فيما يلي الحاجة الأكثر إلحاحًا في JavaScript في الوقت الحالي ، ويمكن أن تحل محل بعض الميزات الوظيفية للمسؤوليات الحالية للنوع:
ISDENED () (مثل Object.isDefined ()): يمكن استخدامه كدالة أو عامل
isObject ()
gettypename ()
آلية يمكنها اكتشاف ما إذا كان الكائن هو مثيل لمؤسس محدد عبر الأطر
للتحقق مما إذا كان قد تم الإعلان عن متغير لمثل هذا الشرط ، قد لا يكون من الضروري أن يكون لها مشغل خاص به.
الملخص أعلاه لاستخدام typeof في JS هو المحتوى الكامل المشترك من قبل المحرر. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.