JavaScriptのDateを加減算した時の処理の流れ

このページは、JavaScriptのDateを加減算した時の処理の流れをECMAScriptの仕様書を参考にまとめたページです。

加算 (文字列になる)
const v1 = new Date(2021, 0, 1) + 0; // Fri Jan 01 2021 00:00:00 GMT+0900 (日本標準時)0
減算 (数値になる)
const v2 = new Date(2021, 0, 1) - 0; // 1609426800000

処理のおおまかな流れ

加算の場合

  1. 13.8.1 The Addition Operator ( + )からEvaluateStringOrNumericBinaryExpression(Dateオブジェクト, +, 数値)が呼ばれる
    1. ApplyStringOrNumericBinaryOperator(Dateオブジェクト, +, 数値)が呼ばれる
      1. ToPrimitive(Dateオブジェクト)stringヒントで呼ばれる (1-a. / 1.のIf opText is +, then経由でDateの文字列値が返る) ※
      2. ToPrimitive(数値)defaultヒントで呼ばれる (1-b.)
      3. 上記2つの値が文字列連結される (1-c. If Type(lprim) is String or Type(rprim) is String経由)

※ ヒントはNOTE 1に下記のように記載がある

No hint is provided in the calls to ToPrimitive in steps 1.a and 1.b. All standard objects except Dates handle the absence of a hint as if number were given; Dates handle the absence of a hint as if string were given. Exotic objects may handle the absence of a hint in some other manner.

(意訳) 手順 1.a および 1.b のToPrimitiveの呼び出しにはヒントはありません。Dateを除くすべての標準オブジェクトは、numberが指定されているかのようにヒントの欠如を処理します。Dateは、stringが指定されているかのようにヒントの欠如を処理します。 Exoticオブジェクトは、他の方法でヒントの欠如を処理する場合があります。

ECMAScript® 2023 Language Specification 13.15.3 ApplyStringOrNumericBinaryOperator ( lval, opText, rval )

減算の場合

  1. 13.8.2 The Subtraction Operator ( - )からEvaluateStringOrNumericBinaryExpression(Dateオブジェクト, -, 数値)が呼ばれる
    1. ApplyStringOrNumericBinaryOperator(Dateオブジェクト, -, 数値)が呼ばれる
      1. ToNumeric(Dateオブジェクト)が呼ばれる (3. Dateの数値が返る)
      2. ToNumeric(数値)が呼ばれる (4.)
      3. 上記2つの値がNumber::subtractで数値として減算される (7.)