Array.prototype.values()

values() メソッドは、配列の各インデックスの値を含む新しい「配列反復子」オブジェクトを返します。

試してみましょう

構文

values()

返値

新しい反復可能な反復子オブジェクトです。

解説

Array.prototype.values()Array.prototype[@@iterator]() の既定の実装です。

Array.prototype.values === Array.prototype[Symbol.iterator]; // true

for...of ループを用いた反復処理

values() は反復可能な反復子を返すため、 for...of ループを使用して反復処理を行うことができます。

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

for (const letter of iterator) {
  console.log(letter);
} // "a" "b" "c" "d" "e"

next() を使用した反復処理

返値は反復子でもあるため、直接 next() メソッドを呼び出すことができます。

const arr = ["a", "b", "c", "d", "e"];
const iterator = arr.values();
iterator.next(); // { value: "a", done: false }
iterator.next(); // { value: "b", done: false }
iterator.next(); // { value: "c", done: false }
iterator.next(); // { value: "d", done: false }
iterator.next(); // { value: "e", done: false }
iterator.next(); // { value: undefined, done: true }
console.log(iterator.next().value); // undefined

反復可能オブジェクトの再利用

警告: 配列反復子オブジェクトは、一回のみ使用可能なオブジェクトになります。再利用しないでください。

values() で返される反復可能オブジェクトは再利用できません。 next().done = true または currentIndex > length になった場合、 for...of ループは終了し、それ以降の反復処理は効果がありません。

const arr = ["a", "b", "c", "d", "e"];
const values = arr.values();
for (const letter of values) {
  console.log(letter);
}
// "a" "b" "c" "d" "e"
for (const letter of values) {
  console.log(letter);
}
// undefined

break 文を使用して早めに反復処理を終了した場合、反復処理を継続する際に反復子で現在の位置から再開することができます。

const arr = ["a", "b", "c", "d", "e"];
const values = arr.values();
for (const letter of values) {
  console.log(letter);
  if (letter === "b") {
    break;
  }
}
// "a" "b"

for (const letter of values) {
  console.log(letter);
}
// "c" "d" "e"

反復処理中の書き替え

values() から返される配列の反復子オブジェクトには値が格納されていません。その代わり、生成時に使用した配列のアドレスを格納し、各反復時に現在アクセスしている位置を読み取ります。そのため、反復子の出力は、そのステップの実行時にその位置に格納されている値に依存します。配列の値が変化した場合は、配列反復子オブジェクトの値も変化します。

const arr = ["a", "b", "c", "d", "e"];
const iterator = arr.values();
console.log(iterator); // Array Iterator { }
console.log(iterator.next().value); // "a"
arr[1] = "n";
console.log(iterator.next().value); // "n"

仕様書

Specification
ECMAScript Language Specification
# sec-array.prototype.values

ブラウザーの互換性

BCD tables only load in the browser

関連情報