Menu

Destrukturyzacja w JavaScript: obiekty, tablice, wartości domyślne i rest

Jak działa destrukturyzacja (destructuring) w JavaScript: wyciąganie wartości z obiektów i tablic, zmiana nazw, wartości domyślne, zagnieżdżone wzorce i parametry funkcji.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Destrukturyzacja to dopasowywanie wzorców do kształtów

Destrukturyzacja pozwala napisać wzorzec odwzorowujący kształt obiektu lub tablicy i w jednej linii wyciągnąć z niego wartości po nazwie albo po pozycji. Zamiast sięgać do wartości właściwość po właściwości, opisujesz, czego chcesz, a JavaScript ci to podaje.

Dwa warianty:

Nawiasy klamrowe dopasowują obiekt po nazwach właściwości. Nawiasy kwadratowe dopasowują tablicę po pozycji. W obu przypadkach zmienne po lewej stronie to nowe deklaracje: nie indeksujesz wartości, tylko opisujesz wzorzec, który wydobywa z niej kawałki.

Zanim pojawiła się destrukturyzacja, ten sam kod wyglądał tak:

const name = user.name;
const age = user.age;
const first = scores[0];
const second = scores[1];

To nie koniec świata, ale robi się monotonne, gdy piszesz to w każdej funkcji.

Destrukturyzacja obiektu używa nazw właściwości

W przypadku obiektów nazwy w nawiasach klamrowych muszą odpowiadać nazwom właściwości źródła. Kolejność nie ma znaczenia, bo JavaScript wyszukuje je po kluczu.

Jeśli obiekt nie ma danej właściwości, zmienna dostaje wartość undefined, bez żadnego błędu:

O tym cichym undefined warto pamiętać, gdy literówka w nazwie właściwości każe ci drapać się po głowie o drugiej w nocy.

Zmiana nazw zmiennych

Czasem nazwa właściwości w obiekcie nie jest tą, którą chcesz nadać zmiennej: może koliduje z czymś innym w zakresie albo API używa konwencji nazewnictwa, która ci nie odpowiada. Użyj original: newName, żeby przypisać ją pod inną nazwą:

Czytaj to jako „weź właściwość id i nazwij ją userId”. Najpierw nazwa właściwości, po dwukropku nazwa nowej zmiennej. Wygląda jak adnotacja typu z innych języków, ale nią nie jest.

Wartości domyślne

Jeśli właściwości może brakować, podaj wartość domyślną bezpośrednio we wzorcu:

Wartości domyślne działają tylko wtedy, gdy wartość to undefined. null, 0 i "" przechodzą bez zmian:

Na tym wiele osób się łapie. Jeśli chcesz, żeby null też uruchamiał wartość domyślną, potrzebujesz jawnego sprawdzenia albo operatora nullish coalescing ?? po destrukturyzacji.

Wartości domyślne można łączyć ze zmianą nazwy:

Destrukturyzacja tablicy używa pozycji

Tablice nie mają nazw, tylko indeksy, więc wzorzec dopasowuje po pozycji. Przecinkami pomijasz elementy, które cię nie interesują:

Dwa początkowe przecinki znaczą „pomiń indeks 0 i 1”. Wizualnie trochę gęste, ale przydatne, gdy chcesz tylko jedną wartość ze środka.

Destrukturyzacja tablic błyszczy przy funkcjach, które zwracają krotki:

Ten sam wzorzec pojawia się wszędzie w hookach Reacta: const [count, setCount] = useState(0).

Wzorce rest: zbieranie resztek

Wewnątrz wzorca destrukturyzacji ...name zbiera do nowej zmiennej wszystko, czego nie dopasowano po nazwie ani po pozycji.

W tablicach rest zbiera ogon:

W obiektach rest zbiera każdą właściwość, której nie wymieniono jawnie:

To idiomatyczny sposób na usunięcie jednego pola z obiektu bez jego modyfikowania: rest to nowy obiekt zawierający wszystko oprócz id.

Rest musi być ostatnim elementem wzorca. const [...init, last] to błąd składni.

Zagnieżdżona destrukturyzacja

