“ |” คืออะไร (ไปป์เดียว) ทำใน JavaScript?


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

ทำไม0.5 | 0ส่งกลับค่าศูนย์ แต่จำนวนเต็มใด ๆ (รวมถึงค่าลบ) จะคืนค่าจำนวนเต็มเข้า ไปป์เดี่ยว ("|") ทำอะไร?


12
มันช่วยป้องกันข้อผิดพลาดทางไวยากรณ์จากการแจ้งเตือนคุณถึงข้อเท็จจริงที่คุณพิมพ์ | แทน | |
Andrew Myers

คำตอบ:


157

นี้เป็นค่าที่เหมาะสมหรือ
เนื่องจากการใช้งานระดับบิตบิตจะทำให้เข้าใจได้เฉพาะจำนวนเต็มเท่านั้น0.5จึงถูกตัดทอน

0 | xคือสำหรับการใด ๆxx


9
นี่เป็นวิธีที่ดีในการแปลงเลขทศนิยมเป็น int หรือใช้parseInt()
MaBi

5
@MaBi: อย่างไรก็ตามคุณควรรู้ว่าค่านั้นถูกแปลงเป็นจำนวนเต็ม 32 บิตดังนั้นจึงไม่สามารถทำงานได้อย่างถูกต้องสำหรับจำนวนที่มากขึ้น
Guffa

1
ดังนั้นจึงถือได้ว่าเป็นฟังก์ชั่นชั้น?
May13ank

2
ใช้สิ่งนี้สำหรับบิตหรือ ในฐานะที่เป็น @Guffa กล่าวว่าจำนวนมากจะไม่ทำงานตามที่คาดไว้ เช่น: 248004937500 | 0 = -1103165668
Joseph Connolly

ตัวเลขจำนวนมากจะล้นเนื่องจากมีการแปลงเป็น int แบบ 32 บิต
slikts

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)

Bitwise ORing 6 และ 10 จะให้ 14:

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

สับสนอย่างมาก!


16
ใช้งานได้กับบูลีนเช่นกัน JS ตีความจริงเป็น 1, เท็จเป็น 0; soalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon

21

ท่อเดียวเป็นบิตฉลาดหรือ

ดำเนินการ OR ในแต่ละบิตคู่ a หรือ b ให้ผลตอบแทน 1 ถ้า a หรือ b เป็น 1

JavaScript ตัดทอนหมายเลขที่ไม่ใช่จำนวนเต็มใด ๆ ในการดำเนินการตามบิตดังนั้นจึงคำนวณเป็น0|0ซึ่งเป็น 0


6
สิ่งนี้ไม่ตอบคำถาม ("ทำไมสิ่งนี้ถึงส่งคืน 0")
Kirk Woll

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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.