Que signifie le «|» (single pipe) faire en JavaScript?


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

Pourquoi 0.5 | 0renvoie zéro, mais tout entier (y compris négatif) renvoie l'entier d'entrée? Que fait le tube unique ("|")?


12
Il empêche utilement les erreurs de syntaxe de vous alerter du fait que vous avez tapé | au lieu de ||
Andrew Myers

Réponses:


157

C'est un peu ou .
Étant donné que les opérations au niveau du bit n'ont de sens que sur les entiers, 0.5est tronquée.

0 | xest x, pour tout x.


9
c'est un bon moyen de convertir un nombre à virgule flottante en parseInt()
entier

5
@MaBi: Vous devez cependant savoir que la valeur est convertie en un entier 32 bits, donc cela ne fonctionnera pas correctement pour des nombres plus grands.
Guffa

1
Peut donc être considéré comme identique à la fonction Floor?
May13ank

2
Utilisez ceci uniquement pour les bits ou. Comme l'a dit @Guffa, un grand nombre ne se comportera pas comme prévu. Ex: 248004937500 | 0 = -1103165668
Joseph Connolly

Les grands nombres déborderont car ils sont convertis en int 32 bits.
slikts

151

La comparaison de bits est si simple qu'elle est presque incompréhensible;) Découvrez ce "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 et 10 vous donnera 14:

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

Terriblement déroutant!


16
Fonctionne également pour Boolean. JS interprète vrai comme 1, faux comme 0; soalert(true | false) //yields 1; alert(true | true) //yields 1; alert(false | true) //yields 1; alert(false | false) //yields 0
gordon

21

Un seul tube est un OU bitumineux .

Effectue l'opération OR sur chaque paire de bits. a OR b donne 1 si a ou b vaut 1.

JavaScript tronque tous les nombres non entiers dans les opérations au niveau du bit, donc il est calculé comme 0|0, qui est 0.


6
Cela ne répond pas à la question. ("Pourquoi ce retourne-t-il 0")
Kirk Woll

8

Cet exemple vous aidera.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.