2013-03-30 5 views
6

मैंने कई बार देखा है कि fn && fn()if (fn) fn() का अनुकूलन है।"if (fn) fn()" या "fn && fn()"

मेरा प्रश्न है: क्यों? और, दोनों समाधानों के लिए जेनरेट कोड क्या है?

+2

"जेनरेट कोड" से आपका क्या मतलब है? – Kobi

+0

@ कोबी मैं अनुमान लगा रहा हूं कि उसका मतलब है कि प्रश्न में जावास्क्रिप्ट को संकलित किया गया है - निम्न स्तर कोड। – kba

+0

@ कोबी, केबीए सही है, मेरा मतलब निम्न स्तर कोड, असेंबलर है। –

उत्तर

13

जावास्क्रिप्ट में && ऑपरेटर है: अपने कोड में, fn इस तरह के एक स्ट्रिंग के रूप में अन्य प्रकार की एक वस्तु जा रहा है की संभावना है, तो आप इस तरह के रूप में, को क्रियान्वित करने से पहले प्रकार की जांच जोड़ने की जरूरत शॉर्ट सर्किट, जिसका अर्थ है कि यदि बाएं हाथ की ओर false है, तो दाईं ओर की तरफ का मूल्यांकन नहीं किया जाता है। यही कारण है कि fn && fn() सुरक्षित है भले ही fn गलत है (null, undefined, आदि)।

"उत्पन्न कोड" पूरी तरह से जावास्क्रिप्ट इंजन पर निर्भर करेगा, लेकिन मुझे उम्मीद है कि यह दोनों मामलों (&& और if) में काफी समान होगा।

बल्कि कम किया जा रहा है लिखने के लिए (विशेष रूप से, यदि ऐसा है तो मेरे जैसे, आप कभी नहीं{}if बंद बयान छोड़) के अर्थ में यह एक "अनुकूलन" तेजी से चल के अर्थ में नहीं है, लेकिन। थोड़ा भाषा के लिए नए लोगों के लिए कम स्पष्ट है, लेकिन यह एक मुहावरे जल्दी से सीखा है।

+0

'typeof fn === "फ़ंक्शन"' करना सुरक्षित नहीं होगा? – Antony

+0

@ एंटनी: हाँ, यह होगा। आप इस मुहावरे को उन स्थानों पर देखते हैं जहां कोड किसी फ़ंक्शन या कुछ भी नहीं (उदाहरण के लिए, एक वैकल्पिक फ़ंक्शन तर्क) की अपेक्षा कर रहा है, और यदि आप इसे कुछ देते हैं तो यह विफल हो जाता है, लेकिन जो चीज़ आप इसे देते हैं, वह ' एक समारोह में, इस सिद्धांत पर कि फ़ंक्शन के लिए प्रलेखन (उदाहरण के लिए) कहता है कि आप कोई फ़ंक्शन या कुछ भी प्रदान नहीं कर सकते हैं, लेकिन फ़ंक्शन या (कहें) स्ट्रिंग नहीं। :-) इसके अलावा, कुछ इंजनों पर कुछ होस्ट-प्रदान किए गए फ़ंक्शंस में 'टाइपोफ़' 'ऑब्जेक्ट' '(दुख की बात है) लेकिन अभी भी कॉल करने योग्य हैं। –

2

तो, if (fn) fn() द्वारा, आप सुनिश्चित करना चाहते हैं कि fn इसे निष्पादित करने से पहले मौजूद है। if स्थिति एक बूलियन मान या अभिव्यक्ति की जांच करता है, जावास्क्रिप्ट में किसी भी गलत मूल्य false मान if बूलियन जांच स्थिति में बदल सकता है। Falsy मूल्यों हो सकता है:

  • झूठी
  • अशक्त
  • अपरिभाषित
  • रिक्त स्ट्रिंग ''
  • संख्या 0
  • संख्या NaN (हां, 'एक नंबर' एक है संख्या, यह एक विशेष संख्या है)

कोई अन्य मूल्य एक वास्तविक मूल्य होगा ई।

तो, अगर fn या तो एक null या undefined मूल्य है, if जाँच आप एक गैर समारोह वस्तु को क्रियान्वित करने से रक्षा करेगा।

fn && fn() करके, आप एक ही कर रहे हैं: जावास्क्रिप्ट में, बूलियन अभिव्यक्ति है जिसका मतलब है कि अगर पहले भाग में एक && आपरेशन में, falsy तो दूसरे भाग निष्पादित नहीं किया होता है आलसी जाँच की है। इसलिए, इस सुविधा के साथ, आप अपने कोड को गैर-फ़ंक्शन ऑब्जेक्ट निष्पादित करने से सुरक्षित कर सकते हैं।

fn && fn() प्रदर्शन के मामले में एक दूसरे के एक अनुकूलित संस्करण नहीं है, लेकिन लिखित में एक लघु संस्करण है। समारोह fn या तो परिभाषित नहीं किया जा सकता है या एक वास्तविक समारोह वस्तु:

दोनों कोड के टुकड़े एक पूर्व शर्त की आवश्यकता है।

if (fn instanceof Function) fn()

0

ऑप्टिमाइज़ेशन के मामले में, आईएमएचओ, मैं यह कहूंगा क्योंकि यदि ब्रेसिज़ बलिदान और पठनीयता समझौता करने के बिना इसे एक लाइन बनाने का बेहतर तरीका है, लेकिन यह कोड को किसी भी तेज

निष्पादित नहीं करेगा
संबंधित मुद्दे