JavaScript の Array オブジェクトは、配列を構築するためのグローバルオブジェクトです。配列とは、高レベルのリスト構造のようなオブジェクトです。

配列を作成する

var fruits = ["りんご", "バナナ"];

console.log(fruits.length);
// 2

配列の要素を取得する

var first = fruits[0];
// りんご

var last = fruits[fruits.length - 1];
// バナナ

配列のループ処理

fruits.forEach(function(item, index, array) {
  console.log(item, index);
});
// りんご 0
// バナナ 1

配列の末尾に要素を追加する

var newLength = fruits.push("みかん");
// ["りんご", "バナナ", "みかん"]

配列の末尾の要素を削除する

var last = fruits.pop(); // 配列の末尾の要素 "みかん" を削除
// ["りんご", "バナナ"];

配列の先頭の要素を削除する

var first = fruits.shift(); // 配列の先頭の要素"りんご" を削除
// ["バナナ"];

配列の先頭に要素を追加する

var newLength = fruits.unshift("いちご") // 配列の先頭に追加
// ["いちご", "バナナ"];

要素のインデックスを取得する

fruits.push("マンゴー");
// ["いちご", "バナナ", "マンゴー"]

var pos = fruits.indexOf("バナナ");
// 1

インデックス位置を指定して要素を削除する

var removedItem = fruits.splice(pos, 1); // 指定位置の要素を削除できます

// ["いちご", "マンゴー"]

Remove items from an index position

var vegetables = ['Cabbage', 'Turnip', 'Radish', 'Carrot'];
console.log(vegetables); 
// ["Cabbage", "Turnip", "Radish", "Carrot"]

var pos = 1, n = 2;

var removedItems = vegetables.splice(pos, n); 
// this is how to remove items, n defines the number of items to be removed,
// from that position(pos) onward to the end of array.

console.log(vegetables); 
// ["Cabbage", "Carrot"] (the original array is changed)

console.log(removedItems); 
// ["Turnip", "Radish"]

配列をコピーする

var shallowCopy = fruits.slice(); // 配列のコピーを作成できます
// ["いちご", "マンゴー"]

構文

[element0, element1, ..., elementN]
new Array(element0, element1[, ...[, elementN]])
new Array(arrayLength)

Parameters

elementN
JavaScript の配列は、与えられた要素で初期化されます。ただし、Array コンストラクタに引数が 1 個だけ与えられ、それが数値である場合を除きます (下記の arrayLength 引数を参照)。これは、Array コンストラクタで作成された JavaScript 配列にのみ当てはまる特殊なケースで、ブラケット構文 ("[]") で生成された配列リテラルには当てはまらないことに注意してください。
arrayLength
Array コンストラクタに 0 から 232-1 までの間の整数値 1 個が与えられた場合、その数値の要素数を持つ新しい JavaScript 配列が生成されます。それ以外の数値が与えられた場合、RangeError が throw されます。

説明

配列は、リストのようなオブジェクトであり、配列に対して横断的な操作や変更を行う組み込みのメソッドを持ちます。JavaScript の配列は、要素数も要素の型も固定されていません。配列のサイズは常に可変であり、データを連続しない位置に格納できるため、JavaScript の配列は密であることが保証されていません (プログラマの使い方次第です)。一般に、これらは便利な特性ではありますが、固定された配列が必要であれば、Typed Array の使用を検討するのも良いでしょう。

人によっては、JavaScript の配列を連想配列として使うべきではないと考えています。連想配列にはプレーンな objects を使用できますが、こちらにも注意点があります。例として、Lightweight JavaScript dictionaries with arbitrary keys の投稿記事をご覧ください。

配列要素へのアクセス

JavaScript の配列のインデックスは 0 から始まるので、配列の最初の要素はインデックス 0 にあります。そして、最後の要素のインデックスは length プロパティの値から 1 を引いた値になります。

var arr = ["最初の要素", "2 番目の要素", "最後の要素"];
console.log(arr[0]);              // ログ : "最初の要素"
console.log(arr[1]);              // ログ : "2 番目の要素"
console.log(arr[arr.length - 1]); // ログ : "最後の要素"

toString が一つのプロパティであるように、配列における配列要素は Array オブジェクトのプロパティです。しかし、次のように配列にアクセスしようとすると、プロパティ名が正しくないため、構文エラーが投げられる事に注意してください:

