JavaScript trzykrotnie większy niż


88

Widziałem tę składnię w innym poście StackOverflow i byłem ciekawy, co robi:

var len = this.length >>> 0;

Co to znaczy >>>?


1
To jest właściwy operator zmiany, ale dlaczego miałbyś zmienić zmianę o zero? Czy to jakiś tani sposób parseInt?
Rocket Hazmat

5
>>>zawsze ustawia bit znaku na zero, nawet jeśli przesuniesz o bity zerowe.
John Flatness,

4
Sprawdź tę odpowiedź, dlaczego używają w tym przypadku >>>operatora: stackoverflow.com/questions/3081987/…
Christian C. Salvadó

1
JavaScript potrójny nawias
ostry

Widziałem tę składnię w developer.mozilla.org/en/docs/Web/JavaScript/Reference/ ... var length = list.length >>> 0; (ten sam przypadek użycia, co twój)
Mars Robertson

Odpowiedzi:



107

Ignorując jego zamierzone znaczenie, najprawdopodobniej zobaczysz, że jest używany:


>>> 0 jest unikalny, ponieważ jest jedynym operatorem, który konwertuje dowolny typ na dodatnią liczbę całkowitą:

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

W twoim przykładzie var len = this.length >>> 0jest to sposób na uzyskanie długości całkowitej, która będzie używana do iteracji this, niezależnie od typu this.length.


Podobnie ~~xmoże służyć do konwersji dowolnej zmiennej na liczbę całkowitą ze znakiem.


czy możesz wyjaśnić, jak iterować używając >>>?

1
@ K48 Nie sądzę, żeby miał na myśli iterację , myślę, że chciał powiedzieć, że ta wymusza długość, aby stać się liczbą. (W przeciwnym razie jestem równie zdezorientowany.) Ale oto świetna odpowiedź, która wyjaśnia więcej: stackoverflow.com/questions/1822350/ ...
Mike Williamson

8

Ten operator jest logicznym przesunięciem w prawo. Tutaj liczba jest przesunięta o 0 bitów. Matematycznie przesunięcie o zero bitów nie powinno mieć żadnego efektu.

Ale tutaj jest używany do konwersji wartości na 32-bitową liczbę całkowitą bez znaku.


3

>>>jest operatorem bitowym, przesunięciem w prawo z wypełnieniem zerowym .

Myślę, że jedynym skutkiem dla >>> 0liczby dodatniej jest zaokrąglenie w dół do najbliższej liczby całkowitej, tak samo jak Math.floor(). Nie rozumiem, dlaczego miałoby to być konieczne w twoim przykładzie, ponieważ generalnie .lengthwłaściwość (np. Array) Byłaby już liczbą całkowitą.

Ja również widziałem nieco krótsza ~~stosowane w taki sam sposób ~~9.5 == 9; // true.


Wątpię, czy jest to to samo, co w Math.abs()przypadku liczb ujemnych.
Al Kepp

6
Jeśli zrobisz >>> 0na liczbie ujemnej, zamieni ją na komplement 2, a następnie dokona prawego przesunięcia. Dlatego -14 >>> 0 == 1073741820. ( msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx )
Rocket Hazmat

@AlKepp - tak, widziałem błąd i naprawiłem go - powinienem był najpierw przetestować, ale było to wyraźnie pytanie do szybkiego narysowania :).
nrabinowitz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.