⏰
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