console.log(arr.0); // 構文エラー

これは、JavaScript の配列とそのプロパティに限った話ではありません。数字から始まるプロパティは、ドット演算子を用いて参照できないため、ブラケット記法を用いる必要があります。例えば '3d' というプロパティを持つオブジェクトがある場合は、ドット記法ではなくブラケット記法を用いて参照しなければなりません。この類似点を、以下 2 つのコード例で示します:

var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010];
console.log(years.0); // 構文エラー
console.log(years[0]); // 正しく動作
renderer.3d.setTexture(model, 'character.png');     // 構文エラー
renderer['3d'].setTexture(model, 'character.png');  // 正しく動作

3d の例で、'3d' は引用符で括らなければなりません。配列要素へのアクセスにも years[2] でなく years['2'] を使う事ができますが、必要になることはないでしょう。years[2] の 2 は最終的に、JavaScript エンジンが内部的に toString メソッドで型変換することで文字列にされます。これは '2' と '02' が years オブジェクトの異なる場所を指すようにするためでです。このため、以下の例は true がログ出力されます:

console.log(years['2'] != years['02']);

同様に、オブジェクトのプロパティ名が偶然にも予約語だった(!) 場合は、ブラケット記法で文字列リテラルを使うことでのみアクセスできます (ただ、少なくとも FireFox 40.0a2 では、ドット記法でアクセスできてしまいます):

var promise = {
  'var'  : 'text',
  'array': [1, 2, 3, 4]
};

console.log(promise['var']);

length と数値プロパティとの関係

JavaScript 配列の lengthプロパティと数値プロパティは関連しています。配列の組み込みメソッド (joinsliceindexOf 等) は、呼び出された時、配列の length プロパティの値を考慮します。また、pushsplice等の他のメソッドも、配列の length プロパティを更新します。

var fruits = [];
fruits.push('バナナ', 'りんご', 'もも');

console.log(fruits.length); // 3

有効なインデックスを持つ JavaScript 配列の現在のサイズに収まらない位置に要素を追加すると、配列はそれを収められるサイズに拡張され、length プロパティも更新されます。

fruits[5] = 'マンゴー';
console.log(fruits[5]);  // 'マンゴー'
console.log(Object.keys(fruits)); // ['0', '1', '2', '5']
console.log(fruits.length); // 6

length プロパティを直接設定して増やすと以下のように隙間ができます。

fruits.length = 10;
console.log(Object.keys(fruits)); // ['0', '1', '2', '5']
console.log(fruits.length); // 10

length プロパティの数を減らすと、要素が削除されます。

fruits.length = 2;
console.log(Object.keys(fruits)); // ['0', '1']
console.log(fruits.length); // 2

これらについては Array.length ページで詳しく解説します。

match の結果を利用して配列を作成

正規表現と文字列の match の結果から配列を生成できます。この配列には、プロパティと、マッチに関する情報を提供する要素を持ちます。このような配列は、RegExp.execString.match、そして String.replace の戻り値です。 これらのプロパティと要素を理解するために、以下の例を見て表を参照してください。

// 1 文字の d、1 文字以上の b、1 文字の d にマッチします
// マッチした b およびそれに続く d を記憶します
// 大文字小文字は区別しません

var myRe = /d(b+)(d)/i;
var myArray = myRe.exec('cdbBdbsbz');

このマッチから返されるプロパティと要素は次の通りです:

プロパティまたは要素 説明
input 正規表現がマッチした、元の文字列を反映する読み取り専用プロパティです。 cdbBdbsbz
index 文字列中でマッチした場所を、0 から始まるインデックスで示す読み取り専用プロパティです。 1
[0] 最後にマッチした文字列を指定する読み取り専用の要素です。 dbBd
[1], ...[n] 正規表現に含まれる場合、括弧で囲まれたマッチした部分文字列を指定する読み取り専用の要素です。括弧で囲まれた部分文字列の数は無制限です。 [1]: bB
[2]: d

プロパティ

Array.length
Array コンストラクタの長さ。値は 1 です。
get Array[@@species]
コンストラクタ関数。 派生オブジェクトを生成する時に使われます。
Array.prototype
これを使うと全てのArrayオブジェクトにプロパティを追加することができます。

メソッド

