Array.prototype.values()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

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

試してみましょう

構文

js
values()

引数

なし。

返値

解説

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

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

疎配列に使用された場合、 values() メソッドは空のスロットを undefined の値である可能用に反復処理します。

values() メソッドは汎用的です。このメソッドは this 値に length プロパティと整数キーのプロパティがあることだけを期待します。

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"

疎配列の反復処理

values() は空のスロットを undefined であるかのように処理します。

js
for (const element of [, "a"].values()) {
  console.log(element);
}
// undefined
// 'a'

配列以外のオブジェクトに対する values() の呼び出し

values() メソッドは thislength プロパティを読み込み、そのキーが length より小さい非負の整数である各プロパティにアクセスします。

js
const arrayLike = {
  length: 3,
  0: "a",
  1: "b",
  2: "c",
  3: "d", // length が 3 であるため values() からは無視される
};
for (const entry of Array.prototype.values.call(arrayLike)) {
  console.log(entry);
}
// a
// b
// c

仕様書

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

ブラウザーの互換性

BCD tables only load in the browser

関連情報