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