Poznając nowość w JS, jaką jest Array.with, nabierzemy w tym epizodzie pewnej zdrowej dawki krytycyzmu wobec nowości wprowadzanych do języka, które nie zawsze muszą być naszym zdaniem uzasadnione, potrzebne ani użyteczne niczym funkcja Object.groupBy.
Ponadto dowiemy się, że najlepszym źródłem informacji o funkcjach, zwłaszcza tych nowych, jest oficjalna dokumentacja danego języka, bądź w przypadku JavaScript – dokumentacja MDN, zaś wszystko, czego nie znamy powinniśmy najpierw przetestować.
Może się bowiem okazać, że ktoś – nawet w innym tutorialu, zamieszczonym na YouTube – przedstawi nam bajeczny opis nowej funkcji, robiącej starą rzecz w nowy sposób, z dodatkowym, lepszym działaniem. Problem w tym, że ta funkcja robi starą rzecz w stary sposób, a my, biorąc jakąś informację na słowo i jej nie sprawdzając, znajdujemy się w błędzie.
Jeżeli nikogo tym przydługim disclaimerem nie odstraszyłem, to zapraszam do czytania artykułu, który pisałem, gdy jeszcze sam poniekąd wierzyłem w to, co ktoś mi o Array.with naopowiadał, ale zaczynałem mieć pewne wątpliwości.
Array.with – dosyć nowa funkcja, która pozwala nam zmienić wartość w tablicy pod podanym indeksem.
UPDATE Z PRZYSZŁOŚCI: Myliłem się, bez sensu funkcja, jeżeli chcesz zobaczyć bezsensowną funkcję czytaj dalej. Poznasz tę funkcję i może zwrócisz też uwagę, że zmienne do indeksów tablic nie są wskaźnikami (jak nie wiesz co mam na myśli definitywnie czytaj dalej)…
Po staremu – indeks
Zobaczmy, jak to wygląda „po staremu”:
<script>
let arr = [1,2,3,4,5]
arr[0] = -1;
console.log(arr);
//[-1, 2, 3, 4, 5]
</script>
Jak widać element o indeksie zerowym (pierwszy element) zamieniony z 1 na -1. Wydawałoby się, że wszystko jest w porządku i nie ma żadnego powodu, aby do takich podmianek używać osobnej funkcji.
A teraz problematyczny przykład:
<script>
let arr = [1,2,3,4,5]
let first = arr[0];
console.log(first);
//1
arr[0] = -1;
console.log(arr);
//[-1, 2, 3, 4, 5]
console.log(first);
//1
</script>
Do first przypisaliśmy element o indeksie zerowym. Następnie w tablicy nastąpiła podmianka. Ale first nadal trzyma w sobie ten stary element.
Jeżeli to jest to, co osiągnąć chcieliśmy – okej. Jeżeli chcieliśmy do first wstawić element 1 – osiągnęliśmy to.
UPDATE Z PRZYSZŁOŚCI: Nie, ta funkcja robi dokładnie to samo, first nadal będzie wskazywał -1. Ale przynajmniej poznajmy jak ona wygląda.
Po nowemu – Array.with(idx, val)
Tytuł mówi sam za siebie. Podajemy indeks i wartość, którą chcemy pod danym indeksem:
let arr = [1,2,3,4,5]
arr.with(0, -1);
console.log(arr)
//[-1, 2, 3, 4, 5]
Jak widać, udało się zamienić element o indeksie 0 na wartość -1
Serio??? Nadal 1?
Hmmm….
<script>
let arr = [1,2,3,4,5]
let first = arr[0];
console.log(first);
//1
arr.with(0, -1);
console.log(arr);
//[-1, 2, 3, 4, 5]
console.log(first);
//1 SERIO????
</script>
Zmienna first nadal ma wartość 1, choć ją podmieniliśmy. Działanie identyczne jak w klasycznym podejściu. Co innego o tej funkcji mówiono.
Możliwe, że jej działanie jeszcze się zmieni i first będzie wskazywać na wartość jaką jest pierwszy element tablicy, po update. Tak ta funkcja była opisywana i szczerze uwierzyłem w to, przecież nie wprowadziliby funkcji, która robi to samo, co już w tym języku mamy, bez żadnych widocznych zmian.
Z drugiej strony – coś mi „śmierdziało” jak to usłyszałem, bo przecież JS nie posiada wskaźników, więc niby w jaki sposób miałoby to działać? W dokumentacji MDN nie ma nic na ten temat…
Cóż, jedyna różnica jest zatem taka, że funkcja with zwraca tablicę, a zatem można ją „chainować”:
let arr = [1,2,3,4,5]
arr.with(0, -1).forEach((el) => console.log(el));
I to by było na tyle. Ważne, że wiemy, że takie ustrojstwo jak array.with istnieje.
Jeżeli jednak jego działanie nie będzie się niczym różniło od podmieniania elementów „po indeksie” to możliwe, że metoda with skończy tak jak słówko kluczowe 'with’, które też zostało do JS po coś dodane, po czym usunięto je, uważając, że nie ma sensu, aby coś takiego istniało.
Morał z tego taki, aby wszystko zawsze testować i sprawdzać samemu oraz w źródłach typu dokumentacja.