こんにちは!フロントエンドの現場を渡り歩いてきたチーフアーキテクトの私です。
JavaScriptの勉強をしていると、「あれ?これってどうやって判定するんだっけ?」と頭を抱えたくなる瞬間、ありますよね。特に「配列(Array)」の判定は、JavaScriptの歴史的なちょっとした「バグ(愛嬌?)」もあり、初心者だけでなく中級者でもうっかりハマる罠が潜んでいます。
今回は、そんな配列の判定で私たちが頼るべき唯一無二の救世主、`Array.isArray()` について、現場のリアルな視点も交えながら、優しく紐解いていきましょう。
つまずきやすいポイントも「大丈夫ですよ、みんな最初はここでハマりますから!」とそっとフォローしながら進めるので、リラックスして読んでくださいね。
—
1. なぜ配列の判定はめんどくさいのか?(お茶の間感覚の例え話)
JavaScriptの世界では、データに「型」という種類があります。文字列や数値、そして複数のデータをまとめて入れられる「配列」などですね。
ここで、身近な例えをしてみましょう。
あなたは今、大きなお弁当箱(配列)と、仕切りのないお皿(普通のオブジェクト)を持っています。
パッと見では「どっちも中にいろいろ入ってるな」とわかりますが、JavaScriptくんに「これ、お弁当箱(配列)?」と聞いたとき、彼がうっかり「うーん、ただの平らなお皿(オブジェクト)ですね!」と勘違いすることがあるんです。
伝統的な `typeof` の裏切り
JavaScriptを少し触ったことがある方なら、`typeof` という演算子を見たことがあるかもしれません。
「これの正体は何?」と調べるための便利な道具なのですが……実は、配列に対して使うと、とんでもない嘘をつきます。
// 果物が入った配列を用意します
const fruits = [‘りんご’, ‘みかん’, ‘バナナ’];
// JavaScriptくんに「typeof」で聞いてみる
console.log(typeof fruits); // 結果はなんと “object” ……えっ?
……「オブジェクト」!? いやいや、あなた、配列(Array)でしょ!とツッコミを入れたくなりますよね。
そう、JavaScriptの歴史的背景から、配列の `typeof` は “object” を返すという仕様(というかバグの引き継ぎ)になっているのです。これじゃあ「配列かどうか」を正確に判定できませんよね。困ったものです。
—
2. そこで登場するのが `Array.isArray()` という正義のヒーロー
先輩たちが長年頭を悩ませてきたこの問題に、JavaScriptの仕様(ES5)がようやく決定打を出してくれました。それが今回主役の `Array.isArray()` です。
使い方はとってもシンプル。調べたいデータをかっこ `( )` の中に入力するだけです。
const fruits = [‘りんご’, ‘みかん’, ‘バナナ’];
const user = { name: ‘山田’, age: 28 };
// Array.isArrayさんに聞いてみる
console.log(Array.isArray(fruits)); // true (配列だよ!)
console.log(Array.isArray(user)); // false (配列じゃないよ、ただのオブジェクトだよ!)
おぉ、すばらしい! `true` と `false` でハッキリと答えてくれます。これなら迷いようがありませんよね。
—
3. なぜ `Array.isArray` を使わなきゃいけないの?(iframeの深い闇)
「実は昔から `instanceof Array` っていう別の判定方法もあるよ?」と知っているそこのあなた。なかなかのJavaScript通ですね!
確かに `fruits instanceof Array` でも配列判定はできます。普段の小さなアプリなら、それでも大きな問題は起きません。
しかし、Web制作の現場で少し複雑なことをやり始めると、この `instanceof` が突然裏切る瞬間がやってきます。それが「異なる実行コンテキスト(iframeなど)」を跨ぐときです。
iframeってなに?
Webページの中に、別のWebページを「窓」のように埋め込む仕組みのことです。YouTubeの動画埋め込みなどをイメージしてもらうと分かりやすいかもしれません。
この「メインのページ」と「埋め込まれたiframeのページ」は、見た目は同じJavaScriptの世界にいても、実は頭の中の「法律(グローバルオブジェクト)」が少しだけ違います。
例えるなら、日本(メインページ)の法律では「有効な運転免許証」であっても、外国(iframe)に持っていったら「ただのプラスチックのカードですね」と言われてしまうようなイメージです。
そのため、iframeで作られた配列をメインのページに持ってくると、`instanceof Array` は「うーん、うちの国の配列じゃないから違う!」と判定して `false` を返してしまうという、恐怖の現象が起きるのです。
でも、`Array.isArray` なら怖くない!
`Array.isArray()` は、国境(iframeの壁)をヒョイと飛び越えて、「まぎれもなく、これはどこからどう見ても配列だ!」と正確に見抜くことができます。
だからこそ、プロの現場では「配列の判定には迷わず `Array.isArray()` を使おうぜ」と申し合わせているのです。
—
4. 実務で使える!安全なデータチェックのコード例
それでは最後に、実際のWeb開発やアプリ制作の現場でよくある、安心・安全なデータの受け取りチェックのコードを見てみましょう。
APIからサーバー通信でデータを受け取ったとき、「配列が返ってくるはずなのに、なぜかエラーで `null` が返ってきた……!」なんてことは日常茶飯事です。そんなときに備える防衛策のコードです。
/
- サーバーから受け取ったデータを処理する関数
- @param {any} data – 受け取った任意のデータ
/
function handleProductList(data) {
// もしデータが配列でなければ、ここで処理をストップして優しくエラーを防ぐ
if (!Array.isArray(data)) {
console.warn(‘警告: 予期せぬデータ形式が渡されました。配列ではありません。’, data);
return; // 処理を中断
}
// ここに到達したデータは、100%安全な「配列」です!
data.forEach(function(item) {
console.log(‘商品名:’, item.name);
});
}
// 正常なパターン(配列)
const validData = [
{ name: ‘ノートPC’ },
{ name: ‘マウス’ }
];
handleProductList(validData);
// 実行結果: 商品名: ノートPC, 商品名: マウス が正常に表示されます
// 異常なパターン(うっかりオブジェクトが来ちゃった)
const invalidData = { name: ‘お一人様セット’ };
handleProductList(invalidData);
// 実行結果: 警告文が表示され、アプリがクラッシュ(フリーズ)するのを防げます!
このように、あらかじめ `Array.isArray()` でガードを固めておくことで、予期せぬデータによるバグ(「Cannot read properties of undefined」といった絶望的なエラー)から、あなたのWebサイトやアプリをガッチリ守ることができます。
—
まとめ
- 配列の判定には `typeof` ではなく、`Array.isArray()` を使おう!
- `typeof` は配列を `”object”` と答えてしまうので信用しちゃダメ。
- `Array.isArray()` は、iframeなどの特殊な環境を跨いでも正確に配列を見抜ける最強の味方。
- 外部からデータをもらうときは、必ず `Array.isArray()` でガードして安全性を高めよう!
JavaScriptの世界は最初は不思議なルールが多くて驚くかもしれませんが、一つひとつ理由が分かるとぐっと楽しくなります。
もしコードを書いていて「あれ?」と躓いても、あなたが悪いわけではありません。JavaScriptくんが少し不器用なだけです。
「大丈夫、一歩ずつ進んでいきましょう!」
それでは、快適なフロントエンドライフを!チーフアーキテクトの私でした。

コメント