W tym krótkim epizodzie poznamy, czym jest pojęcie wskaźnika – czegoś w języku JS nieobecnego. Zauważymy, że zmiana wartości tablic pod konkretnym indeksem nie zmienia wartości zmiennych wcześniej z tych indeksów wartości pobierających i postaramy się odtworzyć działanie wskaźnika w JS, używając groźnej funkcji eval.

W języku JavaScript nie ma czegoś takiego, jak wskaźniki, znane z języków typu C czy C++. Nie ma referencji, ani niczego takiego. Co to dla nas oznacza w praktyce?

Oto tablica:

<script>
        let arr = [1,2,3,4,5]
        let first = arr[0]
        arr[0] = -1;
        console.log(arr);
        //[-1, 2, 3, 4, 5]
        console.log(first);
        //1
    </script>

Do first podrzucamy pierwszy element tablicy. Następnie zmieniamy pierwszy element tablicy na -1. Tablica się zmienia, ale w first nadal mamy starą wartość.

I nic nie pomoże. Ani użycie array.at do przypisania elementu first:

<script>
        let arr = [1,2,3,4,5]
        let first = arr.at(0)
        arr[0] = -1;
        console.log(arr);
        //[-1, 2, 3, 4, 5]
        console.log(first);
        //1
    </script>

Ani użycie array.with do zamiany elementu nie będzie mieć skutku:

<script>
        let arr = [1,2,3,4,5]
        let first = arr.at(0)
        arr.with(0,-1)
        console.log(arr);
        //[-1, 2, 3, 4, 5]
        console.log(first);
        //1
    </script>

Ze wskaźnikiem mielibyśmy do czynienia, gdyby first zawsze wskazywał na pierwszy element naszej tablicy, nawet jeśli ten element uległ zmianie.

Tutaj tego nie mamy, ale wiedząc czym jest wskaźnik i o co chodzi, możemy spróbować go sobie napisać.

Wskaźnik – trudniejsze, niż się wydaje

Szczerze, nawet ChatGPT nie potrafił tego napisać. Po wielu próbach i błędach w końcu znalazłem sposób, aby zrobić wskaźnik w JS.

function Pointer(arrName, idx) {
            this.arrName = arrName;
            this.idx = idx;
        }
        
 Pointer.prototype.get = function(){ 
            return eval(`${this.arrName[${this.idx}]`);
        }
        
        let arr = [1, 2, 3, 4, 5];
        let first = new Pointer('arr', 0);
        console.log(first.get());
        //1


        arr[0] = -1; 
        
        console.log(arr); 
        //[-1, 2, 3, 4, 5]
        console.log(first.get()); 
        //-1