Array.from()
配列型 (array-like) や反復型 (iterable) オブジェクトから、新しい Array インスタンスを生成します。
Array.isArray()
配列であれば true を、配列でなければ false を返します。
Array.of()
可変個の引数から新しい Array インスタンスを生成します。引数の数や型による特別処理はありません。

Array インスタンス

すべての Array インスタンスは、Array.prototype から継承します。コンストラクタの prototype オブジェクトを変更すると、すべての Array インスタンスに影響を及ぼすことができます。

プロパティ

Array.prototype.constructor
オブジェクトの prototype を生成する関数を指定します。
Array.prototype.length
配列内の要素数を反映します。
Array.prototype[@@unscopables]
with バインディングのスコープから除外されるプロパティ名を保持するシンボル。

メソッド

変更メソッド

これらのメソッドは、配列を書き換えます。

Array.prototype.copyWithin()
配列内で配列内の要素をコピーします。
Array.prototype.fill()
配列内の指定した開始位置から終了位置までの要素を固定値で埋めます。
Array.prototype.pop()
配列から最後の要素を取得し、戻り値として返します。
Array.prototype.push()
配列の最後に 1 個以上の要素を追加し、新しい配列の長さを返します。
Array.prototype.reverse()
配列の要素の順番を逆転させます (最初の要素は最後に、最後の要素は最初になります)。
Array.prototype.shift()
配列から最初の要素を取り除き、その要素を返します。
Array.prototype.sort()
配列内で要素を整列し、配列を返します。
Array.prototype.splice()
配列に対して複数の要素を追加したり取り除いたりします。
Array.prototype.unshift()
配列の最初に 1 個以上の要素を追加し、配列の変更後の長さを返します。

アクセサ メソッド

これらのメソッドは呼び出し対象の配列を書き換えず、配列を何らかの形で表したものを返します。

Array.prototype.concat()
この配列に他の配列や値を結合して新しい配列を返します。
Array.prototype.includes()
この配列が特定の要素を含むかどうか判定し、その結果を true または false で返します。
Array.prototype.join()
配列のすべての要素を結合した文字列を返します。
Array.prototype.slice()
配列の一部を取り出して新しい配列として返します。
Array.prototype.toSource()
指定された配列を表す配列リテラルを返します。この値を使って新しい配列を作れます。Object.prototype.toSource() メソッドを上書きしています。
Array.prototype.toString()
配列とその要素を表す文字列を返します。Object.prototype.toString() メソッドを上書きしています。
Array.prototype.toLocaleString()
配列とその要素を表すロケールに従った文字列を返します。Object.prototype.toLocaleString() メソッドを上書きしています。
Array.prototype.indexOf()
指定された値と等しい値を持つ最初の (添字の一番小さい) 要素の添字を返します。見つからない場合、-1 を返します。
Array.prototype.lastIndexOf()
指定された値と等しい値を持つ最後の (添字の一番大きい) 要素の添字を返します。見つからない場合、-1 を返します。

反復メソッド

いくつかのメソッドは、配列を処理する際にコールバックされる関数を引数に取ります。これらのメソッドが呼ばれる時、配列の length 値を一時記憶するため、コールバック中にこの長さを超えて追加された要素にはアクセスしません。配列に対するその他の変更 (要素の値の書き換えや削除) は、変更された要素にメソッドが後でアクセスした場合の操作結果に影響を及ぼす可能性があります。そのような場合におけるこれらのメソッドの振る舞いは正確に定義されていますが、コードの読者を混乱させないよう、その振る舞いに依存すべきではありません。配列を変化させなければならない場合は、代わりに新しい配列にコピーしてください。

