في JavaScript ، غالبًا ما نرى رمزًا مثل هذا: مقارنة بين المتغيرات إلى NULL (هذا الاستخدام يمثل مشكلة كبيرة) ، يستخدم لتحديد ما إذا كان المتغير قد تم إعطاؤه قيمة معقولة. على سبيل المثال:
var controller = {Process: function (items) {if (items! == null) {// bad write method items.sort () ؛ items.foreach (function (item) {// execute ome logic}) ؛}}}في هذا الرمز ، من الواضح أن طريقة Process () تتوقع أن تكون العناصر صفيفًا ، لأننا نرى العناصر لديها Sort () و foreach (). نية هذا الرمز واضح للغاية: إذا لم تكن عناصر المعلمة رقم مجموعة ، فسيتم إيقاف العملية التالية. المشكلة في طريقة الكتابة هذه هي أن المقارنة مع NULL لا يمكن أن تمنع الأخطاء حقًا. يمكن أن تكون قيمة العناصر 1 أو سلسلة أو حتى أي كائن. هذه القيم لا تساوي NULL ، والتي بدورها ستؤدي إلى خطأ عند تنفيذ طريقة العملية () على الفرز ().
لا توفر مقارنة مع NULL وحدها معلومات كافية لتحديد ما إذا كان تنفيذ الكود اللاحق آمنًا حقًا. لحسن الحظ ، توفر لنا JavaScript العديد من الطرق لاكتشاف القيمة الحقيقية للمتغير.
اكتشاف القيمة الأصلية
هناك 5 أنواع بدائية (تُعرف أيضًا بأنواع البيانات البسيطة) في JavaScript: السلسلة ، والرقم ، والطلاوى ، وغير المحددة ، والخالية. إذا كنت تريد أن تكون قيمة أو رقم أو منطقية أو غير محددة ، فإن الخيار الأفضل هو استخدام مشغل typeof ، الذي يعيد سلسلة تمثل النوع.
بالنسبة للسلاسل ، يعيد Typeof "سلسلة".
بالنسبة للأرقام ، إرجاع typeof "الرقم".
بالنسبة إلى Boolean ، يعود Typeof "Boolean".
بالنسبة إلى غير محدد ، يعيد نوع typeof "غير محدد".
بناء الجملة الأساسي للنوع هو: متغير typeof ، يمكنك أيضًا استخدام typeof (متغير) ، على الرغم من أن هذا هو بناء جملة JavaScript القانونية ، مما يجعل typeof يبدو وكأنه وظيفة بدلاً من المشغل. في ضوء هذا ، نوصي الكتابة بدون قوسين.
يعد استخدام TypeOF للكشف عن هذه الأنواع البدائية الأربعة آمنة للغاية. دعنا نلقي نظرة على الأمثلة التالية.
// الكشف عن "سلسلة" if (typeof name === "string") {arearname = name.substring (3) ؛} // اكتشاف "الرقم" إذا (typeof count === "number") {updateCount (count) ؛} // اكتشاف "boolean" if (typeof found === "boolean) (typeof myapp === "undefined") {myapp = {// other code} ؛}يعتبر مشغل typeof فريدًا لأنه لن يبلغ عن خطأ عند استخدامه مع متغير غير معلن. ستؤدي المتغيرات والمتغيرات غير المحددة مع القيمة غير المحددة إلى إرجاع "غير محدد" عبر typeof.
آخر نوع بدائي فارغ ، من خلال typeof ، سيعود "كائن" ، والذي يبدو غريبًا ويعتبر خطأً خطيرًا في المواصفات القياسية ، لذلك عند البرمجة ، يجب أن تمنع استخدام typeof للكشف عن الأنواع الخالية.
console.log (typeof null) ؛ // "هدف"
عادةً ما لا تحتوي المقارنة مع NULL على معلومات كافية لتحديد ما إذا كان نوع القيمة قانونيًا ، لذلك لا يتم استخدام NULL عمومًا في بيانات الكشف.
ولكن هناك استثناء ، إذا كانت القيمة المتوقعة فارغة حقًا ، فيمكنك المقارنة مباشرة مع NULL. على سبيل المثال:
// إذا كنت بحاجة إلى اكتشاف NULL ، فاستخدم هذه الطريقة var element = document.getElementById ("my-div") ؛ if (element! == null) {element.classname = "found" ؛}إذا لم يكن عنصر DOM موجودًا ، فإن القيمة التي تم الحصول عليها بواسطة document.getElementById () لاغية. هذه الطريقة إما إرجاع عقدة أو إرجاع فارغة. نظرًا لأن NULL هو مخرج متوقع في هذا الوقت ، يمكن اكتشاف نتيجة الإرجاع باستخدام مشغل الهوية === أو مشغل عدم الهوية! ==.
بالإضافة إلى السلسلة ، والرقم ، والطليف ، وغير محدد ، والكائن المذكور أعلاه ، فإن قيمة الإرجاع لمشغل typeof لها وظيفة أيضًا. من وجهة نظر فنية ، فإن الوظائف هي أيضًا كائنات في JavaScript ، وليس أنواع البيانات. ومع ذلك ، فإن الوظائف لها بعض الخصائص الخاصة ، لذلك من الضروري التمييز بين الوظائف والكائنات الأخرى بواسطة مشغل typeof. سيتم استخدام هذه الميزة في وظيفة الكشف لاحقًا.
اكتشاف القيم المرجعية
في JavaScript ، باستثناء القيم الأصلية ، جميع القيم المرجعية (تسمى أيضًا الكائنات). الأنواع المرجعية الشائعة الاستخدام هي: الكائن ، الصفيف ، التاريخ و regexp. هذه الأنواع المرجعية هي كائنات مدمجة في JavaScript. يقوم مشغل typeof بإرجاع "كائن" عند الحكم على هذه الأنواع المرجعية.
console.log (typeof {}) ؛ // "Object" console.log (typeof []) ؛ // "Object" console.log (typeof new Date ()) ؛ // "Object" console.log (typeof new regexp ()) ؛ // "Object" console.log (typeof new regexp ()) ؛ // "هدف"أفضل طريقة للكشف عن نوع القيمة المشار إليها هي استخدام عامل التشغيل. بناء الجملة الأساسي لمثيل: هو:
Value extorlyof constructor // اكتشف التاريخ if (value extureof date) {console.log (value.getlyear) ؛} // اكتشاف خطأ errorif (خطأ في حالة خطأ) {throw value ؛} // اكتشف التعبير العادي إذا (regleof regexp) {if (value.test (otherValue)) {console.log ("تتمثل الميزة المثيرة للاهتمام في مثيل extremof إلى أنه لا يكتشف فقط المُنشئ الذي يبني هذا الكائن ، ولكنه يكتشف أيضًا سلسلة النموذج الأولي. تحتوي سلسلة النموذج الأولي على الكثير من المعلومات ، بما في ذلك نمط الميراث المستخدم لتحديد الكائن. على سبيل المثال ، بشكل افتراضي ، يرث كل كائن من كائن ، وبالتالي فإن مثيل القيمة لكل كائن يعيد ture. على سبيل المثال:
var now = new date () ؛ console.log (الآن كائن مثيل) ؛ // the natureConsole.log (الآن dateof date) ؛ // يمكن للمشغل NatureInstanceOF اكتشاف أنواع مخصصة ، مثل: Promice person (name) {this.name = name ؛} var me = new شخص ("nicholas") ؛ console.log (me extoryof object) ؛ // the natureConsole.log (me extryof person) ؛ // الطبيعةيتم إنشاء نوع الشخص في رمز العينة هذا. المتغير لي هو مثال للشخص ، لذلك أنا مثيل الشخص صحيح. كما ذكر أعلاه ، تعتبر جميع الكائنات مثيلًا للكائن ، لذلك فإن كائن مثيل Me extryof هو أيضًا ture.
عند اكتشاف الأنواع المدمجة والمخصصة في JavaScript ، فإن أفضل طريقة للقيام بذلك هي استخدام مشغل مثيل ، وهي الطريقة الوحيدة للقيام بذلك.
ولكن هناك قيود خطير. على افتراض أن كلا إطارات المتصفح (الإطارات) لهما شخص مُنشئ ، يتم تمرير مثيل الشخص في الإطار A في الإطار B ، وستكون النتائج التالية:
console.log (frameapersoninstance extomof frameaperson) // ture
console.log (frameapersoninstance مثيل frambperson) // false
على الرغم من أن تعريفات الشخصين هي نفسها تمامًا ، إلا أنها تعتبر أنواعًا مختلفة في إطارات مختلفة. هناك نوعان مهمان للغاية لهما هذه المشكلة: الصفيف والوظيفة ، لذلك فإن اكتشافهما عمومًا لا يستخدم مثيلًا.
وظيفة الكشف
من الناحية الفنية ، فإن الوظائف في JavaScript هي أنواع مرجعية ، وهناك أيضًا مُنشئ الوظائف. كل وظيفة مثال ، على سبيل المثال:
وظيفة myfunc () {} // طريقة الكتابة السيئة console.log (myfunc extryof function) ؛ // حقيقيومع ذلك ، لا يمكن استخدام هذه الطريقة عبر الإطارات ، لأن كل إطار له مُنشئ وظائفه. لحسن الحظ ، يمكن أيضًا استخدام مشغل typeof للوظائف ، وإعادة "الوظيفة".
وظيفة myfunc () {} // طريقة كتابة جيدة console.log (typeof myfunc === "function") ؛ // حقيقيأفضل طريقة لاكتشاف وظيفة هي استخدام typeof لأنه يمكن استخدامه عبر الإطارات.
هناك قيود على استخدام typeof للكشف عن الوظائف. في IE 8 ومتصفحات IE السابقة ، يتم استخدام typeof لاكتشاف أن الوظائف في عقد DOM جميعها تُرجع "الكائن" بدلاً من "الدالة". على سبيل المثال:
// ieconsole.log (typeof document.createElement) ؛ // "Object" console.log (typeof document.getElementById) ؛ // "Object" console.log (typeof document.getElementByTagName) ؛ // "Object" console.log (typeof document.getElementByTagName) ؛ // "هدف"
تحدث هذه الظاهرة الغريبة لأن المتصفحات لديها اختلافات في تنفيذ DOM. باختصار ، لم تنفذ هذه الإصدارات السابقة من IE DOM كطريقة JavaScript مدمجة ، مما يؤدي إلى تحديد المشغل المدمج في تحديد هذه الوظائف ككائنات. نظرًا لأن DOM محدد بوضوح ، فإن معرفة وجود عضو في الكائن موجود يعني أنه طريقة ، غالبًا ما يستخدم المطورون المشغل في الكشف عن طرق DOM ، مثل:
// اكتشف طريقة DOM إذا ("QuerySelectorAll" في المستند) {var images = document.queryselectorall ("img") ؛}يتحقق هذا الرمز ما إذا كان QuerySelectorAll محدد في المستند ، وإذا كان الأمر كذلك ، فاستخدم هذه الطريقة. على الرغم من أنها ليست الطريقة المثالية ، فهي الطريقة الأكثر أمانًا لاكتشاف ما إذا كانت طريقة DOM موجودة في IE 8 والمتصفحات السابقة. في جميع الحالات الأخرى ، يعد مشغل typeof هو الخيار الأفضل للكشف عن وظائف JavaScript.
اكتشف صفيف
واحدة من أقدم المشكلات عبر المجال في JavaScript هي المصفوفات ذهابًا وإيابًا بين الإطارات. سرعان ما اكتشف المطور أن Artyof Array لا يمكنه إرجاع النتيجة الصحيحة في هذا السيناريو. كما ذكر أعلاه ، يحتوي كل إطار على مُنشئ صفيف خاص به ، لذلك لن يتم التعرف على مثيلات في إطار واحد في إطار آخر.
كان هناك الكثير من الأبحاث حول كيفية اكتشاف أنواع الصفيف في JavaScript ، وأخيراً أعطى Kangax حلاً أنيقًا:
دالة isarray (value) {return object.prototype.toString.call (value) === "[كائن صفيف]" ؛}وجد Kangax أن استدعاء طريقة ToString () المدمجة في القيمة تُرجع النتائج القياسية في جميع المتصفحات. بالنسبة للمصفوفات ، تكون السلسلة التي تم إرجاعها هي "[صفيف الكائن]" ، وليس هناك حاجة للنظر في إطار مثيل المصفوفة الذي تم إنشاؤه. غالبًا ما تكون هذه الطريقة مفيدة للغاية عند تحديد الكائنات المضمنة ، ولكن يرجى عدم استخدام هذه الطريقة للكائنات المخصصة.
ECMASCRIPT5 يقدم رسميا array.isarray () في javaScript. الغرض الوحيد هو اكتشاف ما إذا كانت القيمة هي صفيف. مثل وظائف Kangax ، يمكن لـ Array.isarray () أيضًا اكتشاف القيم التي تم تمريرها عبر الإطارات ، حيث تقوم العديد من مكتبات فئة JavaScript بتنفيذ هذه الطريقة بشكل مشابه.
دالة isArray (value) {if (typeof array.isarray === "function") {return array.isarray (value) ؛} else {return object.protype.toString.Call (value) === "[كائن صفيف]" ؛}}IE 9+ و Firefox 4+ و Safari 5+ و Opera 10.5+ و Chrome جميعها تنفذ طريقة Array.isarray ().
اكتشاف الخصائص
سيناريو آخر يكون فيه فارغ (وغير محدد) هو عند اكتشاف ما إذا كانت السمة موجودة في كائن ، مثل:
// الكتابة السيئة: اكتشف القيم الخاطئة إذا (object [propertyName]) {// بعض الكود} // الكتابة السيئة: قارن مع null if (object [propertyname]!كل حكم في الكود أعلاه يتحقق فعليًا من قيمة السمة بالاسم المحدد ، بدلاً من الحكم على ما إذا كانت السمة المشار إليها بالاسم المحدد موجودة. في الحكم الأول ، ستخطئ النتيجة عندما تكون قيمة الخاصية قيمة كاذبة ، مثل: 0 ، "" (سلسلة فارغة) ، خطأ ، فارغ وغير محدد ، بعد كل شيء ، هذه هي القيم القانونية للممتلكات.
أفضل طريقة لتحديد ما إذا كانت السمة موجودة هي استخدام المشغل في. يقوم المشغل ببساطة بقضاة ما إذا كان العقار موجودًا دون قراءة قيمة العقار. إذا كانت خاصية كائن المثيل موجودًا أو يرث من النموذج الأولي للكائن ، فسيعود المشغل في True. على سبيل المثال:
var object = {count: 0 ، ذات الصلة: null} ؛ // الكتابة الجيدة إذا ("العد" في الكائن) {// سيتم تنفيذ الكود هنا // الكتابة السيئة: اكتشف القيم الخاطئة إذا (الكائن [count "]) {// لن يتم تنفيذ الكود هنا // {// لن يتم تنفيذ الكود هنا}إذا كنت ترغب فقط في التحقق مما إذا كانت خاصية معينة من كائن المثيل موجودة ، فاستخدم طريقة HasOwNproperty (). جميع كائنات JavaScript الموروثة من الكائن لها هذه الطريقة. إذا كانت هذه الخاصية موجودة في المثيل ، فإنها تُرجع صحيحًا (إذا كانت هذه الخاصية موجودة فقط في النموذج الأولي ، فإنها تُرجع كاذبة). تجدر الإشارة إلى أنه في IE 8 والإصدارات السابقة من IE ، لا ترث كائنات DOM من الكائن ، لذلك لا تتضمن هذه الطريقة. أي أنه يجب عليك التحقق مما إذا كانت طريقة كائن DOM HasOwNproperty () موجودة قبل تسميتها.
// هذه طريقة جيدة للكتابة إذا (Object.hasOwnProperty ("ذات الصلة")) {// قم بتنفيذ الكود هنا} // إذا لم تكن متأكدًا مما إذا كان كائن DOM ، فاكتب إذا ("hasownproperty"نظرًا لوجود IE 8 والإصدارات السابقة من IE ، عند الحكم على ما إذا كانت سمات كائن المثيل موجودة ، فأنا أفضل استخدام المشغل في. سيتم استخدام HasownProperty () فقط عند الحكم على خصائص المثيل.
بغض النظر عن متى تحتاج إلى اكتشاف وجود خاصية ، استخدم المشغل أو HasownProperty (). القيام بذلك يمكن أن يتجنب العديد من الأخطاء.
ما سبق هو اكتشاف JavaScript للقيم الأصلية والقيم المرجعية والسمات التي أدخلها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!