2013-05-22 13 views
10

मैं सामने के अंत developement का एक बहुत कर रहा हूँ में एक डिफ़ॉल्ट चर मूल्य की स्थापना और मैं अपने आप को यह एक बहुत कुछ कर देखें:एक समारोह

function doSomething(arg){ 
    var int = arg ? arg : 400 
    //some code after 
} 

तो मैं अगर यह करने के लिए एक तरीका था सोच रहा था, लेकिन छोटा और क्लीनर (मुझे एक ही पंक्ति में arg दो बार देखना पसंद नहीं है)।

मैं कुछ ऐसा ही कुछ कर लोगों को देखा है:

var int = arg || 400; 

और क्योंकि मैं जो क्रम में पता नहीं है मैं मूल्य रखने के लिए आवश्यक है, मैं arg || 400 और 400 || arg की कोशिश की, लेकिन यह हमेशा सेट हो जाएगा int दाईं ओर मूल्य के लिए, भले ही arg अपरिभाषित है।

मुझे PHP में पता है कि आप डिफ़ॉल्ट मान सेट करने के लिए function doSomething(arg = 400) जैसे कुछ कर सकते हैं और एक jQuery प्लगइन में आप .extend() का उपयोग डिफ़ॉल्ट संपत्ति के लिए कर सकते हैं, लेकिन क्या एक चर के साथ एक छोटा रास्ता है? या क्या मुझे अपना रास्ता इस्तेमाल करना है?

किसी भी मदद के लिए धन्यवाद और यदि आप मुझे संसाधन भेज सकते हैं, तो इसकी सराहना की जाएगी।

+2

झूठी कीमतों को बट में काटने की अनुमति न दें। यदि आप संख्याओं के साथ काम कर रहे हैं, तो अपरिभाषित की जांच करना बेहतर है। – epascarello

+1

