配列リテラル
配列リテラルとは、要は複数のデータの集まりのこと。
let list : string[] = ['BELOVED', 'SOUL LOVE', '誘惑'];
実はそんなに今までと何かが変わるわけじゃないことが分かる。
自由に出し入れできるか
どんな名前か
:
どんな型か
配列か
これを定義しているだけ。
変数を定義するときはこの情報が必要なんだから、順番は分からずとも、どこかにこのパーツのいずれかがはいることが分かる。
応用!ユニオン型
型を定義する箇所がある。
ということはそこは自在に型を定義できる。
そう、ユニオン型だ。
let list : (string | boolean) = [true,'サウンドスケープ','DREAM SOLISTER' ];
こんな形で「この型かこの型ね」というのを配列に定義できる。
応用!列挙型
列挙型とはなにか。
そう、定数をまとめて定義できるというアレ。
そんなもん、配列使えばいいじゃないか!とずっと思っていたあれ。
あれって、ただの定数まとめじゃなくて、そういう「型」を作ってるんじゃないか?
と思った。で、実行してみたら行けた。
enum Metalgear {
sneak = 'スネーク',
fox = 'サイボーグ忍者',
kazu = 'カズ',
}
let list3: Metalgear[] = [Metalgear.fox,];
console.log(list3);
配列の別の定義の仕方
あるんかい!
let list: Array<stirng> = [x, y, z];
// これと同じ(xyzには文字列が入ってるとして・・・)
let list: string[] = [x, y, z]
readonly
読んで字のごとく、読み取り専用。
これを書いた配列は読み取りしかできなくなる。
変数に代入したり、何かを追加したりができなくなる
let list : readonly string[]
配列の分割代入
配列の要素のうち、特定のいくつかをある変数に入れたり、配列に入れたりできる。
let soldier:Array<string> = [
'ビッグボス',
'オセロット',
'和平',
]
let list[x,y] = soldier;
//結果は[ビッグボス、オセロット]
別の配列にある配列を入れようとすると、前から要素の数だけ順番に入れる。
let [,,z] = soldier
console.log(z) // zに三つ目の値がはいる
//こうやると前のふたつをスキップして三つ目だけ入れるよ、みたいなことができる
//注意すべきはletのあとに変数名が来ないこと。
スプレッド構文
配列の中身をおっぴろげる。=スプレッド
中身を全部展開して代入する
let list = [...x]
let soldier:string[] = [
'ビッグボス',
'オセロット',
'和平',
];
let x =[...soldier]
// xの中身は
[
'ビッグボス',
'オセロット',
'和平',
];
いや、ちょっと待って
冷静に考えてこれなんの意味あるの?
と思った人はセンスある。
これは配列のコピーに使う。
いや、それは
let soldier: string [] = [
'ビッグボス',
'オセロット',
'和平',
];
let listcopy = soldier;
ってやればいいじゃんと思うはず。
でもこれはすごく危険。なぜならこれは参照渡しで、コピーじゃないから。
配列はオブジェクトである。
オブジェクトの代入は参照渡しである。
参照渡しとは、同じ場所にあるものを色んな所から参照すること。
だからある個所から、その本体にあくせすして値を書き換えると、それを参照している箇所すべてが変更される。
だから迂闊にはやれない。やっちゃいけないわけじゃない。
そんなときに参照じゃなくて、コピーがしたい、ってなるはず。
let list:string[] = [...soldier]
ちなみに配列をふたつくっつけるとかもできる.これはいい!
[...soldier...soldier]
繰り返して配列の中身全部出してみた
for of という最高の文がある
let soldier: string [] = [
'ビッグボス',
'オセロット',
'和平',
];
for (let soldier of soldiers) {
console.log(soldier);
}
ofの前後がどっちだけ?ってなりそうだが
私はone of themで覚えた。
一部 of 全体
ってかんじ。
大事なのはlet を oneの方に付けること。
oneはここで初めて定義する変数なので、変数宣言をする必要がある。
他にも繰り返しの方法としてはArrayオブジェクトのメソッド、forEachとかがある。
が、for ofがあれば使わない気がするので割愛。
長いし。
ちなみに、breakで処理を終了できる
for (let soldier of soldiers) {
console.log(soldier);
if (soldier === 'オセロット') {
// オセロットなら処理を終了
break;
}
}