जावास्क्रिप्ट में & && के बीच क्या अंतर है?


82

जावास्क्रिप्ट में & && के बीच क्या अंतर है?

उदाहरण-कोड:

var first  = 123;
var second = false;
var third  = 456;
var fourth = "abc";
var fifth  = true;
alert(first & second); // 0
alert(first & third);  // 72
alert(first & fourth); // 0
alert(first & fifth);  // 1

alert(first && second); // false
alert(first && third);  // 456
alert(first && fourth); // abc
alert(first && fifth);  // true

ऐसा लगता है कि && एक तार्किक है "और" जो मुझे हमेशा दूसरा मूल्य देता है यदि दोनों सत्य हैं।

लेकिन क्या है &?

(वैसे, && पायथन में "और" प्रतीत होता है; और लगता है और पायथन में है)


यदि आप सोच रहे हैं कि हम तार्किक परिचालकों के बजाय बिटवाइज़ ऑपरेशंस का उपयोग क्यों नहीं करते हैं, तो 4 और 1 = 0. पर विचार करें, लंबाई 4 और 1 के दो सरणियों का उपयोग करना; बिटवाइज़: fruits.length & veggies.length === 0और बूलियन fruits.length && veggies.length === true:।
टॉम एंडरसन

जवाबों:


149

& बिटवाइस है

यह ऑपरेटर दो संख्याओं की अपेक्षा करता है और एक संख्या को फिर से बताता है मामले में वे संख्या नहीं हैं, वे संख्या के लिए डाली जाती हैं।

यह कैसे काम करता है? विकिपीडिया का उत्तर है: https://en.wikipedia.org/wiki/Bitwise_operation#AND

नोट: जावास्क्रिप्ट में, इस ऑपरेटर के उपयोग को हतोत्साहित किया जाता है, क्योंकि कोई पूर्णांक डेटा प्रकार नहीं है, बस फ्लोटिंग पॉइंट है। इस प्रकार फ़्लोट्स को प्रत्येक ऑपरेशन से पहले पूर्णांक में बदल दिया जाता है, जिससे यह धीमा हो जाता है। इसके अलावा, इसका विशिष्ट वेब अनुप्रयोगों में कोई वास्तविक उपयोग नहीं है और अपठनीय कोड का उत्पादन करता है।

सामान्य नियम: बचें। इसका उपयोग न करें। यह शायद ही कभी एक रख-रखाव और पठनीय जेएस कोड में होता है।

&& तार्किक है और

यह दो तर्क और रिटर्न की उम्मीद करता है:

  • पहला शब्द जो असत्य का मूल्यांकन करता है
  • अंतिम अवधि अन्यथा (यदि सभी सत्य-वाई हैं)

यहाँ कुछ उदाहरण हैं:

0 && false          0 (both are false-y, but 0 is the first)
true && false       false (second one is false-y)
true && true        true (both are true-y)
true && 20          20 (both are true-y)

यदि आप केवल कभी बूलियन पर इसका उपयोग करते हैं, तो यह गणितीय तर्क से बिल्कुल AND ऑपरेटर है।

&& परिचालक का पीछा

इस ऑपरेटर को ऊपर के रूप में परिभाषित किया गया है जिसका कारण ऑपरेटर चेनिंग है। आप इस ऑपरेटर को चेन करने में सक्षम हैं और फिर भी उपरोक्त नियमों को बनाए रखें।

true && 20 && 0 && 100          0 (it is the first false-y)
10 && 20 && true && 100         100 (last one, since all are true-y)

&& लघु सर्किटिंग

जैसा कि परिभाषा से देखा जा सकता है, जैसे ही आप पाते हैं कि एक शब्द झूठा-वाई है, आपको निम्नलिखित शर्तों की परवाह करने की आवश्यकता नहीं है। जावास्क्रिप्ट भी इसे एक पायदान आगे ले जाता है, शर्तों का मूल्यांकन भी नहीं किया जाता है। इसे शॉर्ट सर्किटिंग कहा जाता है।

true && false && alert("I am quiet!")

यह कथन कुछ भी सचेत नहीं करता है और falseवापस आ जाता है। इसलिए, यदि आप &&ऑपरेटर को एक कम विवरण के लिए एक छोटे प्रतिस्थापन के रूप में उपयोग कर सकते हैं । ये बराबर हैं:

if (user.isLoggedIn()) alert("Hello!")
user.isLoggedIn() && alert("Hello!")

लगभग सभी JS कम्प्रेसर 2 बाइट को बचाने के लिए इस ट्रिक का उपयोग करते हैं।


5
&& जावास्क्रिप्ट में बूलियन वापस नहीं करता है।
सांग्युन ली

1
AFAIK, &&पहला मान लौटाता है, अगर यह गलत-y है, और दूसरा मूल्य अन्यथा।
duri

1
उत्तर पूरी तरह से संशोधित।
रोक क्रालज

