typeof 演算子と Date.prototype.isDate メソッドを使って日付オブジェクトかどうかを確認する
JavaScript でオブジェクトが日付かどうかを確認する方法
instanceof 演算子を使う
最もシンプルで分かりやすい方法が、instanceof
演算子を使うことです。これは、オブジェクトが特定のクラスのインスタンスかどうかを確認する演算子です。
const obj = new Date();
console.log(obj instanceof Date); // true
この例では、obj
が Date
クラスのインスタンスであるため、true
が出力されます。
typeof 演算子と Date.prototype.isDate メソッドを使う
typeof
演算子でオブジェクトの型を確認し、それが 'date'
であるかどうかを確認する方法もあります。ただし、これは厳密なチェックとは言えません。なぜなら、JavaScript では、new Date()
以外にも Date.parse()
などで日付オブジェクトを作成できるためです。
より厳密なチェックを行うには、Date.prototype.isDate
メソッドを使うことができます。このメソッドは、引数として渡されたオブジェクトが有効な日付オブジェクトかどうかを返します。
const obj1 = new Date();
const obj2 = '2024-04-15';
console.log(typeof obj1 === 'date'); // true
console.log(obj1.isDate()); // true
console.log(typeof obj2 === 'date'); // false
console.log(obj2.isDate()); // false
この例では、obj1
は Date
クラスのインスタンスなので、typeof
演算子と isDate
メソッドの両方で true
が返されます。一方、obj2
は文字列なので、typeof
演算子では 'string'
となり、isDate
メソッドでは false
が返されます。
isNaN
関数は、数値かどうかを判定する関数です。JavaScript では、日付オブジェクトも内部的には数値として扱われるため、isNaN
関数を使って日付かどうかを確認することができます。
ただし、この方法も厳密なチェックとは言えません。なぜなら、NaN
自体も有効な日付オブジェクトとして扱われるためです。
const obj1 = new Date();
const obj2 = NaN;
console.log(isNaN(obj1)); // false
console.log(isNaN(obj2)); // true
この例では、obj1
は有効な日付オブジェクトなので、false
が返されます。一方、obj2
は NaN
なので、true
が返されます。
まとめ
オブジェクトが日付かどうかを確認するには、以下の方法があります。
instanceof
演算子を使う:最もシンプルで分かりやすい方法isNaN
関数を使う:簡易的なチェック
それぞれの方法の特徴と使い分けを理解し、状況に応じて適切な方法を選択してください。
補足
- 上記以外にも、ライブラリなどを利用して日付かどうかを判定する方法もあります。
- 厳密なチェックが必要な場合は、
Date.prototype.isDate
メソッドを使うことをおすすめします。
const obj = new Date();
if (obj instanceof Date) {
console.log('obj は日付オブジェクトです');
} else {
console.log('obj は日付オブジェクトではありません');
}
const obj1 = new Date();
const obj2 = '2024-04-15';
if (typeof obj1 === 'date' && obj1.isDate()) {
console.log('obj1 は日付オブジェクトです');
} else {
console.log('obj1 は日付オブジェクトではありません');
}
if (typeof obj2 === 'date' && obj2.isDate()) {
console.log('obj2 は日付オブジェクトです');
} else {
console.log('obj2 は日付オブジェクトではありません');
}
isNaN 関数を使う
const obj1 = new Date();
const obj2 = NaN;
if (!isNaN(obj1)) {
console.log('obj1 は日付オブジェクトです');
} else {
console.log('obj1 は日付オブジェクトではありません');
}
if (!isNaN(obj2)) {
console.log('obj2 は日付オブジェクトです');
} else {
console.log('obj2 は日付オブジェクトではありません');
}
ライブラリを使う
Moment.js などのライブラリを使うと、より詳細な日付操作や判定を行うことができます。
const moment = require('moment');
const obj1 = new Date();
const obj2 = '2024-04-15';
if (moment.isDate(obj1)) {
console.log('obj1 は日付オブジェクトです');
} else {
console.log('obj1 は日付オブジェクトではありません');
}
if (moment.isDate(obj2)) {
console.log('obj2 は日付オブジェクトです');
} else {
console.log('obj2 は日付オブジェクトではありません');
}
JavaScript でオブジェクトが日付かどうかを確認するその他の方法
Object.prototype.toString.call()
メソッドは、オブジェクトの型を表す文字列を返します。日付オブジェクトの場合は、'[object Date]'
という文字列が返されます。
const obj = new Date();
console.log(Object.prototype.toString.call(obj)); // '[object Date]'
try...catch
ブロックを使って、Date
コンストラクタでオブジェクトを生成できるかどうかを確認する方法もあります。
const obj = new Date();
try {
new Date(obj);
console.log('obj は日付オブジェクトです');
} catch (error) {
console.log('obj は日付オブジェクトではありません');
}
正規表現を使って、日付を表す形式かどうかを確認する方法もあります。ただし、この方法は厳密なチェックとは言えません。
const obj1 = new Date();
const obj2 = '2024-04-15';
const regex = /^(?:\d{4})-?(?:(?:0[1-9])|(?:1[0-2]))-?(?:(?:[0-2][0-9])|(?:3[0-1]))(?:T(?:[0-2][0-9]):(?:[0-5][0-9]):(?:[0-5][0-9])(?:\.[0-9]{1,3})?)?(Z|((?:[-+])(?:[0-1][0-9]):?[0-5][0-9]))?$/;
console.log(regex.test(obj1.toString())); // true
console.log(regex.test(obj2)); // true
これらの方法は、上記で紹介した方法よりも汎用性が高いかもしれませんが、状況によっては適切ではない場合があります。
注意事項
- いずれの方法を使う場合も、オブジェクトが確実に日付オブジェクトであることを保証するものではありません。
javascript date