2012-05-31 20 views
14

Powiel możliwe:
What is the “double tilde” (~~) operator in JavaScript?~~ vs parseInt?

Tutorial D3 daje funkcję, która generuje losową sekwencję:

var t = 1297110663, // start time (seconds since epoch) 
    v = 70, // start value (subscribers) 
    data = d3.range(33).map(next); // starting dataset 

function next() { 
    return { 
    time: ++t, 
    value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5))) 
    }; 
} 

Zanotować ~~ (Tilda Tilda) w:

value: v = ~~Math.max(10, Math.min(90, v + 10 * (Math.random() - .5))) 

Od zabawy w terminalu JavaScript, widzę:

~~1 
1 
~~-1 
-1 
~~-1.3 
-1 
parseInt(5) 
5 
parseInt(-5) 
-5 
parseInt(-5.3) 
-5 
parseInt(5.3) 
5 

Od ~~ i parseInt wydają się być równoważne, co jest uzasadnienie dla korzystania parseInt?

+1

[Bitowy nie] (https://developer.mozilla.org/en/JavaScript/Reference/operators/bitwise_operators#.7E_ (Bitwise_NOT)) –

+0

TIL o tyldowym operatorze NOT bitowym w JavaScript. Dzięki. –

Odpowiedz

27

Nie są one równoważne.

  • parseInt() obraca łańcuchów w ilościach, do odczytu i pomijając pierwszy niecałkowitą charakter, a także ewentualnie przeprowadzania konwersji zasady (np interpretacji ciąg jako ósemkowy albo szesnastkowym).

    parseInt('011');   // 9 
    parseInt('42 cats');  // 42 
    parseInt('0xcafebabe'); // 3405691582 
    parseInt('deadbeef',16); // 3735928559 
    parseInt('deadbeef',36); // 1049836114599 
    
  • var x = ~~y; jest „sztuczki” — podobny do var x = y << 0; — że (ab) wykorzystuje unary bitwise NOT operator wymusić wynik się w zakresie o 32-bitowej liczby całkowitej, odrzucając jakikolwiek fragment niecałkowitą.

    ~~'011';  // 11   
    ~~'42 cats'; // 0 
    ~~'0xcafebabe'; // -889275714 
    ~~'deadbeef'; // 0 
    

Korzystanie ~~x odbywa się często, ponieważ:

  1. To zwykle szybciej niż wywołanie metody.
  2. Jest szybszy do wpisywania niż cokolwiek innego.
  3. To sprawia, że ​​zaawansowani użytkownicy czują się cool, ponieważ jest to coś nieprzeniknionego, a także pewnego rodzaju usprawiedliwienie. :)

Jak widać w teście cafebabe, wartości powyżej 2 -1 (2,147,483,647) lub poniżej -2 (-2147483648) będzie "wrap around" ze względu na ograniczenia podpisanego 32-bitowa liczba całkowita.

+3

Możesz wyjaśnić, czym dokładnie jest "~". Jak w bitowym nie. – Endophage

+0

@Endophage Dzięki za sugestię. – Phrogz

+0

@juwiley Jeśli (i tylko jeśli!) Uważasz, że to odpowiedział na twoje pytanie, rozważ [przyjęcie tej odpowiedzi] (http://meta.stackexchange.com/a/5235/153741). – Phrogz

2
~~"red" === 0 

isNaN(parseInt("red")) 

parseInt może obsłużyć ponad 32 bitowych liczb oraz

7

parseInt nie ogranicza się do podpisanych 32 bitowych liczb.

// Top range for a bitwise operator provides a valid result 
~~((Math.pow(2,32)/2)-1); // 2147483647 

    // Beyond the top range provides undesired result 
~~(Math.pow(2,32)/2); // -2147483648 

Również z parseInt można określić podstawkę.

+0

Co pokazują te dwie linie? – gdoron

+0

@gdoron Pokazują, że bitowe nie zaciski do wartości 32-bitowych, toczą się do obszaru z podpisanym uzupełnieniem, gdy uderzysz 2^32 – Phrogz

1

Prosta: Jest to bardziej czytelny i wygodniejszy wariant.

Bitowy operator NOT przeznaczony jest do innego użytku, ale może być niewłaściwie wykorzystywany do skracania wartości zmiennoprzecinkowych. W twoim przykładzie też było możliwe Math.floor.

Ponadto, w wielu przypadkach nie zachowują się podobnie. parseInt nie jest ograniczony do 32 bitów, może analizować liczby reprezentowane w różnych pozycjach notacji, a także obsługuje wartości nieliczbowe za pomocą NaN.

Powiązane problemy