क्या एक जावास्क्रिप्ट अगर कई शर्तों के साथ बयान उन सभी का परीक्षण करता है?


100

जावास्क्रिप्ट में, जब परीक्षण करने के लिए कई शर्तों के साथ एक बयान का उपयोग करते समय, जावास्क्रिप्ट उन सभी की परवाह किए बिना परीक्षण करता है, या क्या यह उन सभी का परीक्षण करने से पहले जमानत देगा यदि यह पहले से ही गलत है?

उदाहरण के लिए:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

क्या उन सभी स्थितियों में से 3 के लिए जावास्क्रिप्ट परीक्षण होगा या यह देखने के बाद कि ख 1 के बराबर नहीं है, और इसलिए गलत है, क्या यह कथन से बाहर निकल जाएगा?

मैं एक प्रदर्शन के दृष्टिकोण से पूछता हूं। यदि, उदाहरण के लिए, मैं 3 जटिल jQuery के चयनकर्ताओं का परीक्षण कर रहा हूँ, तो मुझे 3 बार jQuery के पारगमन नहीं करना होगा यदि यह पहले वाले के माध्यम से स्पष्ट है कि यह FALSE को वापस करने जा रहा है। (जिस स्थिति में यह कथन 3 के लिए घोंसला बनाने के लिए अधिक समझ में आता है)।

ADDENDUM: एक जिज्ञासा से अधिक, इसके लिए उचित शब्द क्या है? मैंने देखा कि आप में से कई लोग 'शॉर्ट सर्किट' शब्द का इस्तेमाल करते हैं। इसके अलावा, क्या कुछ भाषाएँ ऐसा करती हैं और अन्य न?


@ जोश: मैं इस विचार की पूरी तरह से सराहना करता हूं कि यह माइक्रो-ऑप्टिमाइज़ेशन है। जिसे जानना अच्छा हो। यदि एक विकल्प दूसरे की तुलना में अधिक अनुकूलित है, तो मैंने कहा कि यह उक्त विधि का उपयोग करने की आदत में जानना और प्राप्त करना अच्छा है। (प्लस, ठीक है, मैं वास्तव में उत्तर के रूप में भी उत्सुक था)
डीए।

21
सख्ती से बोलना, यह समय से पहले का अनुकूलन नहीं है। शॉर्ट-सर्किट लॉजिक वाली भाषाओं में, यह जानना महत्वपूर्ण है कि किन शर्तों के तहत कुछ तरीकों को निष्पादित नहीं किया जाएगा; उदाहरण के लिए, यदि आप उनके दुष्प्रभावों पर भरोसा कर रहे हैं।
रोब

5
यहाँ "शॉर्ट सर्किट मूल्यांकन" के बारे में एक और सवाल है: stackoverflow.com/questions/1232603/…
डेविड

@ दाऊद। धन्यवाद! दिलचस्प पढ़ना।
डीए।

जवाबों:


151

&&ऑपरेटर "शॉर्ट सर्किट" - यह है कि, अगर बाईं हालत गलत है, यह सही एक का मूल्यांकन परेशान नहीं करता है।

इसी तरह, ||ऑपरेटर शॉर्ट-सर्किट अगर बाईं स्थिति सच है।

संपादित करें: हालाँकि, आपको तब तक प्रदर्शन की चिंता नहीं करनी चाहिए जब तक आपने बेंचमार्क नहीं किया और निर्धारित किया कि यह एक समस्या है। समय से पहले सूक्ष्म अनुकूलन स्थिरता का प्रतिबंध है।


1
उत्कृष्ट उत्तर (तकनीकी भाग और प्रबंधन समस्या दोनों)। धन्यवाद!
डीए।

5
यदि आप कभी भी यह चाहते हैं कि यह आपके द्वारा उपयोग की जाने वाली बूलियन प्रतिमा के सभी भागों को निष्पादित कर सके और | for and or or repspectively
Zoidberg

25
यह शर्त हमेशा प्रदर्शन के बारे में जरूरी नहीं है। कभी-कभी आप एक अशक्त जाँच कर रहे हैं और कह सकते हैं कि यदि आपकी अशक्त स्थिति ठीक है और फिर आप अपने दूसरे जाँच के लिए a (b == मान + 1) करने का प्रयास करते हैं, तो यदि स्थिति जाँची गई तो सभी तीन स्थितियों में आपको एक त्रुटि मिलेगी।
21

4
वास्तव में, शॉर्ट-सर्किटिंग प्रदर्शन के बारे में नहीं है। हालाँकि मूल प्रश्न, प्रदर्शन के दृष्टिकोण से पूछ रहा था।
आनन।

1
बहुत अच्छा। इस तरह के माइक्रो ऑप्टिमाइज़ेशन (दूसरों के बीच) करने से स्क्रॉल इवेंट लूप के अंदर एक बड़ा प्रभाव हो सकता है, उदाहरण के लिए कई तत्वों के लंबन गणना या यहां तक ​​कि चिपचिपा बार के लिए कहता है। इसे पूर्व लें: if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)दूसरी शर्त एक अधिक महंगा गणना है, पहला एक बूलियन है। :)
एन्टोनी

13

एक प्रदर्शन के दृष्टिकोण से, यह एक माइक्रो-अनुकूलन नहीं है।

अगर हमारे पास 3 बूलियन वैरिएबल हैं, तो ए, बी, सी एक माइक्रो-ऑप्टिमाइज़ेशन है।

