2009-01-10 8 views
5

नहीं हैं, मैं वर्तमान में जावास्क्रिप्ट फ़ंक्शन लाइब्रेरी के निर्माण में हूं। मुख्य रूप से मेरे अपने उपयोग के लिए, लेकिन आप कभी भी यह सुनिश्चित नहीं कर सकते कि अगर कोई अन्य अपनी परियोजनाओं में इसका उपयोग कर समाप्त होता है, तो मैं इसे कम से कम बना रहा हूं जैसे कि ऐसा हो सकता है।
अधिकांश विधियां केवल तभी काम करती हैं जब पारित चर सही डेटाटाइप के होते हैं। अब मेरा सवाल है: उपयोगकर्ताओं को चेतावनी देने का सबसे अच्छा तरीका क्या है कि परिवर्तनीय सही प्रकार का नहीं है? क्या किसी को इस तरह की त्रुटि फेंकनी चाहिए?मेरे लाइब्रेरी फ़ंक्शंस के उपयोगकर्ताओं को बताने का सबसे अच्छा तरीका क्या है कि पारित चर सही प्रकार

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) और यह मेरा तरीकों कर कर सकता है बहुत अजीब चीजें।

संपादित
बातें अतिरिक्त स्पष्ट करने के लिए: मैं जैसे रूपांतरण करने की इच्छा नहीं है, चर पारित कर दिया सही प्रकार की होनी चाहिए। मेरी लाइब्रेरी के उपयोगकर्ता को बताने का सबसे अच्छा तरीका क्या है कि पास किए गए चर सही प्रकार के नहीं हैं?

+0

