前提
以前、javascriptの条件式で配列の中身が空であることを表現しようとして以下のように記述した
// ❌良くない例
if (!(array == []))
「同じミスをするプログラマが多い」とは思えないほど初歩的な話なんだと思うが、上記がダメなコードである理由まで説明できるだろうか?
原因を調べると、基礎的であり、だからこそ重要そうな配列の仕組みについて学ぶことができたので、興味があれば読んでみてほしい。
ちなみに、同じ要件で最も無難な方法は下記である。
あなたが初学者である場合、パターンとして覚えておくと役に立つだろう。
if (array.length > 0)
配列の比較でarray == []が上手くいかない理由
結論からいうと、配列の比較は「中身」ではなく「参照」によって行われるからである。
[] === [] // false (同じ空配列でも別物)
const a = [];
const b = a;
a === b // true (同じ配列を参照してるから)
array == []は、arrayが左辺の空配列とドンピシャで同じ参照かを判定するだけで、中身がどうとかは関係ない。array値が入っていても参照が同じならtrueを返す。
理解できただろうか?
”参照”という言葉にピンとこない人のために、以下で説明する。
javascriptの参照型について
javascriptのデータには大きく分けて値型と参照型がある
値型:変数にデータそのものが入ってる(number,string,boolean,nullなど)
参照型:データの実体メモリ上にあり、変数がその場所をさしている型のこと
(オブジェクト、配列、関数など)
つまり参照とはアドレスのようなものである。参照型の変数は中身のデータを持っているのでは無く、メモリの場所を持っている。
比較演算子はメモリの場所(住所)を考えるので、配列の中身がどうなっていても関係ない。
参照型について理解できたら、改めてさっきの条件式について読み直してみるといいだろう。
最後に
いかがだっただろうか?
初歩的なミス、基礎的な知識であると思うが、体験を通してだったからこそ筆者はまた一つの成長を感じている。技術書を読むのもやった感があって好きなんだけど、結局手を動かして原因を突き止める作業が一番伸びるんだと思います。
それではまた。