यदि हम बूलियन चर को वापस करने वाले 3 फ़ंक्शन कहते हैं, तो प्रत्येक फ़ंक्शन को एक लंबा समय लग सकता है, और न केवल इस शॉर्ट सर्किट को जानना महत्वपूर्ण है, बल्कि किस क्रम में है। उदाहरण के लिए:

if (takesSeconds() && takesMinutes())

से बहुत बेहतर है

if (takesMinutes() && takesSeconds())

यदि दोनों समान रूप से झूठे होने की संभावना है।


12

इसलिए आप जावास्क्रिप्ट कोड में जैसे कर सकते हैं

var x = x || 2;

जिसका अर्थ होगा कि यदि x अपरिभाषित है या अन्यथा 'गलत' है तो डिफ़ॉल्ट मान 2 है।


3
अगर जेएस शॉर्ट-सर्किट मूल्यांकन का समर्थन नहीं करता तो भी यह काम कर सकता है।
pswg

1
क्या यह टर्नरी के बराबर है?
मार्क कारपेंटर जूनियर

10

यदि किसी की सोच है कि सभी स्थितियों के मूल्यांकन को बाध्य करने का कोई तरीका है , तो कुछ मामलों में बिटवाइज़ ऑपरेटर &और |इसका उपयोग कर सकते हैं

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

ये प्रयोग किया जाना चाहिए वास्तव में ध्यान से क्योंकि बिटवाइज़ ऑपरेटर्स अंकगणितीय ऑपरेटर है कि उनके संकार्य के एकल बिट पर काम करता है और कर रहे हैं नहीं कर सकते हमेशा "गैर शॉर्ट सर्किट" संस्करण के रूप में समारोह &&और||

उदाहरण:

-2147483648 && 1 = 1 

परंतु

-2147483648 & 1 = 0

आशा है कि यह इस तरह की जानकारी (मेरे जैसे) की तलाश करने वाले किसी व्यक्ति की मदद करता है और सुधार और काउंटर उदाहरण के लिए @Max के लिए धन्यवाद


1
यह उत्तर गलत है। और | बिटवाइज़ ऑपरेटर हैं, वे '&& और' के 'नॉन शॉर्ट-सर्किट संस्करण' नहीं हैं। बिटवाइज़ ऑपरेटर अंकगणित ऑपरेटर होते हैं जो अपने ऑपरेंड के एकल बिट्स पर काम करते हैं। उदाहरण: -2147483648 और& 1 = 1 लेकिन -2147483648 और 1 = 0. अधिक जानकारी यहाँ: en.wikipedia.org/wiki/Bitwise_operation
Max

1
@ मैक्स वास्तव में मैं यह नहीं जानता था, मैं इसका उपयोग कर रहा हूं (जिसे अब मैं "ट्रिक" कहता हूं) मैं सी। का अध्ययन कर रहा था। सौभाग्य से ऐसे इनपुट जो मेरे कोड को तोड़ देंगे, कभी नहीं आए। मैंने अपना उत्तर सही कर दिया, मैंने आपका
सम्मान किया

@DJDaveMark क्षमा करें, मुझे आपके false && (alert(""))समाधान का काम नहीं मिला : /
ivcandela

@ivcandela न तो मैं कर सकता था। अगर मैं अपने फोन पर नहीं था तो मैंने इसे 1 परीक्षण किया होगा; ओ) दया आप टिप्पणी संपादित नहीं कर सकते। मैंने अभी इसे हटा दिया है और नीचे एक और जोड़ा है
डीजेडेवार्क

मूल्यांकन को बल देने का सबसे सरल और बेहतर तरीका है कि चर में परिणामों को बचाया जाए, फिर चर के खिलाफ परीक्षण किया जाए:var a=false; var b=check(); alert(a && b);
DJDaveMark

7

यह केवल सभी स्थितियों का परीक्षण करेगा यदि पहले वाले सच्चे हैं, तो अपने लिए इसका परीक्षण करें:

javascript: alert (false && alert("A") && false);

3

यह शॉर्ट सर्किट - केवल एक और बी आपके उदाहरण में तुलना की जाएगी।


3

एक और कारण है कि बाईं ओर 1 या अधिक मापदंडों के साथ मूल्यांकन रोकना।

if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) {...}

दूसरा मूल्यांकन पहले सच होने पर निर्भर करता है और यदि प्रतिक्रिया।

अन्य भाषाओं में शुरुआती दिनों में यह समस्या थी और मुझे लगता है कि यह अब संकलक बनाने में एक मानक दृष्टिकोण है।


2

यह देखने के बाद बाहर निकलता है कि बी एक के बराबर नहीं है।


2

इस प्रश्न पर किसी के लिए भी उलझन है क्योंकि वे शॉर्ट-सर्किट व्यवहार नहीं देख रहे हैं जब ||एक ?ऑपरेटर के साथ संयोजन के रूप में उपयोग करते हैं :

x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected

ऐसा लगता है कि शॉर्ट सर्किट नियम काम नहीं कर रहा है। ||जब पहला सच है तो यह दूसरे (सच? 2: 3) के दूसरे शब्द का मूल्यांकन क्यों कर रहा है ? यह ऑपरेशन की समस्या का एक क्रम बन गया है, क्योंकि उपरोक्त बराबर है

x = (1 || true) ? 2 : 3

||पहले मूल्यांकन के साथ और ?दूसरे का मूल्यांकन किया गया। आप क्या चाहते हैं:

x = 1 || (true ? 2 : 3)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.