Szukaj…


Wprowadzenie

Destrukturyzacja to technika dopasowywania wzorców , która została ostatnio dodana do Javascript w EcmaScript 6.

Pozwala powiązać grupę zmiennych z odpowiednim zestawem wartości, gdy ich wzór pasuje do prawej i lewej strony wyrażenia.

Składnia

  • niech [x, y] = [1, 2]
  • niech [pierwszy, ... odpoczynek] = [1, 2, 3, 4]
  • niech [jeden, trzy] = [1, 2, 3]
  • let [val = „wartość domyślna”] = []
  • niech {a, b} = {a: x, b: y}
  • let {a: {c}} = {a: {c: 'nested'}, b: y}
  • niech {b = „wartość domyślna”} = {a: 0}

Uwagi

Destrukturyzacja jest nowością w specyfikacji ECMAScript 6 (AKA ES2015), a obsługa przeglądarki może być ograniczona. Poniższa tabela zawiera przegląd najwcześniejszych wersji przeglądarek, które obsługiwały> 75% specyfikacji.

Chrom Krawędź Firefox Internet Explorer Opera Safari
49 13 45 x 36 x

(Ostatnia aktualizacja - 2016/08/18)

Argumenty funkcji destrukcyjnej

Wyciągnij właściwości z obiektu przekazanego do funkcji. Ten wzorzec symuluje nazwane parametry zamiast polegać na pozycji argumentu.

let user = {
    name: 'Jill',
    age: 33,
    profession: 'Pilot'
}    

function greeting ({name, profession}) {
    console.log(`Hello, ${name} the ${profession}`)
}

greeting(user)

Działa to również w przypadku tablic:

let parts = ["Hello", "World!"];

function greeting([first, second]) {
    console.log(`${first} ${second}`);
}

Zmiana nazw zmiennych podczas destrukcji

Destrukturyzacja pozwala nam odnosić się do jednego klucza w obiekcie, ale deklarować go jako zmienną o innej nazwie. Składnia wygląda jak składnia klucz-wartość dla normalnego obiektu JavaScript.

let user = {
  name: 'John Smith',
  id: 10,
  email: '[email protected]',
};

let {user: userName, id: userId} = user;

console.log(userName) // John Smith
console.log(userId) // 10

Tablice destrukcyjne

const myArr = ['one', 'two', 'three']
const [ a, b, c ] = myArr

// a = 'one', b = 'two, c = 'three'

Możemy ustawić wartość domyślną w tablicy destrukcyjnej, patrz przykład Wartość domyślna podczas destrukcji .

Za pomocą tablicy destrukcyjnej możemy łatwo zamieniać wartości 2 zmiennych:

var a = 1;
var b = 3;

[a, b] = [b, a];
// a = 3, b = 1

Możemy określić puste miejsca, aby pominąć niepotrzebne wartości:

[a, , b] = [1, 2, 3] // a = 1, b = 3

Destrukturyzacja obiektów

Destrukturyzacja to wygodny sposób na wydobycie właściwości z obiektów na zmienne.

Podstawowa składnia:

let person = {
  name: 'Bob',
  age: 25
};

let { name, age } = person;

// Is equivalent to
let name = person.name; // 'Bob'
let age = person.age;   // 25

Restrukturyzacja i zmiana nazwy:

let person = {
  name: 'Bob',
  age: 25
};

let { name: firstName } = person;

// Is equivalent to
let firstName = person.name; // 'Bob'

Restrukturyzacja z wartościami domyślnymi:

let person = {
  name: 'Bob',
  age: 25
};

let { phone = '123-456-789' } = person;

// Is equivalent to
let phone = person.hasOwnProperty('phone') ? person.phone : '123-456-789'; // '123-456-789'

Restrukturyzacja i zmiana nazwy na wartości domyślne

let person = {
  name: 'Bob',
  age: 25
};

let { phone: p = '123-456-789' } = person;

