Jeżeli tablica nie jest pusta, np. tab(2 => 'asd', 7 => 'qwe') to mogę napisać:
tab[3] = 'ggg';
i otrzymuję tablicę: tab(2 => 'asd', 3 => ggg, 7 => 'qwe').
Ale jeżeli tablica jest pusta i napiszę tab[3] = 'ggg' to wcześniejsze elementy mają wartości undefined zamiast nie istnieć - tab(undefined, undefined, undefined, 4 => 'ggg').
Tak pokazuje funkcja console.log(tab). Jest sposób, aby to obejść?
Jeżeli tablica nie jest pusta i ale ma długość 10, a Ty dodasz element od 20 to też wypełni Ci to undefined. Nie możesz tego obejść z tego co mi wiadomo, a nawet jeżeli to lepiej tego nie robić, js ma wystarczająco dużo pulapek.
Za to możesz zrobić tak (co nie oznacza, że powinieneś)
var x = [];
x.length
//0
x.customProperty = "tadam";
x["customProperty"];
//"tadam"
x.length
//0
Nie chcę żeby zwracało 0 jak coś jest. Chce żeby działało tak jak w php. Jak tablica jest pusta i podam jej klucz i wartość to ma mieć 1 element o podanej wartości pod podanym kluczem.
tak będzie dobrze?
12:48:44.987 tab = {};
tab[2] = 'asd';
tab[7] = 'qwe';
tab[3] = 'ggg';
tab
12:48:44.993 Object { 2: "asd", 3: "ggg", 7: "qwe" }
W jsie nie ma tablic asocjacyjnych wiec nie bedzie to tak działalo. Możesz zrobić tak jak kolega wyżej napisał, ale nie ma to nic wspólnego z tablicą i indeksem. To tak jakbyś w php zrobił:
$tab = new stdClass();
tab->a = 'dadad';
object(stdClass)[478]
public 'a' => string 'dadad' (length=5)
Tyle, że w js możesz naprzemiennie używać property accessors (z wyjątkami)
Rozwiązałem to dodając byle co do tablicy i usuwając na starcie. Dopiero później sobie operuję i już można przypisywać normalnie do kluczy.