Date比較を20年間勘違していたことをclaude から教えてもらった話

に公開

Date比較を20年間勘違いしていたことをClaudeから教えてもらった話

JavaScriptをやっていて、これだけはずっと書いている、というコードの一つに「Dateの比較」があります。

const d1 = new Date('2025-07-01');
const d2 = new Date('2025-07-02');

if (d1.getTime() < d2.getTime()) {
  console.log('d1 は d2 より前の日付');
}

今までずっと、こうしないと比較できないと思っていたんですよね。

しかし先日、一人でテストしていたら、こんなことを書いてしまった。

if (d1 < d2) {
  console.log('d1 は d2 より前');
}

そして、それで普通に動いたんですよ。しかも正しく。

「え、何これ。何で動いてるの」と思って調べたら、『valueOf() が自動で呼ばれる』らしいと。

そんなの聞いてない

本気で「こんな動作、いつ追加されたんだろう」って思ったんですが、まさかの「1997年ECMAScript1の時点で入ってました」に知見。

ToPrimitive の説明を読むと、「比較をする前に valueOf が呼ばれる」とはっきり書いてある。

そのため、こんなコードもOK。

const a = new Date('2025-01-01');
const b = new Date('2025-01-02');

console.log(a < b); // true

じゃあなんで getTime() 書いてたの?

これは簡単で、「そう書くもんだと思ってた」から。

多くの説明記事も、ブログも、公式ドキュメントも、getTime() を使って比較していることが多い。

たぶん、明示的なほうがわかりやすいって理由もあったんだと思う。

後輩にどう説明しよう

こんなとき、大事なのは「不完全なコードでも正しく動いてしまうことがある」ことを知らせることだと思ってます。

もちろん、誤解したこと自体を簡単に説明してから、「valueOf() は比較や評価で自動的に呼ばれる」ってことを教えてあげれば十分。

まとめ

  • Date の valueOf() は、初期ECMAScriptから自動呼び出される要素
  • a < b などの比較で、不気味なく valueOf() が呼ばれる
  • 一要あるけど getTime() 書くことは悪くない
  • 動いてるからといって理解してるわけじゃない例

「ある日のテストで知った」ことを、ある学びに変えることは絶対に不覚ではない。

しかし、「この誤解、このテンプレ」、だいぶ同じ動機の人々いるんじゃないでしょうか。

Discussion