// Is equivalent to
let p = person.hasOwnProperty('phone') ? person.phone : '123-456-789'; // '123-456-789'

Restrukturyzacja wewnątrz zmiennych

Oprócz przekształcania obiektów w argumenty funkcji, można ich używać w deklaracjach zmiennych w następujący sposób:

const person = {
  name: 'John Doe',
  age: 45,
  location: 'Paris, France',
};

let { name, age, location } = person;

console.log('I am ' + name + ', aged ' + age + ' and living in ' + location + '.');
// -> "I am John Doe aged 45 and living in Paris, France."

Jak widać, utworzono trzy nowe zmienne: name , age i location a ich wartości zostały pobrane od person obiektu person jeśli pasowały do nazw kluczy.

Używanie parametrów odpoczynku do utworzenia tablicy argumentów

Jeśli kiedykolwiek potrzebujesz tablicy składającej się z dodatkowych argumentów, które możesz, ale nie musisz, oprócz tych, które konkretnie zadeklarowałeś, możesz użyć parametru rest tablicy w deklaracji argumentów w następujący sposób:

Przykład 1, opcjonalne argumenty w tablicy:

function printArgs(arg1, arg2, ...theRest) {
  console.log(arg1, arg2, theRest);
}

printArgs(1, 2, 'optional', 4, 5);
// -> "1, 2, ['optional', 4, 5]"

Przykład 2, wszystkie argumenty są teraz tablicą:

function printArgs(...myArguments) {
  console.log(myArguments, Array.isArray(myArguments));
}

printArgs(1, 2, 'Arg #3');
// -> "[1, 2, 'Arg #3'] true"

Konsola wydrukowała wartość true, ponieważ myArguments jest również myArguments , a także ...myArguments w deklaracji argumentów parametrów konwertuje listę wartości uzyskanych przez funkcję (parametry) oddzielone przecinkami na w pełni funkcjonalną tablicę (a nie obiekt podobny do tablicy jak natywny obiekt argumentów).

Wartość domyślna podczas destrukcji

Często spotykamy sytuację, w której nieruchomość próbujemy ekstraktu nie istnieje w obiekcie / na tablicy, w wyniku TypeError (podczas demontażu struktury obiektów zagnieżdżonych) lub jako zestaw do undefined . Podczas destrukcji możemy ustawić wartość domyślną, do której nastąpi powrót, w przypadku gdy nie zostanie ona znaleziona w obiekcie.

var obj = {a : 1};
var {a : x , b : x1 = 10} = obj;
console.log(x, x1); // 1, 10
 
var arr = [];
var [a = 5, b = 10, c] = arr;
console.log(a, b, c); // 5, 10, undefined

Zagnieżdżona destrukcja

Nie jesteśmy ograniczeni do restrukturyzacji obiektu / tablicy, możemy zniszczyć zagnieżdżony obiekt / tablicę.

Niszczenie obiektów zagnieżdżonych

var obj = {
  a: {
    c: 1,
    d: 3
  },
  b: 2
};

var {
  a: {
    c: x,
    d: y
  },
  b: z
} = obj;

console.log(x, y, z);     // 1,3,2

Destrukturyzacja macierzy zagnieżdżonych

var arr = [1, 2, [3, 4], 5];

var [a, , [b, c], d] = arr;

console.log(a, b, c, d);      // 1 3 4 5

Destrukturyzacja nie ogranicza się tylko do jednego wzorca, możemy mieć w niej tablice z n-poziomami zagnieżdżenia. Podobnie możemy zniszczyć tablice za pomocą obiektów i odwrotnie.

Tablice w obiekcie

var obj = {
  a: 1,
  b: [2, 3]
};

var {
  a: x1,
  b: [x2, x3]
} = obj;

console.log(x1, x2, x3);    // 1 2 3

Obiekty w tablicach

var arr = [1, 2 , {a : 3}, 4];

var [x1, x2 , {a : x3}, x4] = arr;

console.log(x1, x2, x3, x4);


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow