Dzień dobry, przychodzę na te forum być może z dość dziwnym pytaniem, ale ten kto pyta nie błądzi. Podczas nauki js, natknąłem się na takie coś jak podwójna negacja. Czy ktoś mógłby mi wytłumaczyć jakie zastosowanie ma takie coś.
Z góry dziękuję.
Kto pyta nie błądzi, a kto korzysta z Google nie pisze na forum. https://stackoverflow.com/questions/10467475/double-negation-in-javascript-what-is-the-purpose
TL;DR: konwersja dowolnej wartości na boolean.
Dla mnie utożsamianie dowolnych typów wartości z boolean to rzeczywisty "bilion dollar bug" (w dowolnym języku)
To trochę było kuszące, gdy na kolanie się robi 10 linijkowe krótkie fragmenty w interpreterach, już wcale nie pomaga w wielkich projektach
W archaicznym C z lat 1970tych się wydawało, ze to jest optymalizacja kilku rozkazów maszynowych. Niestety na zasadzie masowej kompatybilności wessane do C++.
Tymon PIetrusiński napisał(a):
Dzień dobry, przychodzę na te forum być może z dość dziwnym pytaniem, ale ten kto pyta nie błądzi. Podczas nauki js, natknąłem się na takie coś jak podwójna negacja. Czy ktoś mógłby mi wytłumaczyć jakie zastosowanie ma takie coś.
Z góry dziękuję.
Na to pytanie dostałeś już odpowiedź, ale uprzedzając kolejne pytania, to w JS robi się też inne podobne sztuczki:
~~a
- podwójna negacja bitowa. Czyli najpierw negujemy, później negujemy negację.
Efektem jest po pierwsze konwersja zmiennej na liczbę, która dzieje się przy okazji, po drugie obcięcie części ułamkowej (EDIT: w zasadzie obie rzeczy wynikają z tego samego Like other bitwise operators, it converts the operand to a 32-bit signed integer
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT )
~~true; // 1
~~('a'); // 0
~~('4.109'); // 4
~~(3.7); // 3
~~(-3.7); // -3
również a | 0
- czyli zrobienie arytmetycznej operacji or
ale przyrównując do zera, czyli w zasadzie tyle, co znowu, efektywnie konwersja do liczby (ale bez części ułamkowej).
true | 0; // 1
'a' | 0; // 0
'4.109' | 0; // 4
3.7 | 0; // 3
-3.7 | 0; // -3
również znak plusa przed wartością zamienia ją na liczbę:
+true; // 1
+false; // 0
+"-1.2"; // -1.2
No i nie używając tricków, to w JS są również funkcje Math.trunc
, Math.floor
, Math.ceil
, Math.round
, których też można użyć do rozmaitego zaokrąglania (Math.trunc najbardziej podobne będzie do sztuczek z ~~a
czy a | 0
, bo też obcina część ułamkową)
Jest również kilka innych sposobów na konwersję czegoś do liczby (np. Number("1.23")
czy parseInt, parseFloat. Również zamiast !!a
można napisać Boolean(a)
Ale wiesz, ze to po czesci po prostu poprawne wyprowadzenie gramatyki i tyle?
Mozna tez napisac !!!x
albo !!!!!!!!!!!!!!!!!!!!!!!!!!x
. Czy znaczy, ze !!!!!!!!!!!!
ma jakies zastosowanie? No nie. Po prostu mozna tak napisac i bedzie to poprawny kod. Mozna tez pisac 3+0+0+0+0+0+0+0+0+0
. I nic to nie daje.
Co innego podwojna negacja na gruncie logiki. Np. !(p AND !q)
to inaczej !p OR !!q
czyli !p OR q
. Ale ta podwojna negacja wyszla z przeksztalcenia formuly i byla pozniej do "pominiecia".
TL;DR: konwersja dowolnej wartości na boolean
To brzmi jak hak i nic wiecej. Glupi zreszta.
stivens napisał(a):
To brzmi jak hak i nic wiecej. Glupi zreszta.
Głupi, nie głupi - ale stosowany. Więc warto wiedzieć, co on robi.