14

किसी अन्य व्यक्ति द्वारा लिखित जावास्क्रिप्ट डिबग करते समय, मैं कुछ कोड में आया जो मैंने पहले नहीं देखा था। यहां एक नमूना है: यदि DoSomething मौजूदजावास्क्रिप्ट कोडिंग तकनीक या खराब कोड?

function doSomething() { 
    //doing something here... 
} 

function doItNow() { 
    //other logic... 
    doSomething && doSomething(); // <=== What's this? 
} 

समारोह doItNow में 2 लाइन के प्रयोजन है() की जाँच करने और फिर इसे कहते हैं? इस तरह:

function doItNow() { 
    //other logic... 
    if (doSomething) { 
     doSomething(); 
    } 
} 

जेएसलिंट इसे पसंद नहीं करता है और मेरे ऐप में खराब कोड नहीं होगा। कोई अंतर्दृष्टि?

+0

मुझे लगता है कि यह बहुत चालाक है हालांकि यह कोड की पठनीयता को नुकसान पहुंचाता है। मैं इस "खराब कोड" को "खराब पठनीयता के साथ कोड" नहीं कहूंगा –

+0

भाषा के आधार पर, इसे मानक मुहावर माना जा सकता है। –

उत्तर

7

यह वास्तव में 'शॉर्टंड' है। दाएं तरफ केवल तभी निष्पादित किया जाता है जब बाएं तरफ if() कथन के रूप में गुजरता है।

Google क्लोजर कंपाइलर और अन्य मिनीफायर इसका लाभ उठाते हैं; यदि आपके इनपुट if(a) a() है, यह a&&a()


में परिणाम होगा उदाहरण के लिए आप || साथ भी ऐसा ही कर सकता है,:

if(!a){ 
    alert('Not a'); 
} 

a || alert('Not a'); 
+0

धन्यवाद, यह मेरा अनुमान था। – Silkster

6

हाँ, के रूप में लिखा जा सकता है आपके दो उदाहरण "समकक्ष" हैं, && ऑपरेटर short-circuit evaluation करता है।

पहले संकार्य अभिव्यक्ति एक falsey मूल्य पैदावार हैं (जैसे null, undefined, 0, NaN, एक खाली स्ट्रिंग, और निश्चित रूप false का), दूसरे संकार्य अभिव्यक्ति नहीं मूल्यांकन किया जाएगा, और यदि मान सत्य है, फ़ंक्शन कॉल किया जाएगा।

लेकिन doSomething घोषित नहीं किया गया है, तो आपके दोनों उदाहरण विफल हो जाएंगे।

एक पहचानकर्ता है कि घोषित नहीं कर रहा है, कोड पर संदर्भित है, तो आप एक ReferenceError अपवाद मिल जाएगा, जैसे:

function foo() { 
    undeclared && undeclared(); 
} 

try { 
    foo(); 
} catch (e) { 
    alert(e); // ReferenceError! 
} 

आप करना चाहते हैं:

  1. यकीन पहचानकर्ता मौजूद है, और
  2. यह प्रतिदेय
है सुनिश्चित करें

आप कर सकते हैं:

if (typeof doSomething == 'function') { 
    doSomething(); 
} 

typeof operator सुरक्षित रूप से पहचानकर्ता मौजूद नहीं है कि, इसके साथ ही जांच करते हुए कि doSomething एक समारोह है द्वारा पर इस्तेमाल किया जा सकता है, तो आप यह सुनिश्चित करें कि आप इसे आह्वान करने में सक्षम हो जाएगा।

+0

+1। यह स्वीकार किए गए एक से अधिक पूर्ण उत्तर है। –

+0

@Tim: धन्यवाद! :) – CMS

+0

@ सीएमएस, प्रतिक्रिया के लिए धन्यवाद। – Silkster

1

तुलना में कॉलिंग फ़ंक्शंस (या असाइनमेंट इत्यादि) आमतौर पर एक बुरा विचार है। लोग आम तौर पर साइड इफेक्ट्स की अपेक्षा नहीं करते हैं।यह मामला इतना आसान है कि हो सकता है कि उचित हो, लेकिन अगर कोई सम्मेलन को समझ में नहीं आता है तो उन्हें स्टैक ओवरव्लो पर पूछना पड़ सकता है;)

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