Что делает новую функцию языка программирования великолепной? Это когда функция может быть объединена с несколькими другими функциями.
ES2015
представлен в версииfor...of
Это касается заявлений.
for...of
Вы можете перебирать массивы, массивоподобные объекты и любой итерируемый объект (maps
,sets
,DOM集合
),и,for...of
Приговор по-прежнему очень короткий.
В этой статье я продемонстрируюfor...of
Способность.
1. Итерация массива
for...of
Наиболее распространенное приложение — перебор элементов массива. Цикл может эффективно завершить итерацию без необходимости использования дополнительных переменных для хранения индекса.
Например:
const products = ['oranges', 'apples'];
for (const product of products) {
console.log(product);
}
// 'oranges'
// 'apples'
for...of
Переберитеproducts
каждого предмета. Элементы итератора назначаются переменнымproduct
.
метод массиваentries()
Индекс, который можно использовать для доступа к элементу итерации. Метод возвращает пару на каждой итерации[index,item]
.
Деструктуризация на местеfor...of
Еще одна важная особенность , которую мы подробно опишем в следующем разделе.
1.1 Деструктуризация на месте
Во-первых, давайте посмотрим наfor...of
Синтаксис цикла:
for (LeftHandSideExpression of Expression) {
// statements
}
LeftHandSideExpression
Выражения можно заменить содержимым левой части любого выражения присваивания.
В предыдущем примереLeftHandSideExpression
это объявление переменнойconst product
, даже деконструкцияconst [index,product]
.
следовательно,for...of
Синтаксис поддерживает деструктурирование для реализации итерируемых элементов.
Давайте пройдемся по массиву объектов, извлекаяname
Атрибуты:
const persons = [
{ name: 'John Smith' },
{ name: 'Jane Doe' }
];
for (const { name } of persons) {
console.log(name);
}
// 'John Smith'
// 'Jane Doe'
const { name } of persons
повторение циклаpersons
массив объектов, и на месте будетperson
Объекты деконструируются.
2. Массивная итерация
for...of
Может использоваться для перебора массивоподобных объектов.arguments
Это специальная переменная в теле функции, содержащая все параметры функции, представляющая собой классический массивоподобный объект.
Напишем функцию суммированияsum(num1, num2, ..., numN)
:
function sum() {
let sum = 0;
for (const number of arguments) {
sum += number;
}
return sum;
}
sum(1, 2, 3); // => 6
В каждой итерацииfor...of
цикл по массиву классовarguments
для каждого числа и вычислить сумму.
3. Быстро понять итерации
Что такое итерируемый объект? это поддерживаетсяИтерируемый протоколОбъект.
Мы можем видетьSymbol.iterator
метод, чтобы определить, является ли часть данных итерируемой. Например, в следующем примере показано, что массивы являются итерируемыми:
const array = [1, 2, 3];
const iterator1 = array[Symbol.iterator]();
iterator1.next(); // => { value: 1, done: false }
Если вы хотите узнать больше, вы всегда можете прочитать меняпредыдущая статья.
for...of
Принимает итерируемый объект. Это здорово, потому что теперь вы можете повторятьstring
, массив, подобный массиву,set
,map
, продолжая наслаждатьсяfor...of
простоты.
4. Итерация строки
JavaScript
базовый типstring
является итерируемым. Таким образом, легко перебирать символы строки.
const message = 'hello';
for (const character of message) {
console.log(character);
}
// 'h'
// 'e'
// 'l'
// 'l'
// 'o'
message
является строкой. Поскольку строки являются итерируемыми, поэтомуfor...of
Переберитеmessage
.
5. Сопоставьте и установите итерацию
Map
— это специальный объект, который связывает ключи со значениями. ключи могут быть любого примитивного типа (обычноstring
, но может бытьnumber
Ждать).
К счастью,Map
также является итерируемым (перебор пар ключ/значение) иfor...of
Легко перебирать все пары ключ/значение.
Посмотрите вместе:
const names = new Map();
names.set(1, 'one');
names.set(2, 'two');
for (const [number, name] of names) {
console.log(number, name);
}
// logs 1, 'one'
// logs 2, 'two'
for (const [number, name] of names)
повторятьnames
пара ключ-значение.
В каждом цикле итератор возвращает массив[key,value]
и использоватьconst [number,name]
Немедленно деструктурируйте пару массивов.
можно пройти таким же образомSet
Предметы:
const colors = new Set(['white', 'blue', 'red', 'white']);
for (let color of colors) {
console.log(color);
}
// 'white'
// 'blue'
// 'red'
6. Перебор простых объектов JavaScript
Попытка перебрать свойства/значения простых объектов JS — это всегда боль. Раньше я обычно использовалObject.keys()
чтобы получить ключ объекта, затем используйтеforEach
для перебора массива ключей. [Переводчик: Это не мое мнение, я предпочитаю использоватьfor...in
Обход объектов, но нужно обратить вниманиеfor...in
побочные эффекты
const person = {
name: 'John Smith',
job: 'agent'
};
Object.keys(person).forEach(prop => {
console.log(prop, person[prop]);
});
// 'name', 'John Smith'
// 'job', 'agent'
новыйObject.entries()
функция сfor...of
Это хороший выбор для использования комбинации:
const person = {
name: 'John Smith',
job: 'agent'
};
for (const [prop, value] of Object.entries(person)) {
console.log(prop, value);
}
// 'name', 'John Smith'
// 'job', 'agent'
Object.entries(person)
Возвращает массив кортежей с ключами и значениями:[[''name','John Smith'],['job','agent']]
. Затем используйтеfor...of
Прокрутите массив и деструктурируйте каждый кортеж какconst [prop,value]
.
7. Пройдитесь по коллекции DOM
ты наверное знаешьHTMLCollection
удручающий. В основном потому, чтоHTMLCollection
является массивоподобным объектом (не обычным массивом), поэтому мы не можем использовать методы массива.
Например, каждыйDOM
элементальchildren
свойстваHTMLCollection
. к счастьюfor...of
Может перебирать массивоподобные объекты, поэтому мы можем легко перебиратьchildren
:
const children = document.body.children;
for (const child of children) {
console.log(child); // logs each child of <body>
}
также,for...of
повторяемыйNodeList
Коллекция (повторяемая). Например, функцияdocument.querySelectorAll(query)
вернутьNodeList
:
const allImages = document.querySelectorAll('img');
for (const image of allImages) {
console.log(image); // log each image in the document
}
Если вы хотите пройтиDOM
различные виды наборов в , тоfor...of
Заявления — хороший выбор.
8. Производительность
При переборе больших массивовfor...of
может быть медленнее, чем классический подход:
const a = [/* big array */];
for (let i = 0; i < a.length; i++) {
console.log(a[i]);
}
Вызов итератора на каждой итерации обходится дороже, чем доступ путем увеличения индекса. Однако этот нюанс важен в приложениях, использующих большие массивы и в приложениях, где критична производительность, хотя такое случается редко.
9. Резюме
зачем говоритьfor...of
является драгоценным камнем, потому что:
- это лаконично
- Он принимает итераторы, включая массивы, строки,
Set
,Map
, коллекция ДОМ - Он принимает массивоподобные объекты
- Итеративные элементы могут быть деструктурированы на месте.
Каков ваш предпочтительный способ перебора элементов массива?
Наконец:
Оригинальный адрес:Рисовое путешествие avlutin.com/JavaScript-…
Комментарии: Перевод ужасный, лучше машинного перевода. Ха-ха-ха-ха.