Magia operatorów w JavaScript

Operatory w JavaScript często są niedoceniane, a okazuje się, że można zrobić z nimi całkiem dużo pożytecznych rzeczy.

Magia plusa!

Zapewne niemało z Was zastanawiało się kiedykolwiek, jak uzyskać datę w formacie UNIX. new Date() nijak nie ułatwia tego zadania. Z pomocą przychodzi „magiczny” plus:

alert(+new Date());

W ten sposób otrzymamy aktualną datę, np. 1236104305899.

Operator dodawania jest użyteczy nie tylko w powyższym przykładzie. Dwa znaki plusa obok siebie, w połączeniu ze stringiem, dają obiekt typu number:

alert(typeof "2"); // daje "string"
alert(typeof + + "2"); // daje "number"

Wykorzystać można to przy dodawaniu rzecz jasna:

var suma = 10 + + "10"

Warto podkreślić, że pomiędzy plusami jest znak spacji – inaczej wyjdzie nam inkrementacja.

Znak plusa potrafi również zmieniać typy logiczne na liczby:

alert(+true); // daje 1 
alert(+false); // daje 0

Wykrzyknik Twoim domem

Można też uzyskać odwrotny efekt. Podwójny wykrzyknik najpierw konwertuje liczbę na typ logiczny:

alert(!!1); // daje true

Dla kontrastu zobaczmy, co dzieje się z !1:

alert(!1); // daje false

Siła tyldy

Postawiona tylda (operator bitowy!) przed liczbą n daje -(n+1). Na przykład:

alert(~1); // daje -2
alert(~2); // daje -3
alert(~-1); // daje 0

Szczególnie pomocne jest to przy okazji funkcji, które zwracają -1. Zamiast pisać:

if (returned === -1)

można użyć:

if (!~returned) // jeśli prawda, że zostało zwrócone -1 to...

Z kolei dwie tyldy ułatwiają zaokrąglanie liczb. Jest to najszybsza metoda – i składniowo, i jeśli chodzi o rzeczywisty czas wykonywania:

alert(~~2.5553434); // daje 2

To nie wszystko, co mozna zrobić z operatorami i maksymalnie spakowanym JSem (vide stara szkoła JS na pl.comp.lang.javascript). Wkrótce, o ile starczy mi czasu, postaram się opowiedzieć o innych sztuczkach.

Komentarze

1

Genialne! Często mam problemy z tymi zamianami typów… Dzięki!

2

Naprawdę ciekawe, ale strasznie nieczytelny kod powstaje.

c34
3

Fajna sprawa, taki hmm cukier trochę, ale trzeba naprawdę przyzwyczaić się do używania tego.
No i inni mają problem z rozszyfrowaniem tej składni.
Niemniej jednak – warto znać :)

4

Doprawdy ciekawe, ale przy zmianie typu wolałbym zwykłe rzutowanie, jeśli tylko takie istnieje w JS. Zaokrąglanie i dodatkowe funkcje mało intuicyjne, ale można się tego nauczyć.

5

Rozumiem, że i pod IE wszystko ładnie działa? ;)

6

Gratuluję tak błyskawicznie napisanego, świetnego tekstu :) i powrotu do aktywnej części społeczności blogosfery.

7

cudownie chory język…

8

Tak, dziala w IE. To w koncu operatory, a wiec podstawowy element jezyka. Az nie wyobrazam sobie, gdyby to nie dzialalo w IE ;-)

9

Dzięki wielkie za tego posta, przydatne informacje!

Michał Fikus
10

Dlaczego używasz „+ +” zamiast pojedynczego plusa? Równie dobrze można używać „+ + + + +” i efekt będzie ten sam.

blue
11

Pojedynczy plus doklei stringa do integera.

12

Przepraszam, nie uściśliłem – miałem na myśli fragment z typeof.

blue
13

Podciagnalem to pod teze, wybacz ;-)

14

Mala poprawka: podwojny wykrzyknik tylko konwertuje liczbe na typ logiczny, bez zaprzeczania go.

mrz
15

pstryk. Drugi odnośnik w pracy mgr inż do Twojego bloga :) [pierwszy to falsy values].

Dzięki wielkie za bardzo unikalne treści! :)

16

drobna(?) uwaga dla większych liczb:

int32 = Math.pow(2,32)/2-1 //2147483647
~int32 // -2147483648
~(int32+1) // 2147483647 ???

Dodaj komentarz

Dozwolone tagi: <blockquote>, <code>, <strong>