एक तरफ नोट पर, टाइपोफ एक ऑपरेटर है, एक समारोह नहीं है और इसलिए ब्रेसिज़ नहीं होना चाहिए (हालांकि यह काम करता है)। अगर (इस shouldBeAString === 'स्ट्रिंग' टाइप करें) { –

+0

आपको 'स्ट्रिंग' फेंकने का उपयोग नहीं करना चाहिए, लेकिन उपयोगी डीबग जानकारी प्राप्त करने के लिए 'नई त्रुटि (' एक स्ट्रिंग ') फेंक दें ... – Christoph

उत्तर

2

प्रकार की जाँच पर कुछ छोटे टिप्पणी - यह वास्तव में है कि जटिल नहीं है:

उपयोग typeof पुरातन के लिए जाँच करने के लिए और instanceof विशिष्ट वस्तु प्रकार के लिए जाँच करने के लिए।

उदाहरण: के साथ तार के लिए जाँच करें

typeof x === 'string' 

या

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

आप स्ट्रिंग वस्तुओं शामिल करना चाहते हैं।

सरणियों के लिए जाँच के लिए, बस का उपयोग

x instanceof Array 

यह काफी अच्छा काम करना चाहिए (वहाँ कुछ ज्ञात अपवाद हैं - जैसे फ़ायरफ़ॉक्स 3.0.5 एक बग है जहां window instanceof Object === falsewindow.__proto__ instanceof Object === true हालांकि)।

संपादित करें: वहाँ समारोह वस्तुओं का पता लगाने के साथ कुछ आगे की समस्याओं कर रहे हैं:

सिद्धांत रूप में, तुम दोनों typeof func === 'function' और func instanceof Function इस्तेमाल कर सकते हैं।

पकड़ यह है कि एक बड़े निगम से एक अज्ञात ब्राउज़र में ये चेक कुछ पूर्वनिर्धारित कार्यों के लिए गलत परिणाम लौटाते हैं (उनका प्रकार 'object' के रूप में दिया जाता है)। मैं इस के लिए कोई समाधान के बारे में पता - चेकों केवल उपयोगकर्ता परिभाषित कार्यों के लिए मज़बूती से काम करते हैं ...

EDIT2: वहाँ भी, अन्य विंडो/फ्रेम से पारित कर दिया वस्तुओं के साथ समस्याओं के रूप में वे विभिन्न वैश्विक वस्तुओं से प्राप्त कर लेगा हैं - यानी instanceof असफल हो जाएगा। अंतर्निहित वस्तुओं के लिए वर्कअराउंड मौजूद हैं: उदाहरण के लिए, आप Object.prototype.toString.call(x) === '[object Array]' के माध्यम से सरणी की जांच कर सकते हैं।

0

फ़ंक्शन स्टार्टअप पर स्ट्रिंग को संख्यात्मक डेटाटाइप में चुपचाप रूपांतरित करने के बारे में क्या है?

आप हमेशा 'स्ट्रिंग' के डेटाटाइप को निर्धारित कर सकते हैं। क्या तुम नहीं कर सकते

+0

I टाइप रूपांतरण के विषय पर मेरा प्रश्न अधिक स्पष्ट बना दिया। –

1

jQuery जैसी पुस्तकालय त्रुटि के उपयोगकर्ता को सूचित नहीं करते हैं।

यदि कोई फ़ंक्शन किसी संख्या की अपेक्षा कर रहा है, और कोई उपयोगकर्ता स्ट्रिंग पास करता है, तो फ़ंक्शन कुछ भी किए बिना वापस आता है।

इस तरह, आप लाइव वेबसाइट पर पॉप-अप करने वाली जावास्क्रिप्ट त्रुटियों से बचेंगे।

पीएस। जावास्क्रिप्ट त्रुटियों को फेंकने से बचने के लिए बस अपने इनपुट पैरामीटर को हमेशा टाइप करना सुनिश्चित करें।

+0

लेकिन क्या यह अन्य डेवलपर को यह भी सूचित नहीं करेगा कि कुछ बुरा चल रहा है, और वह बुरा जो वास्तव में चल रहा है? –

+0

यदि आप अपनी लाइब्रेरी के लिए अच्छा दस्तावेज तैयार करते हैं, तो डेवलपर यह जान लेगा कि यदि कोई फ़ंक्शन पैरामीटर के लिए किसी संख्या की अपेक्षा करता है, और डेवलपर स्ट्रिंग में पास हो जाता है, तो फ़ंक्शन उस कारण से काम नहीं करेगा। –

+0

दरअसल मुझे यह काफी असुविधाजनक लगता है, जब मुझे एक त्रुटि मिलती है कि मुझे कुछ लाइब्रेरी के अंदर कहीं गहरा गलती हुई है। –

1

कैसे throw के बारे में: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/throw

भी की टाइप सरणी बीच भेद नहीं करता, अशक्त, बहुत अच्छी तरह से वस्तु। यहां funciton को देखें: http://javascript.crockford.com/remedial.html, साथ ही इसे करने के कुछ अन्य तरीके हैं।

व्यक्तिगत रूप से मैं टाइपिंग नहीं करूँगा क्योंकि यह एक ऐसा कदम है जो कोड में अधिक प्रोसेसिंग समय जोड़ देगा। यदि आप प्रदर्शन के बारे में परवाह करते हैं, तो आप जितना संभव हो सके प्रसंस्करण समय के कई मिलीसेकंड काटना चाहते हैं। अच्छा दस्तावेज चेक की आवश्यकता को ठीक करेगा।

0

आप "डीबग = 1" सेट जैसे कुछ मूल्य की जांच कर सकते हैं। यदि वहां है - तो आप अलर्ट जैसे त्रुटियों को आउटपुट कर सकते हैं। तो विकास मोड में उपयोगकर्ता उन्हें देखेंगे, लेकिन असली साइट पर वह इसे बंद कर देगा। वैसे ही ब्राउज़र आपको त्रुटि संदेश नहीं दिखाएगा - आपको जेएस कंसोल को देखने की ज़रूरत है।

इसके अलावा फायरबग भी है। आप इसका पता लगा सकते हैं और एफबी डीबग संदेश भी डाल सकते हैं।

4

प्रकार की जांच के साथ समस्या यह है कि यह वास्तव में करना मुश्किल है। उदाहरण के लिए: -

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) 

तुम अब भी के लिए अशक्त/अपरिभाषित बाहर देखने की जरूरत है, हालांकि -: इसलिए आम प्रकार के लिए परीक्षण के रूप में सरल किया जा सकता है

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

new String("thing") गॉचा से बचने के अलावा, यह दृष्टिकोण विशेष रूप से तिथियों और Arrays पर अपने आप में आता है।

+0

प्रोटोटाइप का विस्तार करना आवश्यक नहीं है - नीचे मेरा उत्तर देखें ... – Christoph

+0

यह समझ गया कि यह _necessary_ नहीं है और कुछ मामलों में यह सलाह भी नहीं है हालांकि मुझे यह साफ और कुशल लगता है। – AnthonyWJones

संबंधित मुद्दे

 संबंधित मुद्दे