[** यह **] (http://stackoverflow.com/a/476445/1823841) ** कोलेसे ऑपरेटर ** को बेहतर समझने में आपकी सहायता कर सकता है। –

उत्तर

15

से

var int = arg || 400; 

वास्तव में वास्तव में कोई छोटा साफ रास्ता नहीं है, सही तरीका लंबे समय तक हो सकता है, अगर आप आर्ग के रूप में 0, false या "" पारित करने की अनुमति चाहते हैं:

var int = arg===undefined ? 400 : arg; 

एक मामूली और लगातार सुधार एक नया चर घोषित नहीं करना है, लेकिन मूल का उपयोग करें:

if (arg===undefined) arg=400; 
+1

ध्यान दें कि आपको सुरक्षित होने के लिए, उस तरह से 'अपरिभाषित' की जांच नहीं करनी चाहिए। आपको '(टाइपऑफ arg === 'अपरिभाषित') का उपयोग करना चाहिए। –

+2

@ColinDeClue बस के खिलाफ सुरक्षित होने के लिए? खुद को 'अपरिभाषित' को फिर से परिभाषित किया गया है? ES5 में यह संभव नहीं है। 'शून्य' पास हो रहा है? –

+0

पहला वाला। आपके द्वारा आयात किए गए पुस्तकालय द्वारा या आपके द्वारा काम किए जाने वाले किसी व्यक्ति द्वारा 'अपरिभाषित' को फिर से परिभाषित किया जा सकता है। यह नहीं होना चाहिए, लेकिन 'अपरिभाषित' उत्परिवर्तनीय है, इसलिए ... –

0
function func(x,y){ 
    if(typeof(x)==='undefined') x = 10; 
    if(typeof(y)==='undefined') y = 20; 

    //code goes here 
} 
+0

टाइपऑफ एक विधि कॉल नहीं है – epascarello

+0

इसका उपयोग इस तरह नहीं किया जा रहा है, न ही इसे फ़ंक्शन के रूप में उपयोग किया जा रहा है। एक्स और वाई के आसपास कोष्ठक आवश्यक नहीं हैं लेकिन कोई समस्या नहीं है। – HBP

0

आपके समाधानों में समस्या यह है कि एक मान जो झूठे का मूल्यांकन करता है (उदाहरण के लिए "झूठी" या "0") भी डिफ़ॉल्ट मान को ट्रिगर करता है। इसलिए प्रत्येक पैरामीटर के लिए संभवत: कभी भी एक मान है जो झूठे मूल्यांकन का मूल्यांकन करता है, आपको स्पष्ट रूप से "अपरिभाषित" की जांच करनी होगी।

var int = (typeof x === 'undefined') ? default : x 

आप

var int = x ? x : default 
OR 
var int = x || default 

एक अन्य विकल्प का उपयोग कर सकते यदि यह संभव नहीं है तर्क सरणी का प्रयोग और देखें कि क्या मापदंडों दिए गए थे करने के लिए किया जाएगा। लेकिन इसका उपयोग केवल तभी किया जा सकता है यदि आपके वैकल्पिक पैरामीटर अंतिम हैं।

function test(x, y) { 
    var int1 = (arguments.length > 0) ? x : default; 
    var int2 = (arguments.length > 1) ? y : default; 
} 
+0

या सभी प्रकार के टाइप को छोड़ दें और जांचें कि यह अनिर्धारित है या नहीं। – epascarello

+2

@epascarello: यह सुरक्षित नहीं है। कुछ अप्रासंगिक में 'अपरिभाषित' उत्परिवर्तनीय है। –

+0

आधुनिक ब्राउज़र इसे ओवरराइट होने से रोकते हैं। इसके अलावा 12 वर्षों में मैं जावास्क्रिप्ट कोडिंग कर रहा हूं मैंने ऐसा कभी नहीं किया है! अब लोग ओवरराइडिंग सबमिट एक अलग कहानी है। और यदि आप वास्तव में डरते हैं, तो एक वेरिएबल स्टोर करें जो अपरिभाषित है और इसका उपयोग करें। – epascarello

0

सीधे प्रश्न से संबंधित नहीं है, लेकिन एक तर्क को दर्पण करने के लिए एक नया चर क्यों बनाते हैं?

इस स्थिति में मैं का प्रयोग करेंगे:

!arg && (arg = 400); 

बहरहाल, यह असत्यता के लिए arg परीक्षण जिसका मतलब है कि मूल्यों false, 0, '', null और undefined सब का कारण होगा कि arg400 करने के लिए सेट किया जाना है।

function f (arg) { 
    !arguments.length && (arg = 400); 

यह जांच करता है कि किसी भी मूल्य पारित किया गया था और केवल उसी स्थिति है कि कॉल में arg सेट: यदि यह वांछित परिणाम नहीं है, शायद 0 के एक मूल्य तो मैं आमतौर पर argument.length का परीक्षण एक वैध arg मूल्य है बिल्कुल कोई तर्क निर्दिष्ट नहीं है।

केवल विशिष्ट मामलों में जहां 0 एक वांछित मान मैं निर्माण

arg || 400 

जो फिर असत्यता परीक्षण

से ग्रस्त का प्रयोग करेंगे नहीं है, तो यह महत्वपूर्ण है कि arg आप इस्तेमाल कर सकते हैं अंकीय होना है:

typeof arg !== 'number' && (arg = 400); 

जो यह सुनिश्चित करेगी कि arg एक नंबर था और कोड के बाकी हिस्सों में।

निष्कर्ष में: यह इस बात पर निर्भर करता है कि आप तर्क का उपयोग कैसे करना चाहते हैं, कौन से मान मान्य हैं और आप अपने कोड के कॉलर्स पर कितना भरोसा करते हैं।

0

मैं जाँच करेगा arguments.length:

var f = function(arg) { 
    var myArg = arguments.length > 0 ? arg : 400; 
}; 
0

ES6 में, आप तर्क करने के लिए डिफ़ॉल्ट मान सेट कर सकते हैं उसी तरह हम PHP में कार्य करें:

function foo(a = [], b = 'string', c = false){} 

डिफ़ॉल्ट मूल्य भी पिछले करने के लिए सेट किया जा सकता है तर्क कहां भी एक समारोह के वापसी मूल्य

function foo(a = true, b = a, c = bar()){} 

यह ई के साथ भी काम करेगा एस 6 कंपाइलर। अंतिम परिणाम इस

function foo() { 
    var a = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; 
    var b = arguments.length <= 1 || arguments[1] === undefined ? a : arguments[1]; 
    var c = arguments.length <= 2 || arguments[2] === undefined ? bar() : arguments[2]; 
} 
संबंधित मुद्दे