← Назад к вопросам

Что вернет метод values от Map?

1.2 Junior🔥 281 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что вернет метод values от Map?

Метод values() объекта Map возвращает итератор (MapIterator), который содержит все значения, хранящиеся в Map в порядке их добавления. Это один из трёх методов итерирования Map, наряду с keys() и entries().

Основное поведение

const map = new Map();
map.set('name', 'John');
map.set('age', 30);
map.set('city', 'New York');

const valuesIterator = map.values();
console.log(valuesIterator); // MapIterator { 'John', 30, 'New York' }

Как использовать итератор values()

Метод values() возвращает итератор, который можно использовать несколькими способами:

1. Цикл for...of

Самый удобный способ - использовать цикл for...of, который автоматически работает с итератором:

const map = new Map();
map.set('user1', { name: 'Alice', role: 'admin' });
map.set('user2', { name: 'Bob', role: 'user' });
map.set('user3', { name: 'Charlie', role: 'moderator' });

for (const value of map.values()) {
  console.log(value);
  // { name: 'Alice', role: 'admin' }
  // { name: 'Bob', role: 'user' }
  // { name: 'Charlie', role: 'moderator' }
}

2. Метод next() итератора

Можно вручную вызывать next() для получения следующего значения:

const map = new Map();
map.set('a', 1);
map.set('b', 2);
map.set('c', 3);

const iterator = map.values();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

3. Оператор spread (...)

Можно развернуть итератор в массив:

const map = new Map();
map.set('first', 10);
map.set('second', 20);
map.set('third', 30);

const valuesArray = [...map.values()];
console.log(valuesArray); // [10, 20, 30]

4. Метод Array.from()

Другой способ преобразовать итератор в массив:

const map = new Map();
map.set('x', 100);
map.set('y', 200);

const values = Array.from(map.values());
console.log(values); // [100, 200]

Сравнение с keys() и entries()

keys() - возвращает ключи

const map = new Map();
map.set('name', 'John');
map.set('age', 30);

for (const key of map.keys()) {
  console.log(key); // 'name', 'age'
}

entries() - возвращает пары [ключ, значение]

const map = new Map();
map.set('name', 'John');
map.set('age', 30);

for (const [key, value] of map.entries()) {
  console.log(key, value); // 'name' John, 'age' 30
}

// entries() - это default iterator для Map
// Поэтому это эквивалентно:
for (const [key, value] of map) {
  console.log(key, value);
}

values() - возвращает значения

const map = new Map();
map.set('name', 'John');
map.set('age', 30);

for (const value of map.values()) {
  console.log(value); // 'John', 30
}

Практический пример: Фильтрация значений Map

const userRoles = new Map();
userRoles.set('user1', 'admin');
userRoles.set('user2', 'user');
userRoles.set('user3', 'admin');
userRoles.set('user4', 'moderator');

// Получить все админы
const admins = [...userRoles.values()].filter(role => role === 'admin');
console.log(admins); // ['admin', 'admin']

// Проверить, есть ли хотя бы один админ
const hasAdmin = [...userRoles.values()].some(role => role === 'admin');
console.log(hasAdmin); // true

// Посчитать количество определённой роли
const userCount = [...userRoles.values()].filter(role => role === 'user').length;
console.log(userCount); // 1

Важные особенности

1. Итератор лениво вычисляется

Итератор не вычисляет значения сразу. Они вычисляются при необходимости:

const map = new Map();
map.set('a', 1);
map.set('b', 2);

const iterator = map.values();
map.set('c', 3); // Добавляем новое значение после получения итератора

for (const value of iterator) {
  console.log(value); // 1, 2, 3 - новое значение учтено!
}

2. Итератор одноразовый

Один итератор нельзя использовать дважды:

const map = new Map();
map.set('a', 1);
map.set('b', 2);

const iterator = map.values();

for (const value of iterator) {
  console.log(value); // 1, 2
}

for (const value of iterator) {
  console.log(value); // Ничего! Итератор уже исчерпан
}

// Нужно создать новый итератор
for (const value of map.values()) {
  console.log(value); // 1, 2 - работает
}

3. Порядок гарантирован

Значения возвращаются в том же порядке, в котором они были добавлены в Map:

const map = new Map();
map.set(3, 'три');
map.set(1, 'один');
map.set(2, 'два');

for (const value of map.values()) {
  console.log(value);
  // 'три' (добавлена первой)
  // 'один' (добавлена второй)
  // 'два' (добавлена третьей)
}

Возвращаемое значение в деталях

Метод values() возвращает объект MapIterator, который реализует итерируемый протокол. Этот объект имеет:

  • Symbol.iterator - метод, который возвращает сам себя
  • next() - метод, возвращающий объект с { value, done }
const map = new Map([['a', 1], ['b', 2]]);
const iterator = map.values();

// MapIterator реализует итерируемый протокол
console.log(typeof iterator[Symbol.iterator]); // 'function'
console.log(iterator[Symbol.iterator]() === iterator); // true

// Метод next() возвращает объект с value и done
console.log(iterator.next()); // { value: 1, done: false }

Метод values() - это мощный инструмент для работы с Map, позволяющий эффективно и удобно итерировать по значениям коллекции.

Что вернет метод values от Map? | PrepBro