JavaScript triple supérieur à

88

J'ai vu cette syntaxe sur un autre article de StackOverflow et j'étais curieux de savoir ce qu'elle fait:

var len = this.length >>> 0;

Qu'est-ce que cela >>>implique?

Jey Balachandran
la source
1
C'est un bon opérateur de décalage, mais pourquoi voudriez-vous changer de zéro à droite? Est-ce une façon peu coûteuse de faire parseInt?
Rocket Hazmat
5
>>>met toujours le bit de signe à zéro, même si vous décalez de zéro bit.
John Flatness
4
Vérifiez cette réponse pour savoir pourquoi ils utilisent dans ce cas l' >>>opérateur: stackoverflow.com/questions/3081987/…
Christian C. Salvadó
1
Support
J'ai vu cette syntaxe dans developer.mozilla.org/en/docs/Web/JavaScript/Reference/... var length = list.length >>> 0; (même cas d'utilisation que le vôtre)
Mars Robertson

Réponses:

107

Ignorant sa signification prévue, c'est probablement là que vous le verrez utilisé:


>>> 0 est unique en ce sens que c'est le seul opérateur qui convertira n'importe quel type en entier positif:

"string"         >>> 0 == 0
(function() { }) >>> 0 == 0
[1, 2, 3]        >>> 0 == 0
Math.PI          >>> 0 == 3

Dans votre exemple, var len = this.length >>> 0c'est un moyen d'obtenir une longueur entière à utiliser pour itérer this, quel que soit le type this.length.


De même, ~~xpeut être utilisé pour convertir n'importe quelle variable en un entier signé.

Eric
la source
pouvez-vous expliquer comment itérer en utilisant >>>?
1
@ K48 Je ne pense pas qu'il voulait dire itérer , je pense qu'il voulait dire que cette longueur oblige à devenir un nombre. (Sinon, je suis tout aussi confus.) Mais voici une excellente réponse qui élucide davantage: stackoverflow.com/questions/1822350/…
Mike Williamson
8

Cet opérateur est un décalage logique vers la droite. Ici, le nombre est décalé de 0 bits. Un décalage de zéro bit mathématiquement ne devrait avoir aucun effet.

Mais ici, il est utilisé pour convertir la valeur en un entier 32 bits non signé.

Mark Byers
la source
3

>>>est un opérateur binaire, décalage à droite sans remplissage .

Je pense que le seul effet de >>> 0sur un nombre positif est d'arrondir à l'entier inférieur le plus proche, comme Math.floor(). Je ne vois pas pourquoi cela serait nécessaire dans votre exemple, car généralement une .lengthpropriété (par exemple d'un Array) serait déjà un entier.

J'ai aussi vu la légèrement plus courte ~~utilisée de la même manière: ~~9.5 == 9; // true.

Nrabinowitz
la source
Je doute que ce soit le même que celui Math.abs()utilisé pour les nombres négatifs.
Al Kepp
6
Si vous le faites >>> 0sur un nombre négatif, il le convertit en compliment de 2, puis effectue le décalage à droite. Par conséquent -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat
@AlKepp - ouais, j'ai vu l'erreur et je l'ai corrigée - j'aurais dû tester en premier, mais c'était clairement une question rapide :).
nrabinowitz