質問: `Array.prototype.forEach()`と`Array.forEach()`は何が違うのでしょうか? * `Array.forEach()`と書いたら、内部で`Array.prototype.forEach()`が呼ばれるので、わざわざ`Array.prototype.forEach()`と書く必要はない? * それとも`Array.prototype.forEach()`と書くと、`Array.forEach()`では出来ない何かの処理ができるのでしょうか? --- 回答ありがとうございました。 質問するに辺り、最初に疑問に思った点を追記します。 ・下記は何が違うのでしょうか? Array.forEach Array.prototype.forEach() 基本はArray.prototype.forEach()だと思うのですが、 Array.forEachは、Array.prototype.forEach.call()の汎用的な簡易表記ということなのでしょうか? Mozilla(Firefox)だけの書き方?
回答: > > ・下記は何が違うのでしょうか? > > Array.forEach > > Array.prototype.forEach() > > > 前者のページ右上に表示されている「言語」から「English (US)」を選択していただくとわかるかと思いますが、その二つは同じ対象について書かれたものです。 確かにページタイトルでは `Array.forEach` となっているのですが、構文は次のように書かれています。 > > *array*.forEach(*callback*[, *thisObject*]); > > > ここで斜体になっている `array` は任意の配列ですから、 `Array.forEach(...)` として使うことはありません。 > > このリファレンスには、文書中の主題の適切なもしくは共通な利用法を具体的に説明するための構文の説明の部分があります。これらの部分では、文字通りそのままであることを表すすべてのテキストリテラルは 3 点リーダを除いてイタリックにはなっていません。イタリックの単語はユーザ定義の名前や 文 (statements) を表します。 > > > 引用元: > > > prototype の話はなかなか複雑なのでここでは避けますが、 `Array.prototype.forEach` に定義されている関数が、配列 `hoge` に対して `hoge.forEach(...)` として呼び出せる、というようなものです。 一方、処理系やブラウザによっては、字のごとく `Array.forEach` が存在する場合もあります。その一例がFirefoxでのArrayジェネリックメソッドです。 `Array.prototype` 以下に定義されているメソッドは、実際には対象に対して決まりきった操作をするものですから、配列と似た動きをするオブジェクトであれば使えることがあります。 ※これ自体はECMAScriptの言語仕様でも `The forEach function is intentionally generic` のように言及されています。 そのため `Array.prototype.forEach.call()` などとして強引に他のオブジェクトに対して実行するというテクがあるのですが、Mozillaはこれの代替として `Array.forEach` などを用意することにした、ということのようです。 この `Array.forEach` は「いわゆるJavascript」の標準規格である ECMAScript には含まれていないため、互換性は低いと言えるでしょう。