Angular の String はプリミティブ型ということを
最近知ったので、内容をまとめていきます。
2つの型
まず、Angular というか TypeScript には、2つの型があります。以下、Angular で話を進めます。
プリミティブ型は値をそのまま保持している。
オブジェクト型は値の参照先を保持している。
例えるならば、
1.ノート(変数)に貯金額の10万円を記載する=プリミティブ型であり、
2.ノート(変数)に10万円入っている銀行の口座情報を記載する=オブジェクト型のようなイメージ?
もう一度上記を別のノート(変数)に記載したときに、1 はどちらも独立している為、
消しゴムでそれぞれ違う金額に書き直せる。
2は、口座の金額を書き換えると参照先が同じなので、どちらも同じ金額になる。
C#と Angular で勘違いしてた
C#では String 型は参照型(オブジェクト型)であった為、
Angular でも参照型と勘違いしていました。
調べてみると C#の String 型が参照型であることが、イレギュラーな認識?であるというのが多いようです。
というのも、C#の String は値型のように振る舞う参照型なのです。
|
|
上記のようにした時に、変数 b には”あ”が入っている。
値型やんと思ってしまいますよね。
実際には、参照先のアドレスが変数を作成する度に、
新規で作成される為、上記のような動きになるようです。
Angular も裏の動きでは C#と同じように動いているのかなー。
不変性のある型をプリミティブ型という枠として TypeScript では呼んでるのかな。
よくわからん。
なぜ、Angular の String 型を調べたのか
Angular にて input のテキストボックス3つを ngfor で作成しました。
その際に、String の配列で初期値を空で作成した所、
初期入力時に、3つのテキストボックス全てに入力した値が入る事態が発生しました。
(それ以外にも、1文字しか入力できないとか、一つ目に入力した値が2つ目に入るとか)
String の配列ではなく、Object の配列にすることで解消しました。
原因は分からずじまいです。
String 型がプリミティブ型であり、初期値も空で同じであった為、
コントロールに相違がなく、全て同じコントロールとみなされていたのでしょうか。
Object にすることで、参照先がそれぞれ変わる為、別の値とみなされて解決したのか?という感じです。
いやーわからん。