【入門編】 Array.isArray と instanceof Array の違い – JavaScript実践ガイド

「それ、本当に配列?」――JavaScriptの配列判定で、絶対に知っておくべき「魔法の杖」の話

こんにちは!現場でバリバリとコードを書いていると、「あ、これ配列かな?それともただのオブジェクトかな?」と迷う場面、意外と多いですよね。

JavaScriptを書き始めたばかりの頃、僕も「とりあえず `instanceof Array` を使えばいいんでしょ?」なんて思っていました。でも、ある日突然、とんでもないバグに遭遇したんです。

今日は、そんな「なぜか配列として判定してくれない!」という現場の悲劇を未然に防ぐための、大切な知恵をシェアしますね。

—

1. なぜ `instanceof` は「裏切り者」なのか?

まずは、よくある判定方法 `instanceof Array` から見ていきましょう。
これは「この変数は、Array(配列)という設計図から作られたものですか?」と尋ねるコードです。

const fruits = [‘りんご’, ‘みかん’];

// これだと「true」が返ってきます。ここまでは順調です。
console.log(fruits instanceof Array); // true

一見、これで完璧に見えますよね。でも、「iframe(アイフレーム)」という、別の部屋にいる相手が絡むと、この信頼関係は一気に崩れます。

想像してみてください:別の部屋にある「設計図」

JavaScriptの世界では、HTMLの中に別のページを埋め込む「iframe」を使うことがあります。

想像してください。あなたは今、自分の部屋で作業しています。

  • 自分の部屋には「配列の設計図」があります。
  • 隣の部屋(iframe)にも「配列の設計図」があります。

もし隣の部屋から「これ、僕の部屋で作った配列だよ!」と持ち込まれたものを、あなたの部屋の設計図でチェックしても、「え、それ僕の部屋の設計図には載ってないよ?」と言われてしまい、`false` になることがあるんです。

これが、`instanceof` が「裏切り者」と言われる理由です。実行している場所(コンテキスト)が違うと、同じ配列なのに「別物」として扱われてしまうことがあるんですね。

—

2. 救世主 `Array.isArray()` の登場

そこで登場するのが、`Array.isArray()` です。
これは、JavaScript界の「身分証明書チェッカー」のような存在です。

`Array.isArray()` は、相手がどの部屋で作られたものだろうと、「中身を見て、配列としての特徴を持っているなら、問答無用でOK!」と判断してくれます。

実際にコードで比較してみましょう

// 普段はどちらも同じ結果になります
const myList = [1, 2, 3];

console.log(myList instanceof Array); // true
console.log(Array.isArray(myList)); // true

// でも、iframeを使うような特殊な環境では…
// iframe内の配列を受け取ったとき、instanceof は時に失敗しますが、
// Array.isArray(その配列) は、どんな環境から来ても「はい、これは配列です」と答えてくれます。

—

3. なぜ「Array.isArray」が最強なのか?

結論から言うと、「迷ったら `Array.isArray` を使っておけば間違いない」、これに尽きます。

  • 理由1:環境に左右されない

先ほど説明した通り、iframeが絡むような複雑なWebアプリでも、安定して配列を識別してくれます。

  • 理由2:読みやすい

`Array.isArray(variable)` と書くと、「あ、この変数が配列かどうかチェックしてるんだな」と、コードを読んだ瞬間に意図が伝わります。

初学者のあなたへ:ちょっとしたアドバイス

たまに、「typeof で判定しちゃダメなの?」と聞かれることがあります。
でも、`typeof [1, 2, 3]` を試してみてください。結果は `”object”` になります。これだと、普通のオブジェクト(`{}`)と見分けがつかないですよね。

だからこそ、配列を専門にチェックしてくれる `Array.isArray()` は、JavaScriptを書く上での「必須アイテム」なんです。

—

まとめ:今日から「Array.isArray」を使おう!

JavaScriptの現場は、複雑な道具が入り混じる場所です。だからこそ、「どんな状況でも正しく判断してくれる信頼できる道具」を選ぶことが、バグを減らす最短ルートになります。

1. `instanceof Array` は、別の部屋(iframe)の存在を忘れると裏切られる。
2. `Array.isArray()` は、場所を問わず正しく見抜いてくれる魔法の杖。

もし今日、あなたのコードの中に `instanceof Array` があったら、そっと `Array.isArray()` に書き換えてみてください。それだけで、あなたの書くコードの「強さ」と「安心感」が一段階アップしますよ。

プログラミングは時に難しいパズルのようですが、こうやって一つひとつ「確かな知識」を積み上げていけば、必ず最高のエンジニアになれます。大丈夫、一緒に頑張っていきましょう!

コメント

タイトルとURLをコピーしました