今回はAngularから離れて、私がハマった概念「データ型」について書いてみようと思います。
###「プリミティブ型」と「オブジェクト型」
データ型には「プリミティブ型」と「オブジェクト型」などが存在します。
まずは、具体的なプリミティブ型とオブジェクト型について見てみましょう。
・・・と言ったもののですが、言語によってプリミティブ型とオブジェクト型の分類が変わってきます。
自分が使用している言語で気になる方がいれば調べてみてはいかがでしょうか?
しかし、一つも挙げないのは不親切なので、JavaScriptについて書いてみると
プリミティブ型はNumber,String
オブジェクト型はオブジェクト,連想配列
などが存在します。
オブジェクト型の例が聞いたことないと思った方は記事の最後に書いていますので、ご覧下さい。
ではプリミティブ型と参照型はどのような違いがあるのでしょうか?
イメージしやすいようにオブジェクトの"Obj", Stringの"Str"を使って説明します。
###プリミティブ型について
プリミティブ型は初心者がイメージしやすい、"値"をそのまま保持します。
具体的に見てみると
X = "値渡し";
Str = X;
Strを表示すると
値渡し
と表示されます。
###オブジェクト型について
オブジェクト型はプリミティブ型と違い、参照"場所"を保持します。
具体的に見てみると
Y = {Z: "値渡し"};
Obj = Y;
Obj.Zを表示すると
値渡し
と表示されます。
ここまではプリミティブと同じです、
しかし
Y = {Z: "値渡し"};
Obj = Y;
Y = {Z: "値変更"};
と"Obj"に代入した後に参照先であるY内の値を変更したらどうなるでしょう。
実際にObj.Zを表示すると
値変更
と表示されるはずです。
この、オブジェクト型は参照元の値が変更されると同時に参照先の値を変更されるのが特徴と言えます。
###オブジェクト型の注意点
では参照型でプリミティブ型のように使用したい場合(元の値を変更する)の解決策ですが
コピーしてしまえば解決です。Angularでは
angular.copy(参照したい変数)
と記述すれば参照元の値が変更されても元の値を保持してくれます。
###オブジェクト,連想配列について
初心者の方はオブジェクトや、連想配列についてあまり聞き覚えがないと思いいます。(または、ワード自体は知らないが使っていた)
オブジェクトは実際にコードを書いてみると
{}
で書かれているコードです。
連想配列は実際にコードを書いてみると
{"変数": "値"}
で書かれているコードです。
※連想配列はオブジェクトの一部ですが、頻繁に使用するので例として挙げています。
連想配列が使いこなせるとより複雑なデータを操作することが可能になりますので、知らなかった方はマスターしましょう。