Podwójna negacja

0

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ę.

5

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.

1

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++.

4
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)

2

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.

0
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1