Array.prototype.values()
========================

**`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()` メソッドは `this` の `length` プロパティを読み込み、そのキーが `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 with JavaScript enabled. Enable JavaScript to view data.

関連情報
----

* `Array.prototype.values` のポリフィル (`core-js`)
* インデックス付きコレクションのガイド
* `Array`
* `Array.prototype.entries()`
* `Array.prototype.keys()`
* `Array.prototype[@@iterator]()`
* `TypedArray.prototype.values()`
* 反復処理プロトコル