Learn JavaScript

values() - метод для перебора значений массива в JavaScript

values() возвращает итератор, который по очереди отдаёт значения массива.

Этот метод удобен, когда нужен именно перебор значений без индексов.

Синтаксис

array.values()

Метод не принимает аргументов.

Что делает values()

values() создаёт объект-итератор, который возвращает элементы массива по порядку.

const iterator = ["a", "b", "c"].values();

console.log(iterator.next()); // { value: "a", done: false }
console.log(iterator.next()); // { value: "b", done: false }
console.log(iterator.next()); // { value: "c", done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Что возвращает values()

Метод возвращает не массив, а итератор.

const result = ["apple", "banana"].values();

console.log(result);
// Array Iterator {}

Поэтому с ним обычно работают через for...of, Array.from() или spread.

Перебор через for…of

Один из самых удобных способов использовать values() - пройтись по значениям в цикле.

const fruits = ["apple", "banana", "orange"];

for (const fruit of fruits.values()) {
  console.log(fruit);
}

Результат:

"apple"
"banana"
"orange"

Преобразование в обычный массив

Если нужен обычный массив, итератор можно развернуть:

const result = Array.from(["a", "b", "c"].values());

console.log(result); // ["a", "b", "c"]

То же самое можно сделать через spread:

const result = [...["x", "y"].values()];

console.log(result); // ["x", "y"]

values() не меняет исходный массив

Метод только создаёт итератор и не изменяет массив.

const numbers = [10, 20, 30];
const iterator = numbers.values();

console.log(numbers); // [10, 20, 30]

Пустые слоты

values() проходит и по пустым слотам массива.

const arr = Array(3);

console.log([...arr.values()]); // [undefined, undefined, undefined]

Это важно, потому что forEach() в такой ситуации callback вообще не вызовет.

values(), keys() и entries()

У этих методов похожая идея, но результаты у них разные:

  • values() - значения
  • keys() - индексы
  • entries() - пары [индекс, значение]

Пример:

const numbers = [10, 20];

console.log([...numbers.values()]);  // [10, 20]
console.log([...numbers.keys()]);    // [0, 1]
console.log([...numbers.entries()]); // [[0, 10], [1, 20]]

values() и for…of

Для массива for...of и так проходит по значениям.

const numbers = [1, 2, 3];

for (const value of numbers) {
  console.log(value);
}

Поэтому values() чаще используют, когда нужно явно показать намерение или получить именно итератор.

Итератор расходуется

Итератор нельзя использовать бесконечно. После полного прохода он становится пустым.

const iterator = ["a", "b"].values();

console.log([...iterator]); // ["a", "b"]
console.log([...iterator]); // []

Если нужен новый проход, нужно снова вызвать values().

Когда это полезно

values() удобно использовать, когда:

  • нужны только значения массива
  • хочется работать именно с итератором
  • нужно явно показать, что интересуют значения, а не индексы

Частые ошибки

Думать, что values() возвращает массив

const result = [1, 2, 3].values();

console.log(result); // Array Iterator {}

Если нужен обычный массив, итератор надо развернуть.

Забывать, что итератор одноразовый

const iterator = ["a", "b"].values();

console.log([...iterator]); // ["a", "b"]
console.log([...iterator]); // []

После полного прохода этот же итератор уже пуст.

Думать, что values() делает что-то другое, чем for…of

const numbers = [1, 2, 3];

for (const value of numbers.values()) {
  console.log(value);
}

Для массива это тот же перебор значений, просто в более явной форме.

Быстрая памятка

  • values() возвращает итератор значений массива
  • метод не меняет исходный массив
  • результатом будет не массив, а итератор
  • пустые слоты тоже участвуют в переборе как undefined
  • чаще всего values() используют с for...of, Array.from() или spread

Коротко

values() - это способ получить значения массива в виде итератора. Главное, что стоит запомнить: метод возвращает не массив, а последовательность значений, с которой удобно работать через for...of или развернуть её в обычный массив.