2016-01-18 8 views
10

अनपेक्षित "।" इस कोड पर jslint (http://jslint.com/) से:क्यों 'अप्रत्याशित "।' 'का उपयोग करते समय || ब्रांड्स में डिफ़ॉल्ट मान के लिए ऑपरेटर

function test(foo) { 
    "use strict"; 
    return (foo || "").replace("bar", "baz"); 
} 

क्यों साथ एक समस्या है jslint है || एक खाली स्ट्रिंग को मजबूर करने के लिए ऑपरेटर ताकि एक त्रुटि को बिना त्रुटि के निष्पादित किया जा सके, अगर फू को अपरिभाषित के रूप में पास किया गया हो?

यह गुजरता है:

function test(foo) { 
    "use strict"; 
    var xFoo = (foo || ""); 
    return xFoo.replace("bar", "baz"); 
} 

मैं जानता हूँ कि यह राय आधारित है और मैं इसे अनदेखा कर सकते, आदि ... लेकिन समझने के लिए क्यों इस तरह चेनिंग पर सिकोड़ी है कोशिश कर रहा। एशिंट के बारे में भी जानते हैं, लेकिन मैं इस संदेश को पाने की कोशिश नहीं कर रहा हूं, बस समझना चाहता हूं कि क्यों।

ऐसा लगता है कि पहला दृष्टिकोण अधिक संक्षिप्त और क्लीनर है क्योंकि इसे अतिरिक्त चर (xFoo) की आवश्यकता नहीं है।

दोनों कार्य सभी स्थितियों के तहत बिल्कुल वही काम करते हैं।

+3

यह जेएसलिंट में एक बग जैसा दिखता है। – SLaks

+0

[jsHint] (http://jshint.com/) आपके पहले फ़ंक्शन के साथ कोई समस्या नहीं है। – jfriend00

+0

ऐसा लगता है कि यह एक बग है।यदि यह राय आधारित था, तो आपको एक और त्रुटि स्पष्ट रूप से बताई जाएगी कि यह आपके लिंट कॉन्फ़िगरेशन के आधार पर डूब गया है। – mostruash

उत्तर

1

String() contructor का उपयोग jslint

function test(foo) { 
    "use strict"; 
    return String(foo || "").replace("bar", "baz"); 
} 

भी देखें Distinction between string primitives and String objects में त्रुटि निकाल देता है, JSLint Help

+1

@ChrisGciso यह 'वापसी foo && foo.replace ("bar", "baz") भी पास करता है; ' – guest271314

+0

@ स्ट्रिस शास्त्रीय स्ट्रिंग शाब्दिक से जुड़ी उपस्थिति विधि jslint पर चेतावनी के रूप में सूचित करती है? 'फ़ंक्शन टेस्ट (foo) { "सख्त उपयोग करें"; अगर (! Foo) { वापसी ""। जगह ("बार", "बाज़"); } } ', 'फ़ंक्शन टेस्ट (foo) { " सख्त उपयोग करें "; अगर (! Foo) { वापसी "बार"। जगह ("बार", "बाज़"); } } ' – guest271314

+3

@ChrisGciso - मैं यह नहीं कहूंगा कि यह कोड का" उचित "तरीका है। जेएसलिंट शिकायत रोकने के लिए यह तरीका है। जेएसलिंट यहाँ भगवान नहीं है। मैं इस तरह का एक फ़ंक्शन लिख सकता हूं और अगर कोई इसे 'सत्य' पास करता है तो अपवाद फेंकना चाहता है क्योंकि यह एक अमान्य मान है जिसे मैं स्ट्रिंग में घुमा नहीं चाहता हूं। उस स्थिति में, यह नई विधि गलत है। – jfriend00

1

ऐसा इसलिए हो सकता है क्योंकि यह मानता है कि (foo || "") एक बूलियन अभिव्यक्ति का मूल्यांकन करेगा, इसलिए false.replace() जैसे कुछ समझ में नहीं आएगा। हालांकि, हाँ, आपके मामले में आपको इसके बजाय एक चर या खाली स्ट्रिंग मिलती है।

+0

यह कभी भी 'झूठा' नहीं होगा लेकिन यह 'सत्य' –

+0

हो सकता है, मैं यह नहीं कह रहा हूं कि यह बूलियन के रूप में मूल्यांकन करेगा, बस जेएसलिंट का मानना ​​है कि ऐसा इसलिए होगा क्योंकि यह एक बूलियन अभिव्यक्ति की तरह दिखता है। इसके अलावा, अगर 'foo' 'false',' अपरिभाषित 'है, तो अभिव्यक्ति' ''' '' 'का उपयोग करेगी, जो भी गलत है। यह 'सत्य' कैसे हो सकता है, यदि दोनों मामले 'झूठी' का मूल्यांकन कर सकते हैं? – ScriptedPixels

1

तुम सिर्फ यह दो पंक्तियों बना सकता है।

function test(foo) { 
    "use strict"; 
    foo = foo || ""; 
    return foo.replace("bar", "baz"); 
} 

एक अस्थायी xFoo चर बनाने के लिए कोई जरूरत नहीं है। foo पैरामीटर JavaScript does not support passing-by-reference के बाद से पारित तर्क की एक प्रति है।

ऐसा लगता है कि आप यहां क्या करने का प्रयास कर रहे हैं एक डिफ़ॉल्ट पैरामीटर प्रदान करते हैं। उस मामले में मैं इसे बनाना होगा साफ क्या आप और भी अधिक स्पष्ट और होने से क्या कर रहे हैं यह प्रकार की जाँच:

function test(foo) { 
    "use strict"; 
    if (foo === undefined) { 
     foo = ""; 
    } 
    return foo.replace("bar", "baz"); 
} 

हाँ, यह कम संक्षिप्त है, लेकिन यह करने के लिए कोड के इरादे के लिए कम कमरे छोड़ देंगे बाद में इसे पढ़ने वाले किसी व्यक्ति द्वारा गलत व्याख्या की जाए। स्पष्ट रूप से प्रकार की जांच करने से आप अन्य संभावित समस्याओं को संभालने की अनुमति भी देते हैं। ताकि आप डिफ़ॉल्ट पैरामीटर और many other उपयोग कर सकते हैं

function test(foo = "") { 
    "use strict"; 
    if (typeof foo !== 'string') { 
     throw('foo must be a string'); 
    } 
    return foo.replace("bar", "baz"); 
} 

काफी किसी भी परियोजना के लिए मैं अपने निर्माण की प्रक्रिया के लिए Babel जोड़ने का सुझाव होगा:

function test(foo) { 
    "use strict"; 
    if (foo === undefined) { 
     foo = ""; 
    } else if (typeof foo !== 'string') { 
     throw('foo must be a string'); 
    } 
    return foo.replace("bar", "baz"); 
} 

आप ES2015 का उपयोग कर रहे हैं, तो आप भी इस्तेमाल कर सकते हैं एक default parameter उपयोगी विशेषताएं ES2015 भाषा में जोड़ती है। बैबेल का उपयोग करने से आप उन्हें लागू करने के लिए सभी ब्राउज़रों का इंतजार किए बिना अब उनका उपयोग कर सकते हैं।

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

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