リテラル
[]
[1,2,3]
["a",{},[1,2]]
コンストラクタを呼び出す
Array()
new Array()
// この使い方についてはすでに紹介した(Arrayでは上記どちらも同じ)
Array(3) // => [ <3 empty items> ]
// 数字を1つだけ渡すとサイズだと解釈される
Array.of(3) // => [3] // これだとデータとして受理される
他のデータから変換(1)
一部の(Iterableな)型は、変換のためのメソッドを持っていて、 結果は配列になる。
"abc".split('')
他のデータから変換(2):
Array.from(”abc")
前項よりも適用範囲が広く、 変換のためのメソッドを持っていないデータ型でも、 反復可能なオブジェクトなら変換が可能 (単純に length属性を持っていれば変換はできる)。
Array.from({length:5})
ブラウザ上の処理系では、たとえば HTMLCollection(getELementsBy…系列の関数が値として返す)、 NodeList(querySelectorAll が値として返す)などもその対象となる。
Rubyの(様々なデータ型から呼び出す)to_a に近いものだが、 JSの Array.fromはさらに応用範囲が広い(詳しくはドキュメントを参照)。
[...Array(n).keys()]
で代用した)を生成する関数の例が上記ドキュメントにある のでここに(function を使った記法に変換して)引用しておく。function range(start, stop, step=1) {
return Array.from({ length: (stop - start) / step + 1},
(_, i) => start + (i * step));
}
スプレッド構文:
これも変換の方法の1つとも言えるだろう。
[..."abc"] // => ['a', 'b', 'c']
Array([1,2,3]) // => [ [1,2,3] ]
Array(...[1,2,3]) // => [1,2,3] // Array(1,2,3)と同じ
// これは関数に渡す引数列として配列を展開させた例
ジェネレータ(ここは高度な話)
Array.from((function*(){for(let i = 0; i < 5; i++) yield i})())
// => [0,1,2,3,4]
// または
function* x() {for(let i = 0; i < 5; i++) yield i}
Array.from(x()) // => [0,1,2,3,4]
すでに見てきたように、Array(10)
で作った配列は初期化されておらず、 次節で扱う高階メソッドも呼び出せない。
Array(10).fill(1)
で、値を充填することができる。 ただし配列の全要素が同じ値になる (一部分にだけ値を入れるという .fill の使い方もあるが)。
配列の各要素に個別の値を入れるためには、map メソッドを使うことになる。 以下はサイコロと同等の1~6の乱数が並ぶ乱数列を発生させるコード。
Array(10).fill().map(()=>1+Math.random()*6<<0)
伝統的な言語では代入文(または代入式)の左辺に置けるもの(左辺値、つまり代入先)として、 変数名、または配列に添え字を指定したもの、に限定されていたが、
昨今の言語ではそれよりも広く代入先を指定できるものが多く、 JSでも1つの代入式で同時に複数の代入が可能になっている。
[a,b,c]=[1,2,3] // 右辺に配列の形で変数名(などの代入先)を指定
// => [1,2,3]
a // => 1 // このように各変数に対応する場所の値が収められる
b // => 2
c // => 3
[[a,b,c],d,e]=[[1,2,3],4,5] // こういう複雑な構造でも、
// => [ [ 1, 2, 3 ], 4, 5 ] // 対応する形でなら代入できる
typeof []
が 'object'{.language-javascript}
を返すことからわかるように、配列はオブジェクトとして実現されている。 ブラウザのコンソールに配列リテラルを入力した時の出力(右図)からも配列の実体が推察できるが、0, 1, 2, … と length という属性を持つオブジェクトであることがわかる。最後の要素を取り出す:
Rubyでは a[-1]
が使えるが、JSでは負の数を添字として指定すると undefined
となる。
JSで素直に記述するなら a[a.length-1]
という書き方になる。このまだるっこさについては ネットでも言及されていて、 a.slice(-1)[0]
という書き方も提示されている。
ブラケットに添え字を書く記法では負数は扱っていないが、slice メソッドでは負数が使える、など JSの(徐々に充実されてきた歴史的経緯をひきずっている)一貫性のなさは見てとれる。
配列の連結:
RubyやPythonでは、演算子 +
で配列やリストを連結でき、これは直感的にも理解しやすい。
が、JSの場合、+
で配列を連結しようとすると、(多くの人には)予想外の動作をする (こういった落とし穴が時々あるので注意されたい)。
JSでたとえば [1,2,3]+[4,5]
を評価すると、‘1,2,34,5’ という文字列を返す。これは それぞれの配列についてメソッド join()
が内部的に呼ばれ、 引数なしの join のデフォルト動作として ‘,’ を区切り文字として連結して Stringが生成され、そのString同士を +
で連結したもの。
ちなみに上記の例で配列を連結させるためには、[1,2,3].concat([4,5])
と書くことになる。