Array.prototype.forEach()
配列中のそれぞれの要素について関数を呼び出します。
Array.prototype.entries()
新しい Array Iterator オブジェクトを返します。このオブジェクトは、配列中の各インデックスに対する key/value ペアを保持しています。
Array.prototype.every()
指定したテスト関数を配列中のすべての要素が満たした場合に true を返します。
Array.prototype.some()
指定したテスト関数を配列中の少なくとも 1 個の要素が満たした場合に true を返します。
Array.prototype.filter()
指定したフィルタリング関数が true を返す、配列中の要素を格納した新しい配列を生成します。
Array.prototype.find()
指定したテスト関数を満たす、配列中の要素の値を返します。1 個も見つからない場合は undefined を返します。
Array.prototype.findIndex()
指定したテスト関数を満たす、配列中の要素のインデックスを返します。1 個も見つからない場合は -1 を返します。
Array.prototype.keys()
新しい Array Iterator を返します。このオブジェクトは配列中の各インデックスのキーを保持します。
Array.prototype.map()
配列内のすべての要素に対して与えられた関数を呼び出し、その結果を格納した新しい配列を生成します。
Array.prototype.reduce()
アキュムレータと配列内のすべての要素に対して (左から右の順で) 関数を適用し、単一の値に還元します。
Array.prototype.reduceRight()
アキュムレータと配列内のすべての要素に対して (右から左の順で) 関数を適用し、単一の値に還元します。
Array.prototype.values()
新しい Array Iterator オブジェクトを返します。このオブジェクトは、配列中の各インデックスの値を保持します。
Array.prototype[@@iterator]()
新しい Array Iterator オブジェクトを返します。このオブジェクトは、配列中の各インデックスの値を保持します。

Array ジェネリックメソッド

Array ジェネリックは非標準、非推奨であり、近い将来に削除される見込みです

文字列や他の配列のようなオブジェクト (関数の arguments など) に Array のメソッドを適用したいと考える場合があります。こうすると、文字列を文字の配列として扱えます (あるいは、配列ではないものを配列として扱う)。例えば、変数 str に含まれる文字がすべて英字であることをチェックするには、次のように書きます:

function isLetter(character) {
  return character >= 'a' && character <= 'z';
}

if (Array.prototype.every.call(str, isLetter)) {
  console.log("The string '" + str + "' contains only letters!");
}

この記法は、どちらかというと無駄であるため、JavaScript 1.6 で汎用的な簡易表記が導入されました:

if (Array.every(str, isLetter)) {
  console.log("The string '" + str + "' contains only letters!");
}

ジェネリックメソッドString でも使用できます。

これらは現在 ECMAScript 標準に含まれていませんし、Gecko以外のブラウザではサポートされていません。標準による代替手段としては、Array.from() を使って正規の配列に変換することです。と言っても、Array.from() は古いブラウザではサポートされていませんけど。

if (Array.from(str).every(isLetter)) { 
  console.log("The string '" + str + "' contains only letters!"); 
}

配列を生成する

次の例では、空の配列「msgArray」を生成し、msgArray[0]msgArray[99] に値を設定、その後配列の要素数が 100 である事を確認しています。

var msgArray = [];
msgArray[0] = 'Hello';
msgArray[99] = 'world';

if (msgArray.length === 100) {
  console.log("配列の length は 100 です。");
}

2 次元配列を生成する

以下では、文字列の 2 次元配列としてチェスボードを生成しています。 最初の動きは (6,4) の 'P' を (4,4) にコピーすることでなされます。 古い位置 (6,4) は空白にされます。

var board = [ 
  ['R','N','B','Q','K','B','N','R'],
  ['P','P','P','P','P','P','P','P'],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  [' ',' ',' ',' ',' ',' ',' ',' '],
  ['p','p','p','p','p','p','p','p'],
  ['r','n','b','q','k','b','n','r'] ];

console.log(board.join('\n') + '\n\n');

// キングの前のポーンを 2 つ前へ移動
board[4][4] = board[6][4];
board[6][4] = ' ';
console.log(board.join('\n'));

出力を以下に示します:

R,N,B,Q,K,B,N,R
P,P,P,P,P,P,P,P
 , , , , , , , 
 , , , , , , , 
 , , , , , , , 
 , , , , , , , 
p,p,p,p,p,p,p,p
r,n,b,q,k,b,n,r

R,N,B,Q,K,B,N,R
P,P,P,P,P,P,P,P
 , , , , , , , 
 , , , , , , , 
 , , , ,p, , , 
 , , , , , , , 
p,p,p,p, ,p,p,p
r,n,b,q,k,b,n,r

Using an array to tabulate a set of values

values = [];
for (var x = 0; x < 10; x++){
 values.push([
  2 ** x,
  2 * x ** 2
 ])
};
console.table(values)

Results in

0	1	0
1	2	2
2	4	8
3	8	18
4	16	32
5	32	50
6	64	72
7	128	98
8	256	128
9	512	162

(First column is the (index))

仕様