यदि यह पहला मूल्य देता है, तो मुझे समझ में नहीं आता कि मैं इसे कैसे चला सकता हूं: यदि ($ ('# form1')। pleyley ()। मान्य करें (= = true && $ ('# form2')। parsley () .validate () == true) {// कुछ करें यदि दोनों फॉर्म मान्य हैं} क्योंकि यह पहले फ़ंक्शन में बाहर निकलेगा यदि यह गलत है और कभी भी दूसरे फॉर्म को मान्य नहीं करेगा, तो फिर उस IF स्टेटमेंट को चलाने के लिए कैसे?
user991

1
@ user777 अप्रासंगिक नहीं है कि क्या दूसरा रूप मान्य है या नहीं यदि आपका ऑपरेशन केवल वैध होने पर ही होना चाहिए? यदि पहला फ़ॉर्म विफल हो जाता है तो पूरा ऑपरेशन अमान्य है। क्योंकि इस सूत्र के बारे में हालांकि यह वास्तव में एक पूरी तरह से अलग सवाल यह है कि लौटने , नहीं में उपयोग करते हुए बयान करता है, तो
रायन विलियम्स

24

&बिटवाइज़ है "और"। इसका मतलब यह है कि यदि आपके पास द्विआधारी में परिवर्तित दो संख्याएं हैं, तो परिणाम एक संख्या है जो 1उन पदों पर अंक है जहां दोनों संख्याएं हैं 1

  100011  //35
& 111001  //57
---------
  100001  //35 & 57 == 33

-3

यह निर्धारित करने के लिए कि दो बूलियन मूल्य एक साथ रखे गए हैं या सही हैं, यदि आप उन दोनों (वेब ​​पेज पर सत्यापन) की जांच करना चाहते हैं, तो आप &ऑपरेटर का उपयोग कर सकते हैं । &बिटवाइस है।

उसके साथ &&ऑपरेटर के , एक बार जब यह पता चलता है कि पहला मूल्य गलत है, तो यह मूल्यांकन को समाप्त कर देगा और दूसरे मूल्य की जांच नहीं करेगा।


1
जब आप &बूलियन मानों के साथ काम करते हैं तो आप बिटवाइंड और ( ) का उपयोग नहीं करते हैं। इस ऑपरेटर के उचित उपयोग पर अन्य उत्तरों का संदर्भ लें।
FtDRbwLXw6

@drrcknlsn, मैंने अन्य उत्तर पढ़े लेकिन यहाँ स्पष्टीकरण बहुत अच्छी तरह से काम करता है, क्या आप अपने दावे के बारे में अधिक जानकारी प्रदान कर सकते हैं ??
अजराफती

1
@ टिप्पणी: इस उत्तर में व्याख्या गलत है। आप तार्किक (बूलियन) तुलना के लिए बिटवाइज़ ऑपरेटरों का उपयोग नहीं करते हैं। आप तार्किक (बूलियन) ऑपरेटरों का उपयोग करते हैं। वे अलग-अलग (हालांकि समान) चीजें करते हैं, अलग-अलग इनपुट की उम्मीद करते हैं, विभिन्न आउटपुट का उत्पादन करते हैं, और अलग-अलग ऑपरेटर पूर्वता रखते हैं।
FtDRbwLXw6

1
मैं मानूंगा कि यह बुरा व्यवहार है लेकिन बूलियन मूल्यों का उपयोग करना और काम करना होगा। झूठी 0 का मूल्यांकन करता है और 1 का सही मूल्यांकन करता है। मुझे ऐसा कुछ भी नहीं दिखता है जो इस उत्तर के साथ तकनीकी रूप से गलत है जैसा कि आप "उपयोग" कर सकते हैं, यह सिर्फ अनुशंसित नहीं है।
5

-3

पूरे जोर से, विस्तृत अंतर्दृष्टि के साथ, वे ज्यादातर इस सच्चाई से चूक गए हैं कि एक सशर्त मूल्यांकन है जहां केवल एकल और काम करेंगे। व्यावहारिक आम आदमी का जवाब जिसने मेरे सिर की धड़कन को आईएफटी स्टेटमेंट स्ट्रिंग ऑफ़ मल्‍टीपल पर जंजीर से सुलझाया और & ##########। मैं जेक वेन (और रस) को उनके गलत तरीके से नकारे गए उत्तर के लिए धन्यवाद देता हूं, जिसे यह अधिकार मिल गया कि जहां अधिक से अधिक & amp; && के साथ यह लगता है कि इसका काम पहले मूल्यांकन शो के बाद किया जाता है! == [उदा। असत्य]। मेरा फेलिंग कोड था

IF ((sessionStorage.myLable !== "LableStringA") && (sessionStorage.myLable !== "LableStringB") && (sessionStorage.myLableZ !== "LableStringA") && (sessionStorage.myLableZ !== "LableStringB")) { ...)

यहां, && & एकल के लिए ठीक से प्रतिस्थापन और उपयोग करना यह वास्तविक दुनिया में व्यावहारिक रूप से और तकनीकी रूप से सही उत्तर दोनों था। कोड की अंतर्दृष्टि और समझ के लिए आपको फिर से जेक वेन (और रस) धन्यवाद।


1
यदि आप इसे नहीं समझते हैं, तो मैं 'कुछ काम करता हूं' का उपयोग करने की अनुशंसा नहीं करता। आप बस अपने आप को परेशानी के लिए बाद में स्थापित कर रहे हैं जब यह काम नहीं करता है और आप इसे डीबग नहीं कर सकते हैं। या इससे भी बदतर आप एक नौकरी के साक्षात्कार में इसका इस्तेमाल करने की कोशिश करते हैं और वे आपको ಠ_ಠ की तरह देखते हैं। यदि आपकी स्थिति का मूल्यांकन नहीं किया जाता है कि आप कैसे उम्मीद करते हैं, तो आपके पास एक तर्क त्रुटि है। पहली बार झूठे होने पर सभी 4 शर्तों का मूल्यांकन करने का कोई कारण नहीं है क्योंकि संयुक्त सशर्त कभी भी उस स्थिति में सही मूल्यांकन नहीं कर सकता है
ब्रैंडन

धन्यवाद ब्रैंडन। मैं आपकी समग्र चिंताओं पर सवाल नहीं उठाता। मैं हमेशा === कन्वेंशन के लिए स्थगित और संस्थान करता हूं। हालांकि, सभी चार मूल्यांकन आपके अंतिम अच्छी तरह से टिप्पणी के विपरीत आवश्यक थे। सभी चार मूल्यांकन होने की जरूरत है! == और कोष्ठक के भीतर उस प्रारूप में उपयोग किया गया था। यह संक्षिप्त और& था जो उच्च तर्क के रूप में अपेक्षित नहीं होगा। सभी प्रमुख OS के परीक्षण पर संकलक द्वारा एकल और सही तरीके से पढ़ा गया था।
ग्लैडहार्ट

जैसा कि ऐसा लगता है कि यह क्यों और लगन से काम करता है के रूप में अनुवर्ती है, यह रुस और जेक के स्पष्ट रूप से असंबद्ध उत्तर की स्पष्टता में होगा। सभी चार मूल्यांकन का मूल्यांकन करने की आवश्यकता है। पहला मूल्यांकन गलत होने पर && स्टॉप / एबॉर्ट्स का उपयोग करना। एकल का उपयोग करना और शेष तीन स्थितियों का अनिवार्य रूप से मूल्यांकन करना जारी रखता है। जैसा कि रस और जेक ने कहा, "" और& "ऑपरेटर के साथ, एक बार जब यह पहला मूल्य गलत लगता है, तो यह मूल्यांकन को समाप्त कर देगा और दूसरे मूल्य की जांच नहीं करेगा।" जबकि, "यदि आप उन्हें [सभी] (वेब ​​पेज पर सत्यापन की तरह) जांचना चाहते हैं, तो आप" & "ऑपरेटर" का उपयोग कर सकते हैं। "&" बिटवाइज़ है "
ग्लैडहार्ट

1
यदि आपको उन सभी की जांच करने की आवश्यकता है, तो आप अपने तर्क को भी ढाँचा बना सकते हैं, if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}जो कि आपके द्वारा बताए गए अनुसार अधिक स्पष्ट प्रतीत होता है (मैं मान रहा हूं कि आप सुनिश्चित करना चाहेंगे कि myLable के मान दो मानों में से एक हैं, या सत्यापन विफल रहें) । जब तक आपकी शर्तों के साइड इफेक्ट्स नहीं होते हैं, तब तक कोई कारण नहीं है कि आपको उन सभी का मूल्यांकन करने की आवश्यकता है। ऑपरेटर इरादा के अनुसार काम कर रहा है, लेकिन आपका तर्क फ़्लिप हो गया
ब्रैंडन

ब्रैंडन को फॉलो करने के लिए Ty। सम्मान के साथ, यह अभी भी मेरे मामले में शर्तों की आवश्यकता को याद करता है जहां === की तलाश में चार सत्यापनों में से प्रत्येक पर दर्जनों संभावनाओं में से एक हो सकता है। बस, यह है कि अगर चार में से कोई भी एक विशिष्ट पृष्ठ मार्कर मूल्य नहीं रखता है, तो मैं इसकी कमी की भरपाई के लिए एक स्क्रिप्ट चलाने के लिए वापस आता हूं। सभी चार सभी के रूप में दिखाना चाहिए == !. ऐसा नहीं है कि "यह मानते हुए कि आप सुनिश्चित करना चाहते हैं कि myLable के मूल्य दो मूल्यों में से एक हैं", यह वास्तव में है कि myLable संभावनाओं में से कई में से एक है। इसलिए गैर-तुल्यता एक प्रश्न है जो 4x की आवश्यकता है।
GladHeart
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.