في عملية كتابة برنامج JS ، قد تحتاج غالبًا إلى الحكم على نوع الكائن. على سبيل المثال ، إذا كتبت وظيفة ، فأنت بحاجة إلى كتابة رمز مختلف عن طريق الحكم على أنواع المعلمات المختلفة.
أولاً ، قد تفكر في مشغل typeof ، وشاهد المثال التالي:
<script type = "text/javaScript"> var object = {} ؛ var b = true ؛ التنبيه (typeof object + "" + typeof b) ؛ </script>النتائج التي تم الحصول عليها على النحو التالي:
من النتائج المذكورة أعلاه ، يمكننا أن نرى أنه يمكن عرض نوع الكائن باستخدام مشغل typeof. إذن ما الذي سيكون نتيجة لنطاق مشغل typeof فارغًا وغير محدد؟
/*var object = {} ؛ var b = true ؛ ALERT (typeof object + "" + typeof b) ؛*/ alert (typeof null + "" + typeof undefined)يعمل مشغل typeof على NULL ويعرض فعليًا "كائن" (يبدو هذا غير علمي ، وأعتقد أنه سيعرض "NULL") ، والعرض غير المحدد "غير المحدد" (هذا يفي بالنتيجة التي نأملها). لذلك ، عند استخدام مشغل typeof للحكم على نوع الكائن ، يكون حذرًا بشكل خاص ، لأن هذا الكائن قد يكون فارغًا. ما سبق يعطي فقط بعض نتائج التمثيل على هذه الكائنات. يسرد الجدول التالي نتائج مشغل typeof الذي يعمل على المنطقية ، والرقم ، والسلسلة ، والمصفوفة ، والتاريخ ، و regexp ، والكائن ، والوظيفة ، والخلفية ، غير المحددة (يمكن للقراء المهتمين اختباره بنفسك):
من نتائج الجدول أعلاه ، يمكننا أن نرى أن الصفيف والتاريخ و regexp يعرضون جميع الكائنات ، فلماذا لا تعرض نوع الكائن مباشرة؟ يتطلب هذا مشغل آخر من مشغل JS: extryOf ، والذي يتم استخدامه لتحديد ما إذا كان الكائن هو كائن من نوع ما ، والقيمة المحسوبة صحيحة أو خاطئة. لنلقي نظرة أولاً:
var الآن = تاريخ جديد () ؛ var pattern =/^[/s/s]*$/؛ أسماء var = ['ZQ' ، 'John'] ؛ ALERT ((الآن مثيل من تاريخ) + "" + (pattern regleof regexp) + "" + (names extryof array)) ؛
من الواضح أنه يمكن الحكم على نوع الكائن من خلال هذا مثيل ، ولكن هذا يمكن أن يحكم فقط على الأنواع الأخرى باستثناء النوع الأساسي (بما في ذلك نوع السلسلة) ، ولا يمكنه الحكم على النوع الأساسي. ومع ذلك ، لا يمكن دائمًا الحكم على مثيل OF. بالنظر إلى حالة الإطار ، لتحديد أن الكائن من نوعه هو كائن يتم تمريره بواسطة إطار آخر ، انظر أولاً إلى المثال التالي.
main.html
<! doctype html> <html lang = "en"> <head> <title> main </title> </head> <الإطارات cols = "45 ٪ ،*"> <frame1 "src =" frame1.html "/> <frame2" src = "frame1"/
Frame1.html
<! doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> frame1 </title> </head> <script type = "text/javaScript"> var names = ['Riccio Zhang' ، 'zq' ، 'John'] ؛ </script> <body style = "background: #ccc"> </body> </html>
Frame2.html
<! doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> frame2 </itlect> <script type = "text/javaScript"> document.write ("top.frame1.names مثيل Array: document.write ("<br/>") ؛ document.write ("top.frame1.names مثيل top.frame1.array:" + (top.frame1.names مثيل top.frame1.array)) ؛ document.write ("<br/>") ؛ document.write ("top.frame1.array === top.frame2.array؟" + (top.frame1.array === top.frame2.array)) ؛ </script> </head> <body style = "الخلفية: #747474"> </body> </html>كائن الأسماء موجود في إطار Frame1 ، ويتم إنشاؤه بواسطة صفيف إطار Frame1. إذا تم نقل كائن الأسماء إلى الصفيف في Frame2 للمقارنة ، فمن الواضح أن الأسماء ليست مثيلًا للمصفوفة في Frame2. يُعتقد أن Frame1 و Frame2 ليسا متماثلين ومصفوفين على الإطلاق. من النتيجة الواقعية الثانية ، يمكن أن نرى بوضوح أن الأسماء هي مثيل للإطار الذي يقع فيه. من الإخراج الثالث ، يمكن ملاحظة أن صفيف Frame1 ومصفوفة Frame2 مختلفة. إذن ماذا علي أن أفعل إذا واجهت مقارنة الإطار المتقاطع أعلاه؟ لا يمكننا مقارنة الصفيف المقابل للإطار في كل مرة. هناك طريقة ضرورية لحل المشكلة أعلاه. انظر الرمز التالي:
var tostring = {} .toString ؛ var الآن = تاريخ جديد () ؛ تنبيه (tostring.call (الآن))يعني. استدعاء أكثر tostring () من كائن التاريخ (هذه الطريقة هي الطريقة أعلاه) يمكن أن تعرض سلسلة من النوع [تاريخ الكائن]. إذا كانت صفيف ، سيتم إنشاء كلمة [صفيف الكائن]. وهذا يعني أن أداء العمليات أعلاه سيعرض كلمات مشابهة لـ [كائن فئة]. لذلك نحن فقط بحاجة إلى الحكم على هذه السلسلة لمعرفة نوعها؟ من هذا ، يمكنك كتابة فئة الأدوات التالية:
Tools.js
var tools = (function (undefined) {var class2type = {} ، toString = {} .toString ؛ var fun = {type: function (obj) {return obj === null || obj ==== undefined؟ fun.type (OBJ) ===} ؛ 0 ؛ name.toLowercase () ؛توفر الأدوات طرقًا مثل النوع ، isarray ، isfunction ، إلخ. للحكم على نوع الكائن. وفقًا للاحتياجات الفعلية ، يمكنك إضافة طرق لتحديد النوع بنفسك. يقبل النوع معلمة OBJ ، والتي تُرجع النوع الفعلي للكائن في شكل صغير. على سبيل المثال ، إذا كنت بحاجة إلى الحكم على أن نوع الكائن عبارة عن صفيف ، فسيقوم هذه الطريقة بإرجاع صفيف.
وفقًا لفئة الأدوات الواردة أعلاه ، أعد كتابة المثال أعلاه:
Fram2.html
<! doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title> frame2 </itlem> <script type = "text/javaScript" src = "tools.js"> </script> <script type = "text/javascript" (top.frame1.names مثيل Array)) ؛ document.write ("<br/>") ؛ document.write ("top.frame1.names مثيل top.frame1.array:" + (top.frame1.names مثيل top.frame1.array)) ؛ document.write ("<br/>") ؛ document.write ("top.frame1.array === top.frame2.array؟" + (top.frame1.array === top.frame2.array)) ؛ document.write ("<br/>") ؛ document.write ("tools.isarray (top.frame1.names)؟" + tools.isarray (top.frame1.names)) ؛ </script> </head> <body style = "الخلفية: #747474"> </body> </html>عند هذه النقطة ، يمكن الحكم على نوع الكائن بسهولة من خلال الفصل أعلاه.
ملاحظة: في IE ، لا يمكن الحكم على عناصر مثل التنبيه.