क्या करता है "|" (सिंगल पाइप) जावास्क्रिप्ट में करते हैं?


148
console.log(0.5 | 0); // 0
console.log(-1 | 0);  // -1
console.log(1 | 0);   // 1

0.5 | 0शून्य क्यों लौटता है, लेकिन कोई भी पूर्णांक (ऋणात्मक सहित) इनपुट पूर्णांक लौटाता है? एकल पाइप ("|") क्या करता है?


12
यह आपके द्वारा टाइप किए गए तथ्य के लिए सिंटैक्स त्रुटियों को मदद करने से रोकता है के बजाय ||
एंड्रयू मायर्स

जवाबों:


157

यह एक है बिटवाइज़ या
चूंकि बिटवाइज़ ऑपरेशन्स केवल पूर्णांकों पर ही अर्थ रखते हैं, इसलिए 0.5इसे छोटा कर दिया जाता है।

0 | xहै xकिसी के लिए, x


9
फ़्लोटिंग-पॉइंट नंबर को इंट में बदलने या उपयोग करने का एक अच्छा तरीका हैparseInt()
MaBi

5
@MaBi: हालांकि आपको पता होना चाहिए कि मान 32-बिट पूर्णांक में परिवर्तित हो जाता है, इसलिए यह बड़ी संख्या के लिए ठीक से काम नहीं करेगा।
गुफ़ा

1
तो क्या फ्लोर फंक्शन के समान माना जा सकता है?
May13ank

2
इसका उपयोग केवल बिटवाइस या के लिए करें। जैसा कि @ गुफ़ा ने कहा, बड़ी संख्या में अपेक्षा के अनुरूप व्यवहार नहीं होगा। Ex: 248004937500 | 0 = -1103165668
जोसेफ कोनोली

बड़ी संख्या में अतिप्रवाह होगा क्योंकि वे 32-बिट इंट में परिवर्तित हो गए हैं।
'16

151

बिट तुलना इतनी सरल है कि यह लगभग समझ से बाहर है;) इस "nybble" को देखें

   8 4 2 1
   -------
   0 1 1 0 = 6  (4 + 2)
   1 0 1 0 = 10 (8 + 2)
   =======
   1 1 1 0 = 14 (8 + 4 + 2)

बिटवाइज़ ओरिंग 6 और 10 आपको 14:

   alert(6 | 10); // should show 14

बहुत भ्रामक!


16
बूलियन के लिए भी काम करता है। जेएस 1 के रूप में सच की व्याख्या करता है, 0 के रूप में गलत है; तोalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
गॉर्डन

21

एक एकल पाइप थोड़ा बुद्धिमान है या

बिट्स के प्रत्येक जोड़े पर OR ऑपरेशन करता है। एक या बी 1 उपज या तो एक या बी 1 है।

जावास्क्रिप्ट किसी भी गैर-पूर्णांक संख्या को बिटवाइज़ संचालन में काटता है, इसलिए इसकी गणना 0|00 के रूप में की जाती है।


6
इस सवाल का जवाब नहीं है। ("यह 0 क्यों लौटाता है")
किर्क वूल

8

यह उदाहरण आपकी मदद करेगा।

 
    var testPipe = function(input) { 
       console.log('input => ' + input);
       console.log('single pipe | => ' + (input | 'fallback'));
       console.log('double pipe || => ' + (input || 'fallback'));
       console.log('-------------------------');
    };

    testPipe();
    testPipe('something'); 
    testPipe(50);
    testPipe(0);
    testPipe(-1);
    testPipe(true);
    testPipe(false);

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