Array.prototype.values()

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

試してみましょう

構文

js

values();

返値

新しい反復可能なイテレーターオブジェクトです。

解説

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

js

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

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

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

js

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() メソッドを呼び出すことができます。

js

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 ループは終了し、それ以降の反復処理は効果がありません。

js

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 文を使用して早めに反復処理を終了した場合、反復処理を継続する際にイテレーターで現在の位置から再開することができます。

js

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

js

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

関連情報