ما هي أفضل طريقة لإخبار المستخدمين من وظائف المكتبة التي مرت المتغيرات ليست من النوع الصحيح

StackOverflow https://stackoverflow.com/questions/430937

  •  08-07-2019
  •  | 
  •  

سؤال

أنا حاليا في إنشاء وظيفة جافا سكريبت المكتبة.أساسا للاستخدام بلدي, ولكن يمكنك أبدا أن يكون متأكدا إذا كان شخص آخر ينتهي استخدامه في مشاريعهم ، أنا على الأقل خلق له كما لو أنه يمكن أن يحدث.
معظم أساليب العمل إلا إذا كانت المتغيرات التي مرت هي من نوع البيانات الصحيح.الآن سؤالي هو:ما هي أفضل طريقة لتنبيه المستخدمين أن متغير ليست من النوع الصحيح?يجب رمي خطأ مثل هذا ؟

function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
 if(typeof(thisShouldBeAString) === 'string') {
  throw('foo(var), var should be of type string');
 }
 #yadayada
}

وأنا أعلم أن جافا سكريبت لا الداخلية نوع التحويل, ولكن هذا يمكن أن تخلق غريب جدا النتائج (أي '234' + 5 = '2345' ولكن '234' * 1 = 234) و هذا يمكن أن تجعل بلدي أساليب تفعل أشياء غريبة.

تحرير
لجعل الأمور واضحة اضافية:أنا لا ترغب في أن تفعل نوع تحويل المتغيرات مرت ينبغي أن تكون من النوع الصحيح.ما هي أفضل طريقة لتخبر المستخدم من مكتبتي التي مرت المتغيرات ليست من النوع الصحيح?

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

المحلول

بعض الملاحظات على نوع فحص - انها في الواقع ليست بهذا التعقيد:

استخدام typeof للتحقق من الأوليات ، instanceof للتحقق من معينة أنواع الكائنات.

على سبيل المثال:التحقق من السلاسل مع

typeof x === 'string'

أو

typeof x === 'string' || x instanceof String

إذا كنت تريد أن تشمل سلسلة الكائنات.

للتحقق من المصفوفات, مجرد استخدام

x instanceof Array

هذا يجب أن تعمل بشكل معقول (هناك بعض الاستثناءات المعروفة مثل فايرفوكس 3.0.5 وقد الخلل فيها window instanceof Object === false على الرغم من أن window.__proto__ instanceof Object === true).

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

من حيث المبدأ ، يمكن كل استخدام typeof func === 'function' و func instanceof Function.

الصيد هو أن في اسمه المتصفح من شركة كبيرة هذه الشيكات إرجاع نتائج خاطئة لبعض وظائف محددة مسبقا (نوع هو 'object').أنا لا أعرف الحل لهذا - الشيكات فقط تعمل بشكل موثوق على الدالات المعرفة من قبل المستخدم...

edit2: هناك أيضا مشاكل مع الكائنات مرت من النوافذ الأخرى/إطارات ، كما أنها سوف ترث من مختلف الكائنات العالمية - أي instanceof سوف تفشل.الحلول عن المدمج في الكائنات موجودة:على سبيل المثال, يمكنك التحقق من ذلك عن طريق المصفوفات Object.prototype.toString.call(x) === '[object Array]'.

نصائح أخرى

المشكلة مع نوع التحقق هو في الواقع من الصعب جدا أن تفعل.على سبيل المثال:-

var s = new String("Hello World!");
alert(typeof s);

ما يحصل نبهت?الجواب:"الكائن".الحقيقية لها المعتوه طريقة التهيئة سلسلة لكني أرى أنه في كثير من الأحيان لا شيء بين بين فإن أقل.أنا أفضل أن محاولة التحويلات عند الضرورة أو القيام بأي شيء.

وقد قلت ذلك في جافا سكريبت البيئة التي يجب السيطرة الكاملة (التي لا صحيح إذا كنت ببساطة توفير مكتبة) يمكنني استخدام هذا النموذج القرص:-

String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;

ومن ثم اختبار الأنواع الشائعة يمكن أن تكون بسيطة مثل:-

if (x.isString)

على الرغم من أنك لا تزال تحتاج إلى احترس null/غير معروف:-

if (x != null && x.isString)

بالإضافة إلى تجنب new String("thing") مسكتك هذا النهج وخاصة يأتي إلى جانبها في تواريخ و المصفوفات.

والمكتبات مثل مسج لا إعلام المستخدم من الخطأ.

إذا وظيفة تتوقع عددا، والمستعمل يمر سلسلة، تقوم الدالة بإرجاع فقط دون أن تفعل أي شيء.

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

PS. فقط للتأكد من اكتب دائما التحقق من المعلمات الخاصة إدخالها، لتجنب أخطاء جافا سكريبت التي ألقيت.

وماذا عن throw: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/ رمي

واكتب أيضا من لا يميز بين صفيف، لاغية، كائن بشكل جيد للغاية. نظرة على funciton هنا: http://javascript.crockford.com/remedial.html ، بالإضافة إلى وجود عدد قليل من الطرق الأخرى للقيام بذلك.

وشخصيا لم أكن لأفعل نوع فحص لأنها خطوة من شأنها أن مجرد إضافة المزيد من وقت المعالجة إلى رمز. إذا كنت تهتم الأداء، تريد أن يقطع أكبر عدد ممكن من ميلي ثانية من وقت المعالجة ممكن. أما الوثائق جيدة علاج الحاجة للتحقق.

وماذا عن مجرد لتحويل بصمت سلسلة لنوع البيانات الرقمية على بدء التشغيل وظيفة؟

ويمكنك دائما تحديد نوع البيانات من 'سلسلة'. لا يمكن لك؟

هل يمكن أن تحقق بعض القيمة مثل "debug=1" مجموعة.إذا كان هناك - يمكن إخراج أخطاء مثل التنبيهات.حتى في طريقة تطوير المستخدم سوف نرى لهم, ولكن على الموقع الحقيقي أنه سيتم إيقاف تشغيله.بنفس الطريقة المتصفح لن تظهر لك رسالة خطأ - تحتاج إلى إلقاء نظرة على شبيبة وحدة التحكم.

أيضا هناك الحرائق.هل يمكن الكشف عن ذلك ووضع الفيس بوك رسائل التصحيح أيضا.

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