Visit Mozilla.org

Core JavaScript 1.5 Reference:Global Objects:Array:forEach

出典: MDC


目次

[編集] 概要

与えられた関数を、配列の各要素に対して一度ずつ実行します。

Array のメソッド
実装されたバージョン: JavaScript 1.6 (Gecko 1.8b2 以降)
ECMAScript バージョン: なし

[編集] 構文

array.forEach(callback[, thisObject]);

[編集] パラメータ

callback 
各要素に対して実行する関数。
thisObject 
callback を実行するときに this として使用するオブジェクト。

[編集] 説明

forEach は、与えられた関数 (callback) を配列に含まれる各要素に対して一度ずつ呼び出します。callback は値が代入されている配列のインデックスに対してのみ呼び出されます。つまり、すでに削除されたインデックスや、まだ値が代入されていないインデックスに対しては呼び出されません。

callback は、要素の値、要素のインデックス、走査されている Array オブジェクトという 3 つの引数をともなって呼び出されます。

forEachthisObject パラメータが与えられると、callback の呼び出しのたびにそのオブジェクトが this として使用されます。thisObject が与えられないか null だと、callback に結び付けられたグローバルオブジェクトが代わりに使用されます。

forEach は呼び出された配列を変化させません。

forEach によって処理される要素の範囲は、callback が最初に呼び出される前に設定されます。forEach の呼び出しが開始された後に追加された要素に対しては、callback は実行されません。既存の配列要素が変更されたり、削除された場合、callback に渡される値は forEach がそれらを訪れた時点での値になり、削除された要素には訪問されません。

[編集] 互換性

forEach は ECMA-262 標準に対する JavaScript 拡張なので、ECMA-262 標準の他の実装では存在しない場合があります。次のコードをスクリプトの先頭に挿入すると、forEach がネイティブでサポートされていない ECMA-262 実装でも forEach を使用できるようになります。これは Firefox および SpiderMonkey で使われているアルゴリズムとまったく同じものです。

if (!Array.prototype.forEach)
{
  Array.prototype.forEach = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        fun.call(thisp, this[i], i, this);
    }
  };
}

[編集]

[編集] 例: 配列の内容を出力する

次のコードは配列の要素 1 つにつき 1 行出力します。

function printElt(element, index, array) {
    print("[" + index + "] is " + element); // print は定義済みとする
}
[2, 5, 9].forEach(printElt);
// 出力:
// [0] is 2
// [1] is 5
// [2] is 9

[編集] 例: オブジェクトのメソッドを使って配列の内容を出力する

次のコードは単純な writer オブジェクトを生成し、writeln メソッドを使用して配列の要素 1 つにつき 1 行書き出します。

var writer = {
    sb:       [],
    write:    function (s) {
        this.sb.push(s);
    },
    writeln:  function (s) {
        this.write(s + "\n");
    },
    toString: function () {
        return this.sb.join("");
    }
};

[2, 5, 9].forEach(writer.writeln, writer);
print(writer.toString()); // print は定義済みとする
// 出力:
// 2
// 5
// 9