仕様 策定状況 コメント
ECMAScript 1st Edition (ECMA-262) 標準 Initial definition.
ECMAScript 5.1 (ECMA-262)
Array の定義
標準 新メソッド追加: Array.isArray, indexOf, lastIndexOf, every, some, forEach, map, filter, reduce, reduceRight
ECMAScript 2015 (6th Edition, ECMA-262)
Array の定義
標準 新メソッド追加: Array.from, Array.of, find, findIndex, fill, copyWithin
ECMAScript 2016 (ECMA-262)
Array の定義
標準 新メソッド追加: Array.prototype.includes()

Browser compatibility

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 あり あり1 あり あり あり
concat1 あり15.5 あり あり
copyWithin451232 なし329
entries38 あり28 なし258
every あり あり1.59 あり あり
fill45 あり31 なし あり8
filter あり あり1.59 あり あり
find45 あり25 なし328
findIndex45 あり25 なし328
flatten なし なし なし1 なし なし なし
flatMap なし なし なし1 なし なし なし
forEach あり あり1.59 あり あり
from45 あり32 なし あり9
includes471443 なし349
indexOf あり あり1.59 あり あり
isArray5 あり4910.55
join1 あり15.5 あり あり
keys38 あり28 なし258
lastIndexOf あり あり1.59 あり あり
length あり あり1 あり あり あり
map あり あり1.59 あり あり
observe36 — 52 なし なし なし なし なし
of45 あり25 なし あり9
pop1 あり15.5 あり あり
prototype あり あり1 あり あり あり
push1 あり15.5 あり あり
reduce あり あり3910.54
reduceRight あり あり3910.54
reverse1 あり15.5 あり あり
shift1 あり15.5 あり あり
slice1 あり1 あり あり あり
some あり あり1.59 あり あり
sort1 あり15.5 あり あり
splice1 あり15.5 あり あり
toLocaleString あり あり1 あり あり あり
toSource なし なし1 なし なし なし
toString あり あり1 あり あり あり
unobserve36 — 52 なし なし なし なし なし
unshift1 あり15.5 あり あり
values66 あり60 なし539
@@iterator38 ?

36

27 — 362 3

17 — 274 5

なし25 あり
@@species ? ?48 ? ? ?
@@unscopables ? ?48 ? ? ?
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり4 あり あり あり
concat あり あり あり4 あり あり あり
copyWithin あり あり あり32 あり あり あり
entries あり あり あり28 あり8 あり
every あり あり あり4 あり あり あり
fill あり あり あり31 あり8 あり
filter あり あり あり4 あり あり あり
find あり あり あり4 あり8 あり
findIndex あり あり あり4 あり8 あり
flatten なし なし なし なし1 なし なし なし
flatMap なし なし なし なし1 なし なし なし
forEach あり あり あり4 あり あり あり
from ? あり あり32 あり あり あり
includes あり あり1443349 あり
indexOf あり あり あり4 あり あり あり
isArray あり あり あり4 あり あり あり
join あり あり あり4 あり あり あり
keys あり あり あり28 あり8 あり
lastIndexOf あり あり あり4 あり あり あり
length あり あり あり4 あり あり あり
map あり あり あり4 あり あり あり
observe なし なし なし なし なし なし なし
of あり39 あり25 あり あり4.0
pop あり あり あり4 あり あり あり
prototype あり あり あり4 あり あり あり
push あり あり あり4 あり あり あり
reduce あり あり あり4 あり あり あり
reduceRight あり あり あり4 あり あり あり
reverse あり あり あり4 あり あり あり
shift あり あり あり4 あり あり あり
slice あり あり あり4 あり あり あり
some あり あり あり4 あり あり あり
sort あり あり あり4 あり あり あり
splice あり あり あり4 あり あり あり
toLocaleString あり あり あり4 あり あり あり
toSource なし なし なし4 なし なし なし
toString あり あり あり4 あり あり あり
unobserve なし なし なし なし なし なし なし
unshift あり あり あり4 あり あり あり
values6666 あり60539 なし
@@iterator あり あり ?

36

27 — 362 3

17 — 274 5

あり あり あり
@@species ? ? ?48 ? ? ?
@@unscopables ? ? ?48 ? ? ?

1. Available in Firefox Nightly only. See bug 1435813 for status on enabling this by default.

2. A placeholder property named @@iterator is used.

3. Supported as @@iterator.

4. A placeholder property named iterator is used.

5. Supported as iterator.

関連情報

ドキュメントのタグと貢献者

 最終更新者: woodmix,