2012-11-02 21 views
5

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

myFunc("arg"); or myFunc(["arg1", "arg2", ...]); 

, लेकिन यह वास्तव में एक अच्छी बात है?

दूसरी ओर, यह स्पष्ट रूप से नहीं बताया गया है कि फ़ंक्शन किस प्रकार है, और AFAIK तब जेआईटी कंपाइलर प्रभावी ढंग से काम नहीं कर सकता है। और अक्सर किसी प्रकार का एक प्रकार का दबाव होना पड़ता है, जो अतिरिक्त प्रदर्शन जुर्माना पेश कर सकता है।

इसलिए, यह बेहतर होगा हमेशा लिखने: myFunc(["arg"]) भले ही सरणी में केवल एक ही वस्तु है? इस पर आपका क्या लेना है?

+4

आप इस सवाल के साथ मधुमक्खियों के एक घोंसले में चल रहे हैं। – thatidiotguy

+0

यह निर्भर करता है। यदि आपको उस लचीलापन की आवश्यकता है/चाहते हैं, तो आप इसे कर सकते हैं। – Bergi

+0

ठीक है, यह केवल एक प्रकार का अधिभार है, है ना? – DerWaldschrat

उत्तर

2

जावास्क्रिप्ट को कम से कम टाइप किया गया है। यदि आप सावधान नहीं हैं, तो यह आपको काट सकता है, लेकिन यह चीजों को ठीक तरह से करने के लिए भी बहुत लचीलापन प्रदान करता है। मैं अक्सर इस व्यवहार का लाभ उठाता हूं; समारोह में, आप आम तौर पर इस तरह की एक संरचना है चाहता हूँ:

var func = function(someArg) { 
    var data; 

    switch (typeof someArg) { 
     case 'string': 
      // transform someArg into data 
      // example: pass it as a jquery selector to get a jquery object 
      break; 
     case 'object': 
      // transform someArg into data 
      break; 
     ... 
     default: 
      throw new Error('Invalid argument type passed to func!'); 
    } 

    // rest of function that expects data to be a certain type 
}; 

आपका कार्यों अधिक जटिल होता जा की कीमत पर उपभोग करने के लिए और अधिक लचीला और आसान हो जाएगा। चाहे लचीलापन के लिए जटिलता का आदान-प्रदान योग्य है, यह स्थिति से स्थिति (और व्यक्ति से व्यक्ति) में भिन्न होगा।

संपादित करें: Array के साथ सावधान रहना: typeof someArray"object" दे देंगे, आप के बजाय इस का उपयोग करने होंगे: someArray instanceof Arrayhttp://jsfiddle.net/8ycFb/

+0

... या इससे भी बेहतर 'Array.isArray (someArg) ' – Bergi

+0

@ बरगी [शोध] (http://perfectionkills.com/instanceof- पर विचार किया गया -हर्मफुल-या-टू-टू-राइट-ए-रोबस्ट-इसाएरे /) 'ऑब्जेक्ट .prototype.toString.call (ओ) ===' [ऑब्जेक्ट ऐरे] 'बताता है; ' – jbabey

+0

@jababey मुझे पता है कि आप सब कुछ कर सकते हैं यह, लेकिन अकेले आपके उदाहरण से आप वास्तव में ओवरहेड को गंध कर सकते हैं जो मुझे बहुत खराब करता है (और कोड को अनुकूलित करने के साथ जेआईटी कंपाइलर को बाधित कर सकता है)। आपने यह भी लिखा: "यदि आप सावधान नहीं हैं तो यह आपको काट सकता है", ताकि विभिन्न प्रकारों की अनुमति देने का एक और नुकसान हो। अभी, मुझे आश्चर्य है कि मुझे कुछ सिरदर्द और संभावित perf मुद्दों को बचाने के लिए बस * एक * प्रकार के साथ रहना चाहिए, भले ही कुछ मामलों में मुझे कुछ और अक्षर टाइप करना पड़े। –