Чем больше вы знаете, тем больше вы не знаете
点赞Посмотри еще раз, аромат остался в руке, и слава
введение
Объекты и массивы являются двумя наиболее часто используемыми структурами данных в Javascript.Из-за популярности формата данных JSON они стали особенно важной частью языка Javascript. Во время кодирования мы часто определяем множество объектов и массивов, а затем организованно извлекаем из них соответствующие фрагменты информации. В ES6 добавлена новая функция, упрощающая эту задачу: деструктуризация. Деструктуризация — это процесс разбиения структуры данных на более мелкие части.
Зачем нужна деконструкция
Давайте рассмотрим ситуацию, с которой наверняка сталкивалось большинство людей при программировании на Javascript.
Предположим, у нас есть данные о студентах, и объект в данных о студентах представляет баллы по трем предметам (математика, китайский язык, английский язык), и мы отображаем информацию о баллах студента на основе этих данных:
const student = {
name:'jsPool',
age:20,
scores:{
math:95,
chinese:98,
english:93
}
}
function showScore(student){
console.log('学生名:' + student.name);
console.log('数学成绩:' + (student.scores.math || 0 ));
console.log('语文成绩:' + (student.scores.chinese || 0 ));
console.log('英语成绩:' + (student.scores.english || 0 ));
}
showScore(student)
Используя приведенный выше код, мы получим желаемый результат. Однако код, написанный таким образом, должен иметь некоторые оговорки. Поскольку оценки объектов, к которым мы обращаемся, вложены в другого ученика объекта, наша цепочка доступа становится длиннее, что означает больше входных данных, И чем больше печатается, тем выше вероятность орфографических ошибок. Конечно, это не имеет большого значения, но, деструктурируя, мы можем использовать более выразительный и более компактный синтаксис, чтобы сделать то же самое.
Назначение деструктуризации объекта
Синтаксическая форма деструктуризации объекта заключается в размещении литерала объекта слева от оператора присваивания, например:
let details = {
firstName:'Code',
lastName:'Burst',
age:22
}
const {firstName,age} = details;
console.log(firstName); // Code
console.log(age); // 22
В этом коде значение details.firstName хранится в переменной firstName, а значение details.age хранится в переменной age. Это самая основная форма деструктурирования объекта.
Используйте схему, чтобы объяснить процесс деконструкции:
Присвоение переменных с разными именами
В этом примере мы используем то же имя переменной, что и имя свойства объекта, конечно, мы также можем определить имена переменных, которые отличаются от имен свойств:
const person = {
name: 'jsPool',
country: 'China'
};
const {name:fullname,country:place} = person;
console.log(fullname); // jsPool
console.log(place); // China
Здесь мы создаем две локальные переменные: полное имя, место и сопоставляем полное имя с именем и местом со страной.
По умолчанию
При использовании выражения присваивания деструктурирования, если указанное имя локальной переменной не существует в объекте, локальной переменной будет присвоено значение undefined, например:
const person = {
name: 'jsPool',
country: 'China'
};
let {age} = person;
console.log(age); // undefined
Этот код дополнительно определяет локальную переменную age, а затем пытается присвоить ей значение, однако в объекте person нет значения свойства, соответствующего имени свойства, поэтому оно присваивается undefined, как и ожидалось.
Если указанное свойство не существует, вы можете определить значение по умолчанию, добавив знак равенства (=) и соответствующее значение по умолчанию после имени свойства:
const person = {
name: 'jsPool',
country: 'China',
sexual:undefined
};
let {age = 20,sexual:sex = 'male'} = person;
console.log(age); // 20
console.log(sex); // male
В этом примере для переменной age установлено значение по умолчанию 20, а для одноименной переменной секс установлено значение по умолчанию male. Это значение по умолчанию действует только в том случае, если объект person не имеет этого свойства или значение свойства не определено.
Разрушение присвоения вложенных объектов
Деструктуризация вложенных объектов по-прежнему аналогична синтаксису литералов объектов, и вы можете деструктурировать объект, чтобы получить нужную информацию.
Давайте еще раз посмотрим на первый пример в тексте. У нас есть данные об ученике. В данных об ученике объект используется для представления оценок по трем предметам (математика, китайский язык и английский язык). Мы отображаем информацию о баллах ученика на основе эти данные. Мы можем элегантно манипулировать им, деструктурируя присваивание:
const student = {
name:'jsPool',
age:20,
scores:{
math:95,
chinese:98,
english:93
}
}
function showScore(student){
const { name,scores:{ math = 0,chinese = 0, english = 0}} = student;
console.log('学生名:' + name);
console.log('数学成绩:' + math);
console.log('语文成绩:' + chinese);
console.log('英语成绩:' + english);
}
showScore(student)
Здесь мы определяем четыре локальные переменные: name, math, chinese, english. Кроме того, мы также указали значения по умолчанию для переменных math, chinese и english.
Назначение деструктурирования массива
По сравнению с синтаксисом деструктуризации объектов, деструктуризация массива намного проще, она использует литералы массива, и все операции деструктуризации выполняются в массиве, вместо использования именованных свойств объекта, как в синтаксисе литерала объекта.
let list = [221,'Baker Street','London'];
let [houseNo,street] = list;
console.log(houseNo,street);// 221 , Baker Street
В приведенном выше коде мы деконструировали значения, соответствующие индексам массива 0 и 1, из списка массивов и сохранили их в переменных houseNo и street соответственно.
При деструктуризации массива вы также можете опускать элементы напрямую и указывать имена переменных только для необходимых элементов:
let list = [221,'Baker Street','London'];
let [houseNo,,city] = list;
console.log(houseNo,city);// 221 , London
В этом коде синтаксис деструктурирования используется для получения из списка элементов, соответствующих индексу 0 и индексу 2. Запятая перед городом является заполнителем для предыдущего элемента.Независимо от того, сколько элементов в массиве, его можно извлеченный таким образом нужный элемент.
Используйте схему, чтобы объяснить процесс деконструкции:
По умолчанию
Вы также можете добавить значение по умолчанию в любую позицию массива в выражении присваивания деструктурирования массива и использовать значение по умолчанию, когда свойство в указанной позиции не существует или его значение не определено:
let list = [221,'Baker Street'];
let [houseNo,street,city = 'BJ'] = list;
console.log(houseNo,street,city);// 221 , Baker Street , BJ
В приведенном выше коде список массивов содержит только два элемента, а переменная city не имеет соответствующего значения, но имеет значение по умолчанию BJ, поэтому окончательный результат вывода city не является неопределенным, а имеет значение по умолчанию BJ.
Разрушение присваивания вложенных массивов
Как и объекты, вложенные массивы также могут быть уничтожены.Вставка другого режима деструктурирования массива в исходный режим деструктурирования массива может вывести процесс деструктурирования на следующий уровень:
let colors = [ 'red' , [ 'green' , 'yellow' ] , 'blue' ];
let [ firstColor , [ secondColor ] ] = colors;
console.log(firstColor,secondColor); // red , green
В этом примере мы присваиваем соответствующие значения переменным firstColor и secondColor посредством вложенной деструктуризации массивов.
неопределенный элемент
В массиве остальные элементы массива могут быть присвоены определенной переменной с использованием синтаксиса ..., например:
let colors = ['red','green','blue'];
let [firstColor,...otherColors] = colors;
console.log(firstColor); // red
console.log(otherColors); // ['green','blue']
В этом примере первый элемент массива colors присваивается firstColor, а остальные элементы присваиваются массиву otherColors, поэтому otherColors содержит два элемента: «зеленый» и «синий».
Гибридная деконструкция
Вы можете комбинировать деструктуризацию объектов и деструктуризацию массивов для создания более сложных выражений, чтобы можно было извлекать нужную информацию из любой структуры данных, смешанной с объектами и массивами.
let node = {
name:'foo',
loc:{
start:{
line:1,
column:1
}
},
range:[0,3]
}
let {
loc:{start:{line}},
range:[startIndex]
} = node;
console.log(line); // 1
console.log(startIndex); // 0
При использовании синтаксиса гибридной деструктуризации вы можете извлечь любую нужную информацию из объекта узла.
Гибридная деструктуризация особенно эффективна при извлечении данных из JSON без необходимости выполнять всю деструктуризацию.
Ссылаться на
- Глубокое понимание ES6
- Простое руководство по деконструкции
- Деструктуризация ES6: полное руководство
- Разрушение назначения переменных в стандартной записи ES6
Рекомендуемая серия статей
- Серия ES6 — полный анализ let и const
- Серия ES6 — полный анализ стрелочных функций
- Серия ES6 — полный анализ Promise
напиши в конце
- Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, добро пожаловать
点赞и关注 - Эта статья была впервые опубликована одновременно сgithub, доступны наgithubНайдите больше отличных статей в
Watch&Star ★ - Для последующих статей см.:план
Добро пожаловать в публичный аккаунт WeChat
【前端小黑屋】, 1–3 высококачественные высококачественные статьи публикуются каждую неделю, чтобы помочь вам в продвижении вперед.