【入門編】 Dateオブジェクトの型判定 – JavaScript実践ガイド

こんにちは!フロントエンドの現場へようこそ。
JavaScriptの世界に足を踏み入れると、誰もが一度は「あれ、このデータ、いったい何者なの?」という壁にぶつかります。特に「日付(Date)」を扱うときに、その壁は少しだけ高く感じられるかもしれません。

今日は、そんな「Dateオブジェクトの正体を見極める方法」について、肩の力を抜いて一緒に紐解いていきましょう。大丈夫、仕組みさえ分かれば、もう怖くありませんよ。

—

JavaScriptにとっての「Date」って何者?

まず、イメージしてみてください。あなたは文房具屋さんで、ノートやペンを買うとします。「ノート」という名前の商品なら、レジでスキャンすればすぐに分かりますよね。

JavaScriptの世界でも同じです。「これは数字(Number)ですよ」「これは文字(String)ですよ」と名札がついているものは分かりやすいのですが、Date(日付)はちょっと厄介な「お道具箱」のようなものなんです。

`new Date()` と書くと、その瞬間、JavaScriptの中に「日付という情報を詰め込んだ特殊なオブジェクト」がポンと生成されます。しかし、困ったことに、JavaScriptの性格として、このオブジェクトを「ただのオブジェクト」としか認識してくれないことがよくあるんです。

まず試すのは `instanceof` という「血統書」チェック

一番直感的に使えるのが `instanceof` です。これは、「あなたはDateという血統書を持っていますか?」と確認する方法です。

const today = new Date();

// 「あなたはDateから生まれた子ですか?」という確認
if (today instanceof Date) {
console.log(“はい、正真正銘の日付オブジェクトです!”);
} else {
console.log(“残念、違いますね……”);
}

これはすごく分かりやすくて、初学者のうちはこれで十分です。しかし、実は現場のベテランたちがこれに少し慎重になる理由があります。

なぜ「血統書」だけでは不安なのか?

実はJavaScriptには、異なる「窓口(iframe)」をまたいでデータを受け渡すという、ちょっと特殊な環境があります。違う窓口で生まれたDateオブジェクトは、こちらの窓口から見ると「あれ? 血統書の種類が違う?」と勘違いして、`instanceof` が `false` を返してしまうことがあるんです。

「同じDateなのに、偽物扱いされる」……これ、現場ではよくある悲しいすれ違いなんです。

究極の判定術: `Object.prototype.toString.call`

そこで登場するのが、少し呪文のように見えるこちらの書き方です。これを覚えれば、あなたはもうJavaScriptのデータ判定マスターです。

const date = new Date();

// どんなデータでも、「身分証明書」を無理やり出させる方法
const type = Object.prototype.toString.call(date);

console.log(type); // 表示は “[object Date]” となります

この呪文のイメージ

これは、「相手がどんな血統書を持っていようが、中身を直接調べてラベルを貼り直す」という強力な手法です。
`Object.prototype.toString.call(val)` と書くことで、「このデータ、本来の正体は一体何だい?」と、JavaScriptの深層心理に直接問いかけているようなイメージですね。

これなら、窓口をまたいでも、どんな状況であっても確実に `[object Date]` という正しいラベルを返してくれます。

—

現場で使うなら、こう書く!

実務では、以下のように「日付かどうかを判定する関数」をひとつ作っておくと、コードがとても読みやすくなりますよ。

/

  • 渡された値が「日付オブジェクト」かどうかを判定する

/
function isDate(val) {
// 1. まず「オブジェクトであること」を確認
// 2. 「toString」の結果が “[object Date]” であるかを確認
return Object.prototype.toString.call(val) === ‘[object Date]’;
}

const myDate = new Date();
const notDate = “2023-10-27”;

console.log(isDate(myDate)); // true
console.log(isDate(notDate)); // false

最後に:つまずいても大丈夫

プロの現場でも、最初は「あれ? これDate型で取れてるはずなのに判定が効かないな?」と首をかしげることは日常茶飯事です。

そんなときは、「JavaScriptは少しだけおっちょこちょいなところがあるんだな」と思ってあげてください。`instanceof` でダメなら、今日紹介した `Object.prototype.toString.call` という「強力なレンズ」を使えば、どんなデータも隠し通すことはできません。

この知識が、あなたのコードをより堅牢に、そしてあなた自身を少しだけ楽にすることを願っています。困ったときはいつでも、またここへ戻ってきてくださいね。応援しています!

コメント

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