Назначение деструктурирования Javascript

Хотя деструктурирование присваивания является новой концепцией в мире Javascript, это проверенный метод во многих других языках программирования, просто под разными именами. Например:

  • Ruby: параллельное назначение
  • PHP: листинг
  • Python: распаковка

Здесь я расскажу только о нескольких основных случаях задания по деструктурированию, но для получения дополнительной информации по этой конкретной теме ознакомьтесь с главой 10 изучения JS и этой великолепной презентацией.

Пример 1, обычная деструктуризация старого объекта:

Учитывая пользовательский объект:

const user = {
    name: 'Pauly-D',
    age: 25,
    shirtSize: 's/m'
};

Типичный способ доступа и использования свойств этого объекта:

const name = user.name;
const age = user.age;
const shirtSize = user.shirtSize;

Это хорошо и все, но кажется мне немного многословным и уродливым. Давайте попробуем деструктурировать этот объект способом ES6!

const {
    name,
    age,
    shirtSize
} = user;

И вот, у нас теперь есть 3 переменные, доступные в этой области user, age, and shirtSize, все они получены из пользовательского объекта.

Пример 2, переименование:

Итак, используя тот же объект, что и в предыдущем примере,

const user = {
    name: 'Pauly-D',
    age: 25,
    shirtSize: 's/m'
};

Допустим, мы хотим использовать эти переменные, но с более описательным именем:

const {
    name: userName,
    age: theAge,
    shirtSize: size
} = user;

И точно так же у нас есть 3 переменные в нашей области видимости userName, theAge, and size. Чтобы было ясно, теперь мы можем использовать эти переменные как обычные объявления:

if (theAge < 30 && size === 's/m') {
    console.log("I am hit.");
}

Пример 3, доступ к вложенным свойствам:

Допустим, наш пример объекта становится немного сложнее,

const user = {
    name: 'Pauly-D',
    age: 25,
    shirtSize: 's/m',
    state: {
        isLoggedIn: true,
        profile: {
            theme: 'dark',
            textSize: '10px'
        }
    }
};

но мы подсели на деструктурирование объектов и хотим продолжать его использовать. Мы можем это сделать!

const {
    name,
    age: userAge,
    size: shirtSize,
    state: {
        profile: {
            theme: userTheme,
            textSize
        }
    }
} = user;
console.log(userTheme) // prints 'dark'
console.log(textSize) // prints '10px'

Приведенный выше оператор создает 5 новых переменных name, userAge, userTheme, and textSize. Довольно аккуратно, да? Как насчет нулевой/неопределенной безопасности?

Пример 4, использование значений по умолчанию при деструктуризации:

Так что, если мы не уверены, что объект профиля пользователя из нашего примера будет чистым? Нравится:

const user = {
    name: 'Pauly-D',
    age: 25,
    shirtSize: 's/m',
    state: {
        isLoggedIn: true,
        profile: undefined
    }
};

Мы можем просто сделать это, чтобы защитить нас без ошибок:

const {
    name,
    age: userAge,
    size: shirtSize,
    state: {
        profile: {
            theme: userTheme,
            textSize
        } = {} // psst the magic is happening here
    }
} = user;
console.log(userTheme); //undefined
console.log(textSize); //undefined

Обозначение параметра по умолчанию можно использовать на любом этапе деструктуризации:

const {
    name,
    age: userAge,
    size: shirtSize,
    state: {
        profile: {
            theme: userTheme = 'Mikey',
            textSize = '15px'
        } = {}
    }
} = user;
console.log(userTheme); //'Mikey'
console.log(textSize); //'15px'

Где еще мы можем использовать это обозначение?

Пример 5, параметры функции деструктурирования:

Синтаксис деструктурирования удобен и все такое, но можете ли вы использовать его где-нибудь еще? Конечно! Вы можете использовать синтаксис деструктурирования практически везде, где вы объявляете переменные. Здесь вы можете увидеть, как он используется в функции с параметром объекта:

const user = {
    name: 'Pauly-D',
    age: 25
};
const validateUser = ({ name, age: userAge, shirtSize = 's' }) => {
    console.log('name', name);
    console.log('userAge', userAge);
    console.log('shirtSize', shirtSize);
};
validateUser(user);
// logs
// name: 'Pauly-D'
// age: 25
// shirtSize: 's'