こんにちは!フロントエンドの現場へようこそ。
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` という「強力なレンズ」を使えば、どんなデータも隠し通すことはできません。
この知識が、あなたのコードをより堅牢に、そしてあなた自身を少しだけ楽にすることを願っています。困ったときはいつでも、またここへ戻ってきてくださいね。応援しています!

コメント