Wzorce można zagnieżdżać. Jeśli właściwość sama jest obiektem lub tablicą, możesz ją destrukturyzować w tym samym wyrażeniu:

To potężne narzędzie, ale korzystaj z niego ostrożnie. Trzy poziomy zagnieżdżonych klamer zaczynają przypominać łamigłówkę. Gdy tak się dzieje, wyciągnij wartości pośrednie do osobnych zmiennych: czytelność wygrywa ze sprytem.

Jedna pułapka: data: { user } we wzorcu nie tworzy zmiennej o nazwie data. To polecenie „wejdź do data i destrukturyzuj dalej”. Jeśli potrzebujesz samego data, dodaj je osobno:

Destrukturyzacja parametrów funkcji

Najczęściej destrukturyzację spotkasz na liście parametrów funkcji. Zamienia „przekaż obiekt opcji” w sygnaturę, która sama się dokumentuje:

W miejscu wywołania wygląda to jak każde inne wywołanie z obiektem opcji. Wewnątrz funkcji dostajesz nazwane zmienne z wartościami domyślnymi, bez szablonowego options.name || "default".

Jedna ostra krawędź: wywołanie tej funkcji bez argumentu kończy się błędem, bo nie da się destrukturyzować undefined. Nadaj wartość domyślną całemu parametrowi:

= {} po wzorcu znaczy „jeśli nie przyszedł żaden argument, udawaj, że był to pusty obiekt”. Potem do akcji wkraczają wewnętrzne wartości domyślne.

Zamiana i ponowne przypisanie

Destrukturyzacja działa też z już zadeklarowanymi zmiennymi, ale wzorzec obiektu trzeba wtedy otoczyć nawiasami okrągłymi (inaczej JavaScript odczyta { jako początek bloku):

Zamiana przez tablicę jest czysta. Ponowne przypisanie przez obiekt zdarza się rzadziej, ale sztuczkę z nawiasami warto zapamiętać na wypadek, gdyby była potrzebna.

Realistyczny przykład

Połączenie większości tego, co powyżej: funkcja przetwarzająca odpowiedź API:

Każda destrukturyzowana warstwa ma wartość domyślną, więc funkcja radzi sobie z niepełnymi danymi bez stosu strażników if. To prawdziwa korzyść: sygnatury, które są jednocześnie precyzyjne i wyrozumiałe.

Dalej: object spread

Destrukturyzacja wyciąga wartości z obiektów. Spread je wkłada: kopiuje, łączy i nadpisuje. W nowoczesnym JavaScript te dwie techniki stale idą w parze, a spread omawia następna strona.

Najczęściej zadawane pytania

Czym jest destrukturyzacja w JavaScript?

Destrukturyzacja (destructuring) to składnia, która w jednym kroku wyciąga wartości z obiektów lub tablic i przypisuje je do zmiennych. const { name } = user; pobiera właściwość name z user. const [first, second] = list; pobiera dwa pierwsze elementy list. To wzorzec po lewej stronie =, który odwzorowuje kształt wartości po prawej.

Jak zmienić nazwę zmiennej przy destrukturyzacji?

Użyj składni { original: newName }. const { name: username } = user; pobiera właściwość name z user i przypisuje ją do lokalnej zmiennej o nazwie username. Łatwo to pomylić z adnotacją typu, więc zapamiętaj: najpierw nazwa właściwości, a po dwukropku nazwa nowej zmiennej.

Czy przy destrukturyzacji można ustawić wartości domyślne?

Tak. const { timeout = 5000 } = options; użyje 5000, jeśli options.timeout ma wartość undefined. Wartości domyślne działają tylko dla undefined: null, 0 i '' przechodzą bez zmian. Wartości domyślne można łączyć ze zmianą nazwy: const { t: timeout = 5000 } = options;.

Czym różni się destrukturyzacja od spread?

Wyglądają podobnie, ale robią coś odwrotnego. Destrukturyzacja (const { a, b } = obj) wyciąga wartości ze struktury. Spread (const copy = { ...obj }) wkłada wartości do nowej struktury. ... wewnątrz wzorca destrukturyzacji to wzorzec rest: zbiera pozostałe elementy do nowej zmiennej.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