Multipage preference

21 数字和日期

21.1 Number 对象

21.1.1 Number 构造器

Number 构造器:

  • %Number%
  • 全局对象"Number" 属性的初始值。
  • 在作为构造器调用时创建并初始化一个新的 Number 对象。
  • 在作为函数而非构造器调用时执行类型转换。
  • 可以用作类定义的 extends 子句的值。意图继承指定 Number 行为的子类构造器必须包含对 Number 构造器的 super 调用,以创建并初始化带有 [[NumberData]] 内部槽的子类实例。

21.1.1.1 Number ( value )

此函数在被调用时执行以下步骤:

  1. 如果 value 存在,则
    1. primitive 为 ? ToNumeric(value)。
    2. 如果 primitive 是 BigInt,则令 n𝔽((primitive))。
    3. 否则,令 nprimitive
  2. 否则,
    1. n+0𝔽
  3. 如果 NewTarget 是 undefined,则返回 n
  4. obj 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] »)。
  5. obj.[[NumberData]] 设置为 n
  6. 返回 obj

21.1.2 Number 构造器的属性

Number 构造器:

21.1.2.1 Number.EPSILON

Number.EPSILON 的值是 1 与可表示为 Number 值的、大于 1 的最小值之间差值大小的 Number 值,约为 2.2204460492503130808472633361816 × 10-16

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.2 Number.isFinite ( number )

此函数在被调用时执行以下步骤:

  1. 如果 number 不是 Number,则返回 false
  2. 如果 number 不是有限的,则返回 false
  3. 返回 true

21.1.2.3 Number.isInteger ( number )

此函数在被调用时执行以下步骤:

  1. 如果 number 是整数 Number,则返回 true
  2. 返回 false

21.1.2.4 Number.isNaN ( number )

此函数在被调用时执行以下步骤:

  1. 如果 number 不是 Number,则返回 false
  2. 如果 numberNaN,则返回 true
  3. 返回 false
Note

此函数不同于全局 isNaN 函数(19.2.3),因为它在确定其实参是否为 NaN 之前,不会把该实参转换为 Number。

21.1.2.5 Number.isSafeInteger ( number )

Note

当且仅当整数 nNumber 值不是任何其他整数的 Number 值时,整数 n 是一个“安全整数”。

此函数在被调用时执行以下步骤:

  1. 如果 number 是整数 Number,则
    1. 如果 abs((number)) ≤ 253 - 1,则返回 true
  2. 返回 false

21.1.2.6 Number.MAX_SAFE_INTEGER

Note

由于 IEEE 754-2019 精度限制所必需的舍入行为,每个大于 Number.MAX_SAFE_INTEGER 的整数的 Number 值都至少与另一个整数共享。因此,这类大数量级整数不是安全的,并且不能保证可以被精确表示为 Number 值,甚至不能保证彼此可区分。例如,90071992547409929007199254740993 都会求值为 Number 值 9007199254740992𝔽

Number.MAX_SAFE_INTEGER 的值是 9007199254740991𝔽𝔽(253 - 1))。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.7 Number.MAX_VALUE

Number.MAX_VALUE 的值是 Number 类型的最大正有限值,约为 1.7976931348623157 × 10308

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.8 Number.MIN_SAFE_INTEGER

Note

由于 IEEE 754-2019 精度限制所必需的舍入行为,每个小于 Number.MIN_SAFE_INTEGER 的整数的 Number 值都至少与另一个整数共享。因此,这类大数量级整数不是安全的,并且不能保证可以被精确表示为 Number 值,甚至不能保证彼此可区分。例如,-9007199254740992-9007199254740993 都会求值为 Number 值 -9007199254740992𝔽

Number.MIN_SAFE_INTEGER 的值是 -9007199254740991𝔽𝔽(-(253 - 1)))。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.9 Number.MIN_VALUE

Number.MIN_VALUE 的值是 Number 类型的最小正值,约为 5 × 10-324

IEEE 754-2019 双精度二进制表示中,最小可能值是非正规化数。如果某个实现不支持非正规化值,则 Number.MIN_VALUE 的值必须是该实现实际可表示的最小非零正值。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.10 Number.NaN

Number.NaN 的值是 NaN

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.11 Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITY 的值是 -∞𝔽

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.12 Number.parseFloat ( string )

"parseFloat" 属性的初始值是 %parseFloat%

21.1.2.13 Number.parseInt ( string, radix )

"parseInt" 属性的初始值是 %parseInt%

21.1.2.14 Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITY 的值是 +∞𝔽

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.2.15 Number.prototype

Number.prototype 的初始值是 Number 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.1.3 Number 原型对象的属性

Number 原型对象

  • %Number.prototype%
  • 普通对象
  • 自身是 Number 对象;它具有一个 [[NumberData]] 内部槽,其值为 +0𝔽
  • 具有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%

除非另有明确说明,下文定义的 Number 原型对象的方法不是泛型的,传给它们的 this 值必须是 Number 值,或是一个具有已初始化为 Number 值[[NumberData]] 内部槽的对象。

在某个方法的规范中,短语“this Number value”指以该方法调用的 this 值作为实参调用抽象操作 ThisNumberValue 所返回的结果。

21.1.3.1 Number.prototype.constructor

Number.prototype.constructor 的初始值是 %Number%

21.1.3.2 Number.prototype.toExponential ( fractionDigits )

此方法返回一个 String,其中包含以十进制指数记号表示的 this Number value,尾数的小数点前有一位数字,小数点后有 fractionDigits 位数字。如果 fractionDigitsundefined,它会包含唯一指定该 Number 所需的尽可能多的尾数数字(类似 ToString,只是这种情况下 Number 总是以指数记号输出)。

它在被调用时执行以下步骤:

  1. number 为 ? ThisNumberValue(this value)。
  2. fractionCount 为 ? ToIntegerOrInfinity(fractionDigits)。
  3. 断言:如果 fractionDigitsundefined,则 fractionCount 是 0。
  4. 如果 number 不是有限的,则返回 Number::toString(number, 10)。
  5. 如果 fractionCount < 0 或 fractionCount > 100,则抛出 RangeError 异常。
  6. number 设置为 (number)。
  7. sign 为空 String。
  8. 如果 number < 0,则
    1. sign 设置为 "-"
    2. number 设置为 -number
  9. 如果 number = 0,则
    1. significand 为由 fractionCount + 1 个码元 0x0030(DIGIT ZERO)组成的 String 值。
    2. exponent 为 0。
  10. 否则,
    1. 如果 fractionDigits 不是 undefined,则
      1. exponentintSignificand 为这样的整数:10fractionCountintSignificand < 10fractionCount + 1,并且 intSignificand × 10exponent - fractionCount - number 尽可能接近零。如果存在两组这样的 exponentintSignificand,则选择使 intSignificand × 10exponent - fractionCount 较大的那组 exponentintSignificand
    2. 否则,
      1. exponentintSignificandff 为这样的整数:ff ≥ 0,10ffintSignificand < 10ff + 1𝔽(intSignificand × 10exponent - ff) 是 𝔽(number),并且 ff 尽可能小。注意,intSignificand 的十进制表示具有 ff + 1 位数字,intSignificand 不能被 10 整除,且 intSignificand 的最低有效数字不一定由这些准则唯一确定。
      2. fractionCount 设置为 ff
    3. significand 为由 intSignificand 的十进制表示的数字组成的 String 值(按顺序,且没有前导零)。
  11. 如果 fractionCount ≠ 0,则
    1. intPartsignificand 的第一个码元。
    2. fractionalPartsignificand 的其他 fractionCount 个码元。
    3. significand 设置为 intPart"."fractionalPart字符串连接
  12. 如果 exponent = 0,则
    1. exponentSign"+"
    2. exponentDigits"0"
  13. 否则,
    1. 如果 exponent > 0,则
      1. exponentSign"+"
    2. 否则,
      1. 断言:exponent < 0。
      2. exponentSign"-"
      3. exponent 设置为 -exponent
    3. exponentDigits 为由 exponent 的十进制表示的数字组成的 String 值(按顺序,且没有前导零)。
  14. significand 设置为 significand"e"exponentSignexponentDigits字符串连接
  15. 返回 signsignificand字符串连接
Note

对于提供比上述规则所要求更精确转换的实现,建议使用步骤 10.b.i 的以下替代版本作为指导:

  1. exponentintSignificandff 为这样的整数:ff ≥ 0,10ffintSignificand < 10ff + 1𝔽(intSignificand × 10exponent - ff) 是 𝔽(number),并且 ff 尽可能小。如果 intSignificand 有多种可能,则选择这样的 intSignificand:使 𝔽(intSignificand × 10exponent - ff) 最接近 𝔽(number)。如果存在两个这样的 intSignificand 可能值,则选择偶数的那个。

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

Note 1

此方法返回一个 String,其中包含以十进制定点记号表示的 this Number value,小数点后有 fractionDigits 位数字。如果 fractionDigitsundefined,则假定为 0。

它在被调用时执行以下步骤:

  1. number 为 ? ThisNumberValue(this value)。
  2. fractionCount 为 ? ToIntegerOrInfinity(fractionDigits)。
  3. 断言:如果 fractionDigitsundefined,则 fractionCount 是 0。
  4. 如果 fractionCount 不是有限的,则抛出 RangeError 异常。
  5. 如果 fractionCount < 0 或 fractionCount > 100,则抛出 RangeError 异常。
  6. 如果 number 不是有限的,则返回 Number::toString(number, 10)。
  7. number 设置为 (number)。
  8. sign 为空 String。
  9. 如果 number < 0,则
    1. sign 设置为 "-"
    2. number 设置为 -number
  10. 如果 number ≥ 1021,则
    1. digitString 为 ! ToString(𝔽(number))。
  11. 否则,
    1. intValue 为这样的整数:intValue / 10fractionCount - number 尽可能接近零。如果存在两个这样的 intValue,则选择较大的 intValue
    2. 如果 intValue = 0,则令 digitString"0";否则令 digitString 为由 intValue 的十进制表示的数字组成的 String 值(按顺序,且没有前导零)。
    3. 如果 fractionCount ≠ 0,则
      1. digitCountdigitString 的长度。
      2. 如果 digitCountfractionCount,则
        1. zeroPad 为由 fractionCount + 1 - digitCount 个码元 0x0030(DIGIT ZERO)组成的 String 值。
        2. digitString 设置为 zeroPaddigitString字符串连接
        3. digitCount 设置为 fractionCount + 1。
      3. intPartdigitString 的前 digitCount - fractionCount 个码元。
      4. fractionalPartdigitString 的其他 fractionCount 个码元。
      5. digitString 设置为 intPart"."fractionalPart字符串连接
  12. 返回 signdigitString字符串连接
Note 2

对于某些值,toFixed 的输出可能比 toString 更精确,因为 toString 只打印足以把该数字与相邻 Number 值区分开的有效数字。例如,

(1000000000000000128).toString() 返回 "1000000000000000100",而
(1000000000000000128).toFixed(0) 返回 "1000000000000000128"

21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范中的规定实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用此方法的以下规范:

此方法产生一个 String 值,表示根据宿主环境当前区域设置的约定格式化的 this Number value。此方法由实现定义,并且允许但不鼓励它返回与 toString 相同的结果。

此方法可选参数的含义在 ECMA-402 规范中定义;不包含 ECMA-402 支持的实现不得把这些参数位置用于任何其他用途。

21.1.3.5 Number.prototype.toPrecision ( precision )

此方法返回一个 String,其中包含以十进制指数记号表示的 this Number value(尾数的小数点前有一位数字,小数点后有 precision - 1 位数字),或以具有 precision 位有效数字的十进制定点记号表示的 this Number value。如果 precisionundefined,它会改为调用 ToString

它在被调用时执行以下步骤:

  1. number 为 ? ThisNumberValue(this value)。
  2. 如果 precisionundefined,则返回 ! ToString(number)。
  3. precisionCount 为 ? ToIntegerOrInfinity(precision)。
  4. 如果 number 不是有限的,则返回 Number::toString(number, 10)。
  5. 如果 precisionCount < 1 或 precisionCount > 100,则抛出 RangeError 异常。
  6. number 设置为 (number)。
  7. sign 为空 String。
  8. 如果 number < 0,则
    1. sign 设置为码元 0x002D(HYPHEN-MINUS)。
    2. number 设置为 -number
  9. 如果 number = 0,则
    1. significand 为由 precisionCount 个码元 0x0030(DIGIT ZERO)组成的 String 值。
    2. exponent 为 0。
  10. 否则,
    1. exponentintSignificand 为这样的整数:10precisionCount - 1intSignificand < 10precisionCount,并且 intSignificand × 10exponent - precisionCount + 1 - number 尽可能接近零。如果存在两组这样的 exponentintSignificand,则选择使 intSignificand × 10exponent - precisionCount + 1 较大的那组 exponentintSignificand
    2. significand 为由 intSignificand 的十进制表示的数字组成的 String 值(按顺序,且没有前导零)。
    3. 如果 exponent < -6 或 exponentprecisionCount,则
      1. 断言:exponent ≠ 0。
      2. 如果 precisionCount ≠ 1,则
        1. intPartsignificand 的第一个码元。
        2. fractionalPartsignificand 的其他 precisionCount - 1 个码元。
        3. significand 设置为 intPart"."fractionalPart字符串连接
      3. 如果 exponent > 0,则
        1. exponentSign 为码元 0x002B(PLUS SIGN)。
      4. 否则,
        1. 断言:exponent < 0。
        2. exponentSign 为码元 0x002D(HYPHEN-MINUS)。
        3. exponent 设置为 -exponent
      5. exponentDigits 为由 exponent 的十进制表示的数字组成的 String 值(按顺序,且没有前导零)。
      6. 返回 signsignificand、码元 0x0065(LATIN SMALL LETTER E)、exponentSignexponentDigits字符串连接
  11. 如果 exponent = precisionCount - 1,则返回 signsignificand字符串连接
  12. 如果 exponent ≥ 0,则
    1. significand 设置为 significand 的前 exponent + 1 个码元、码元 0x002E(FULL STOP)和 significand 的剩余 precisionCount - (exponent + 1) 个码元的字符串连接
  13. 否则,
    1. significand 设置为码元 0x0030(DIGIT ZERO)、码元 0x002E(FULL STOP)、-(exponent + 1) 个码元 0x0030(DIGIT ZERO)和 String significand字符串连接
  14. 返回 signsignificand字符串连接

21.1.3.6 Number.prototype.toString ( [ radix ] )

Note

可选的 radix 应为包含区间 2𝔽36𝔽 内的整数 Number 值。如果 radixundefined,则使用 10𝔽 作为 radix 的值。

此方法在被调用时执行以下步骤:

  1. x 为 ? ThisNumberValue(this 值)。
  2. 如果 radixundefined,则令 radixMV 为 10。
  3. 否则,令 radixMV 为 ? SnapToInteger(radix, truncate, 2, 36)。
  4. 返回 Number::toString(x, radixMV)。

此方法不是泛型的;如果其 this value 不是 Number 或 Number 对象,它会抛出 TypeError 异常。因此,它不能被转移到其他种类的对象上作为方法使用。

此方法的 "length" 属性是 1𝔽

21.1.3.7 Number.prototype.valueOf ( )

  1. 返回 ? ThisNumberValue(this value)。

21.1.3.7.1 ThisNumberValue ( arg )

The abstract operation ThisNumberValue takes argument arg (an ECMAScript language value) and returns either a normal completion containing a Number or a throw completion. It performs the following steps when called:

  1. 如果 arg 是 Number,则返回 arg
  2. 如果 arg 是 Object 且 arg 具有 [[NumberData]] 内部槽,则
    1. numberarg.[[NumberData]]
    2. 断言:number 是 Number。
    3. 返回 number
  3. 抛出 TypeError 异常。

21.1.4 Number 实例的属性

Number 实例是继承自 Number 原型对象属性的普通对象。Number 实例还具有一个 [[NumberData]] 内部槽。[[NumberData]] 内部槽是此 Number 对象所表示的 Number 值

21.2 BigInt 对象

21.2.1 BigInt 构造器

BigInt 构造器:

  • %BigInt%
  • 全局对象"BigInt" 属性的初始值。
  • 在作为函数而非构造器调用时执行类型转换。
  • 并非旨在与 new 运算符一起使用或被子类化。它可以用作类定义的 extends 子句的值,但对 BigInt 构造器进行 super 调用会导致异常。

21.2.1.1 BigInt ( value )

此函数在被调用时执行以下步骤:

  1. 如果 NewTarget 不是 undefined,则抛出 TypeError 异常。
  2. primitive 为 ? ToPrimitive(value, number)。
  3. 如果 primitive 是 Number,则返回 ? NumberToBigInt(primitive)。
  4. 返回 ? ToBigInt(primitive)。

21.2.1.1.1 NumberToBigInt ( number )

The abstract operation NumberToBigInt takes argument number (a Number) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. 如果 number 不是整数 Number,则抛出 RangeError 异常。
  2. 返回 ((number))。

21.2.2 BigInt 构造器的属性

BigInt 构造器:

21.2.2.1 BigInt.asIntN ( bits, bigint )

此函数在被调用时执行以下步骤:

  1. bits 设为 ? ToIndex(bits)。
  2. bigint 设为 ? ToBigInt(bigint)。
  3. remainder(bigint) 模 2bits
  4. 如果 remainder ≥ 2bits - 1,则返回 (remainder - 2bits)。
  5. 返回 (remainder)。

21.2.2.2 BigInt.asUintN ( bits, bigint )

此函数在被调用时执行以下步骤:

  1. bits 设置为 ? ToIndex(bits)。
  2. bigint 设置为 ? ToBigInt(bigint)。
  3. 返回 ((bigint) 对 2bits 取模)。

21.2.2.3 BigInt.prototype

BigInt.prototype 的初始值是 BigInt 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.2.3 BigInt 原型对象的属性

BigInt 原型对象

  • %BigInt.prototype%
  • 普通对象
  • 不是 BigInt 对象;它没有 [[BigIntData]] 内部槽。
  • 具有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%

在某个方法的规范中,短语“this BigInt value”指以该方法调用的 this 值作为实参调用抽象操作 ThisBigIntValue 所返回的结果。

21.2.3.1 BigInt.prototype.constructor

BigInt.prototype.constructor 的初始值是 %BigInt%

21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范中的规定实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用此方法的以下规范:

此方法产生一个 String 值,表示根据宿主环境当前区域设置的约定格式化的 this BigInt value。此方法由实现定义,并且允许但不鼓励它返回与 toString 相同的结果。

此方法可选参数的含义在 ECMA-402 规范中定义;不包含 ECMA-402 支持的实现不得把这些参数位置用于任何其他用途。

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

Note

可选的 radix 应为包含区间 2𝔽36𝔽 内的整数 Number 值。如果 radixundefined,则使用 10𝔽 作为 radix 的值。

此方法在被调用时执行以下步骤:

  1. x 为 ? ThisBigIntValue(this 值)。
  2. 如果 radixundefined,则令 radixMV 为 10。
  3. 否则,令 radixMV 为 ? SnapToInteger(radix, truncate, 2, 36)。
  4. 返回 BigInt::toString(x, radixMV)。

此方法不是泛型的;如果其 this value 不是 BigInt 或 BigInt 对象,它会抛出 TypeError 异常。因此,它不能被转移到其他种类的对象上作为方法使用。

21.2.3.4 BigInt.prototype.valueOf ( )

  1. 返回 ? ThisBigIntValue(this value)。

21.2.3.4.1 ThisBigIntValue ( arg )

The abstract operation ThisBigIntValue takes argument arg (an ECMAScript language value) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:

  1. 如果 arg 是 BigInt,则返回 arg
  2. 如果 arg 是 Object 且 arg 具有 [[BigIntData]] 内部槽,则
    1. 断言:arg.[[BigIntData]] 是 BigInt。
    2. 返回 arg.[[BigIntData]]
  3. 抛出 TypeError 异常。

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "BigInt"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

21.2.4 BigInt 实例的属性

BigInt 实例是继承自 BigInt 原型对象属性的普通对象。BigInt 实例还具有一个 [[BigIntData]] 内部槽。[[BigIntData]] 内部槽是此 BigInt 对象所表示的 BigInt 值。

21.3 Math 对象

Math 对象:

  • %Math%
  • 全局对象"Math" 属性的初始值。
  • 普通对象
  • 具有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%
  • 不是函数对象
  • 没有 [[Construct]] 内部方法;它不能作为构造器与 new 运算符一起使用。
  • 没有 [[Call]] 内部方法;它不能作为函数调用。
Note

在本规范中,短语“the Number value for x”具有 6.1.6.1 中定义的技术含义。

21.3.1 Math 对象的值属性

21.3.1.1 Math.E

e(自然对数的底)的 Number 值,约为 2.7182818284590452354。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.2 Math.LN10

10 的自然对数的 Number 值,约为 2.302585092994046。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.3 Math.LN2

2 的自然对数的 Number 值,约为 0.6931471805599453。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.4 Math.LOG10E

e(自然对数的底)的以 10 为底的对数的 Number 值;此值约为 0.4342944819032518。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Math.LOG10E 的值约为 Math.LN10 值的倒数。

21.3.1.5 Math.LOG2E

e(自然对数的底)的以 2 为底的对数的 Number 值;此值约为 1.4426950408889634。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Math.LOG2E 的值约为 Math.LN2 值的倒数。

21.3.1.6 Math.PI

π(圆的周长与直径之比)的 Number 值,约为 3.1415926535897932。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.7 Math.SQRT1_2

½ 的平方根的 Number 值,约为 0.7071067811865476。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Note

Math.SQRT1_2 的值约为 Math.SQRT2 值的倒数。

21.3.1.8 Math.SQRT2

2 的平方根的 Number 值,约为 1.4142135623730951。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.3.1.9 Math [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 属性的初始值是 String 值 "Math"

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

21.3.2 Math 对象的函数属性

Note

函数 acosacoshasinasinhatanatanhatan2cbrtcoscoshexpexpm1hypotloglog1plog2log10powrandomsinsinhtantanh 的行为在这里没有精确规定,除了要求对于某些表示相关边界情况的实参值给出特定结果。对于其他实参值,这些函数旨在计算熟悉数学函数结果的近似值,但在近似算法的选择上允许一定的自由度。总体意图是,实现者应能够在给定硬件平台上为 ECMAScript 使用与该平台上 C 程序员可用的相同数学库。

尽管算法的选择留给实现,但建议(而非本标准规定)实现使用 fdlibm包含IEEE 754-2019 算术近似算法,fdlibm 是 Sun Microsystems 的可自由分发数学库(http://www.netlib.org/fdlibm)。

21.3.2.1 Math.abs ( x )

此函数返回 x 的绝对值;结果具有与 x 相同的大小,但符号为正。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,则返回 NaN
  3. 如果 n-0𝔽,则返回 +0𝔽
  4. 如果 n-∞𝔽,则返回 +∞𝔽
  5. 如果 n < -0𝔽,则返回 -n
  6. 返回 n

21.3.2.2 Math.acos ( x )

此函数返回 x 的反余弦。结果以弧度表示,并位于从 +0𝔽𝔽(π) 的闭区间内。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaNn > 1𝔽,或 n < -1𝔽,则返回 NaN
  3. 如果 n1𝔽,则返回 +0𝔽
  4. 返回表示 (n) 的反余弦的实现近似 Number 值

21.3.2.3 Math.acosh ( x )

此函数返回 x 的反双曲余弦。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,则返回 n
  3. 如果 n1𝔽,则返回 +0𝔽
  4. 如果 n < 1𝔽,则返回 NaN
  5. 返回表示 (n) 的反双曲余弦的实现近似 Number 值

21.3.2.4 Math.asin ( x )

此函数返回 x 的反正弦。结果以弧度表示,并位于从 𝔽(-π / 2) 到 𝔽(π / 2) 的闭区间内。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n > 1𝔽n < -1𝔽,则返回 NaN
  4. 返回表示 (n) 的反正弦的实现近似 Number 值

21.3.2.5 Math.asinh ( x )

此函数返回 x 的反双曲正弦。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,或 n+0𝔽-0𝔽,则返回 n
  3. 返回表示 (n) 的反双曲正弦的实现近似 Number 值

21.3.2.6 Math.atan ( x )

此函数返回 x 的反正切。结果以弧度表示,并位于从 𝔽(-π / 2) 到 𝔽(π / 2) 的闭区间内。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n+∞𝔽,则返回表示 π / 2 的实现近似 Number 值
  4. 如果 n-∞𝔽,则返回表示 -π / 2 的实现近似 Number 值
  5. 返回表示 (n) 的反正切的实现近似 Number 值

21.3.2.7 Math.atanh ( x )

此函数返回 x 的反双曲正切。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n > 1𝔽n < -1𝔽,则返回 NaN
  4. 如果 n1𝔽,则返回 +∞𝔽
  5. 如果 n-1𝔽,则返回 -∞𝔽
  6. 返回表示 (n) 的反双曲正切的实现近似 Number 值

21.3.2.8 Math.atan2 ( y, x )

此函数返回实参 yx 的商 y / x 的反正切,其中 yx 的符号用于确定结果所在的象限。注意,对于双实参反正切函数,名为 y 的实参在前而名为 x 的实参在后,这是有意且传统的。结果以弧度表示,并位于从 -π 到 +π 的闭区间内。

它在被调用时执行以下步骤:

  1. ny 为 ? ToNumber(y)。
  2. nx 为 ? ToNumber(x)。
  3. 如果 nyNaNnxNaN,则返回 NaN
  4. 如果 ny+∞𝔽,则
    1. 如果 nx+∞𝔽,则返回表示 π / 4 的实现近似 Number 值
    2. 如果 nx-∞𝔽,则返回表示 3π / 4 的实现近似 Number 值
    3. 返回表示 π / 2 的实现近似 Number 值
  5. 如果 ny-∞𝔽,则
    1. 如果 nx+∞𝔽,则返回表示 -π / 4 的实现近似 Number 值
    2. 如果 nx-∞𝔽,则返回表示 -3π / 4 的实现近似 Number 值
    3. 返回表示 -π / 2 的实现近似 Number 值
  6. 如果 ny+0𝔽,则
    1. 如果 nx > +0𝔽nx+0𝔽,则返回 +0𝔽
    2. 返回表示 π 的实现近似 Number 值
  7. 如果 ny-0𝔽,则
    1. 如果 nx > +0𝔽nx+0𝔽,则返回 -0𝔽
    2. 返回表示 -π 的实现近似 Number 值
  8. 断言:ny有限的,并且既不是 +0𝔽 也不是 -0𝔽
  9. 如果 ny > +0𝔽,则
    1. 如果 nx+∞𝔽,则返回 +0𝔽
    2. 如果 nx-∞𝔽,则返回表示 π 的实现近似 Number 值
    3. 如果 nx+0𝔽-0𝔽,则返回表示 π / 2 的实现近似 Number 值
  10. 如果 ny < -0𝔽,则
    1. 如果 nx+∞𝔽,则返回 -0𝔽
    2. 如果 nx-∞𝔽,则返回表示 -π 的实现近似 Number 值
    3. 如果 nx+0𝔽-0𝔽,则返回表示 -π / 2 的实现近似 Number 值
  11. 断言:nx有限的,并且既不是 +0𝔽 也不是 -0𝔽
  12. resultabs((ny) / (nx)) 的反正切。
  13. 如果 nx < -0𝔽,则
    1. 如果 ny > +0𝔽,则将 result 设置为 π - result
    2. 否则,将 result 设置为 -π + result
  14. 否则,
    1. 如果 ny < -0𝔽,则将 result 设置为 -result
  15. 返回表示 result 的实现近似 Number 值

21.3.2.9 Math.cbrt ( x )

此函数返回 x 的立方根。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,或 n+0𝔽-0𝔽,则返回 n
  3. 返回表示 (n) 的立方根的实现近似 Number 值

21.3.2.10 Math.ceil ( x )

此函数返回不小于 x 的最小(最接近 -∞ 的)整数 Number 值。如果 x 已经是整数 Number,则结果为 x

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,或 n+0𝔽-0𝔽,则返回 n
  3. 如果 n < -0𝔽n > -1𝔽,则返回 -0𝔽
  4. 如果 n 是整数 Number,则返回 n
  5. 返回不小于 n 的最小(最接近 -∞ 的)整数 Number 值
Note

Math.ceil(x) 的值与 -Math.floor(-x) 的值相同。

21.3.2.11 Math.clz32 ( x )

此函数在被调用时执行以下步骤:

  1. n 为 ? ToUint32(x)。
  2. pn 的无符号 32 位二进制表示中的前导零位数。
  3. 返回 𝔽(p)。
Note

如果 n+0𝔽-0𝔽,此方法返回 32𝔽。如果 n 的 32 位二进制编码的最高有效位是 1,此方法返回 +0𝔽

21.3.2.12 Math.cos ( x )

此函数返回 x 的余弦。实参以弧度表示。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,则返回 NaN
  3. 如果 n+0𝔽-0𝔽,则返回 1𝔽
  4. 返回表示 (n) 的余弦的实现近似 Number 值

21.3.2.13 Math.cosh ( x )

此函数返回 x 的双曲余弦。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,则返回 NaN
  3. 如果 n+∞𝔽-∞𝔽,则返回 +∞𝔽
  4. 如果 n+0𝔽-0𝔽,则返回 1𝔽
  5. 返回表示 (n) 的双曲余弦的实现近似 Number 值
Note

Math.cosh(x) 的值与 (Math.exp(x) + Math.exp(-x)) / 2 的值相同。

21.3.2.14 Math.exp ( x )

此函数返回 x 的指数函数(ex 次幂,其中 e 是自然对数的底)。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,则返回 n
  3. 如果 n+0𝔽-0𝔽,则返回 1𝔽
  4. 如果 n-∞𝔽,则返回 +0𝔽
  5. 返回表示 (n) 的指数函数的实现近似 Number 值

21.3.2.15 Math.expm1 ( x )

此函数返回从 x 的指数函数(ex 次幂,其中 e 是自然对数的底)中减去 1 的结果。即使 x 的值接近 0,也会以准确的方式计算该结果。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽+∞𝔽 之一,则返回 n
  3. 如果 n-∞𝔽,则返回 -1𝔽
  4. exp(n) 的指数函数。
  5. 返回表示 exp - 1 的实现近似 Number 值

21.3.2.16 Math.floor ( x )

此函数返回不大于 x 的最大(最接近 +∞ 的)整数 Number 值。如果 x 已经是整数 Number,则结果为 x

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,或 n+0𝔽-0𝔽,则返回 n
  3. 如果 n < 1𝔽n > +0𝔽,则返回 +0𝔽
  4. 如果 n 是整数 Number,则返回 n
  5. 返回不大于 n 的最大(最接近 +∞ 的)整数 Number 值
Note

Math.floor(x) 的值与 -Math.ceil(-x) 的值相同。

21.3.2.17 Math.fround ( x )

此函数在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,则返回 NaN
  3. 如果 n+0𝔽-0𝔽+∞𝔽-∞𝔽 之一,则返回 n
  4. n32 为使用 roundTiesToEven 模式把 n 转换为 IEEE 754-2019 binary32 格式的结果。
  5. n64 为把 n32 转换为 IEEE 754-2019 binary64 格式的结果。
  6. 返回与 n64 对应的 ECMAScript Number 值

21.3.2.18 Math.f16round ( x )

此函数在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN,则返回 NaN
  3. 如果 n+0𝔽-0𝔽+∞𝔽-∞𝔽 之一,则返回 n
  4. n16 为使用 roundTiesToEven 模式把 n 转换为 IEEE 754-2019 binary16 格式的结果。
  5. n64 为把 n16 转换为 IEEE 754-2019 binary64 格式的结果。
  6. 返回与 n64 对应的 ECMAScript Number 值
Note

此操作不同于先转换为 binary32 再转换为 binary16,因为存在双重舍入的可能性:例如考虑数字 k = 1.00048828125000022204𝔽,对它而言 Math.f16round(k) 是 1.0009765625𝔽,而 Math.f16round(Math.fround(k)) 是 1𝔽

并非所有平台都提供从 binary64 转换到 binary16 的原生支持。有多种库可以提供此功能,包括 MIT 许可的 half 库。另一种做法是先在 roundTiesToEven 下从 binary64 转换到 binary32,然后检查该结果是否可能导致不正确的双重舍入。可以通过调整 binary32 值的尾数来显式处理这些情况,使其成为在 roundTiesToOdd 下执行初始转换会产生的值。然后在 roundTiesToEven 下把调整后的值转换为 binary16,就会产生正确值。

21.3.2.19 Math.hypot ( ...args )

给定零个或多个实参,此函数返回其实参平方和的平方根。

它在被调用时执行以下步骤:

  1. coerced 为新的空 List。
  2. args 的每个元素 arg,执行:
    1. n 为 ? ToNumber(arg)。
    2. n 追加到 coerced
  3. coerced 的每个元素 number,执行:
    1. 如果 number+∞𝔽-∞𝔽,则返回 +∞𝔽
  4. onlyZerotrue
  5. coerced 的每个元素 number,执行:
    1. 如果 numberNaN,则返回 NaN
    2. 如果 number 既不是 +0𝔽 也不是 -0𝔽,则将 onlyZero 设置为 false
  6. 如果 onlyZerotrue,则返回 +0𝔽
  7. 返回表示 coerced 中各元素数学值平方和的平方根的实现近似 Number 值

此函数的 "length" 属性是 2𝔽

Note

当此函数以两个或更多实参调用时,实现应注意避免朴素实现中容易发生的上溢和下溢所导致的精度损失。

21.3.2.20 Math.imul ( x, y )

此函数在被调用时执行以下步骤:

  1. a(? ToUint32(x))。
  2. b(? ToUint32(y))。
  3. product 为 (a × b) 对 232 取模。
  4. 如果 product ≥ 231,则返回 𝔽(product - 232)。
  5. 返回 𝔽(product)。

21.3.2.21 Math.log ( x )

此函数返回 x 的自然对数。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,则返回 n
  3. 如果 n1𝔽,则返回 +0𝔽
  4. 如果 n+0𝔽-0𝔽,则返回 -∞𝔽
  5. 如果 n < -0𝔽,则返回 NaN
  6. 返回表示 ln((n)) 的实现近似 Number 值

21.3.2.22 Math.log1p ( x )

此函数返回 1 + x 的自然对数。即使 x 的值接近零,也会以准确的方式计算该结果。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽+∞𝔽 之一,则返回 n
  3. 如果 n-1𝔽,则返回 -∞𝔽
  4. 如果 n < -1𝔽,则返回 NaN
  5. 返回表示 ln(1 + (n)) 的实现近似 Number 值

21.3.2.23 Math.log10 ( x )

此函数返回 x 的以 10 为底的对数。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,则返回 n
  3. 如果 n1𝔽,则返回 +0𝔽
  4. 如果 n+0𝔽-0𝔽,则返回 -∞𝔽
  5. 如果 n < -0𝔽,则返回 NaN
  6. 返回表示 log10((n)) 的实现近似 Number 值

21.3.2.24 Math.log2 ( x )

此函数返回 x 的以 2 为底的对数。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+∞𝔽,则返回 n
  3. 如果 n1𝔽,则返回 +0𝔽
  4. 如果 n+0𝔽-0𝔽,则返回 -∞𝔽
  5. 如果 n < -0𝔽,则返回 NaN
  6. 返回表示 log2((n)) 的实现近似 Number 值

21.3.2.25 Math.max ( ...args )

给定零个或多个实参,此函数对每个实参调用 ToNumber,并返回所得值中的最大值。

它在被调用时执行以下步骤:

  1. coerced 为新的空 List。
  2. args 的每个元素 arg,执行:
    1. n 为 ? ToNumber(arg)。
    2. n 追加到 coerced
  3. highest-∞𝔽
  4. coerced 的每个元素 number,执行:
    1. 如果 numberNaN,则返回 NaN
    2. 如果 number+0𝔽highest-0𝔽,则将 highest 设置为 +0𝔽
    3. 如果 number > highest,则将 highest 设置为 number
  5. 返回 highest
Note

用于确定最大值的值比较使用 IsLessThan 算法完成,但 +0𝔽 被视为大于 -0𝔽

此函数的 "length" 属性是 2𝔽

21.3.2.26 Math.min ( ...args )

给定零个或多个实参,此函数对每个实参调用 ToNumber,并返回所得值中的最小值。

它在被调用时执行以下步骤:

  1. coerced 为新的空 List。
  2. args 的每个元素 arg,执行:
    1. n 为 ? ToNumber(arg)。
    2. n 追加到 coerced
  3. lowest+∞𝔽
  4. coerced 的每个元素 number,执行:
    1. 如果 numberNaN,则返回 NaN
    2. 如果 number-0𝔽lowest+0𝔽,则将 lowest 设置为 -0𝔽
    3. 如果 number < lowest,则将 lowest 设置为 number
  5. 返回 lowest
Note

用于确定最小值的值比较使用 IsLessThan 算法完成,但 +0𝔽 被视为大于 -0𝔽

此函数的 "length" 属性是 2𝔽

21.3.2.27 Math.pow ( base, exponent )

此函数在被调用时执行以下步骤:

  1. base 设置为 ? ToNumber(base)。
  2. exponent 设置为 ? ToNumber(exponent)。
  3. 返回 Number::exponentiate(base, exponent)。

21.3.2.28 Math.random ( )

此函数返回一个符号为正、大于或等于 +0𝔽 但严格小于 1𝔽Number 值,该值使用实现定义的算法或策略,以在该范围内近似均匀分布的方式随机或伪随机选择。

为不同 realm 创建的每个 Math.random 函数,必须从连续调用中产生不同的值序列。

21.3.2.29 Math.round ( x )

此函数返回最接近 x 且为整数的 Number 值。如果两个整数 Number 与 x 等距,则结果是更接近 +∞ 的 Number 值。如果 x 已经是整数,则结果为 x

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的或 n 是整数 Number,则返回 n
  3. 如果 n < 0.5𝔽n > +0𝔽,则返回 +0𝔽
  4. 如果 n < -0𝔽n-0.5𝔽,则返回 -0𝔽
  5. 返回最接近 n 的整数 Number,平局时偏向更接近 +∞ 的 Number。
Note 1

Math.round(3.5) 返回 4,但 Math.round(-3.5) 返回 -3。

Note 2

Math.round(x) 的值不总是与 Math.floor(x + 0.5) 的值相同。当 x-0𝔽,或 x 小于 -0𝔽 但大于或等于 -0.5𝔽 时,Math.round(x) 返回 -0𝔽,但 Math.floor(x + 0.5) 返回 +0𝔽。由于计算 x + 0.5 时的内部舍入,Math.round(x) 也可能不同于 Math.floor(x + 0.5) 的值。

21.3.2.30 Math.sign ( x )

此函数返回 x 的符号,指示 x 是正、负还是零。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n < -0𝔽,则返回 -1𝔽
  4. 返回 1𝔽

21.3.2.31 Math.sin ( x )

此函数返回 x 的正弦。实参以弧度表示。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n+∞𝔽-∞𝔽,则返回 NaN
  4. 返回表示 (n) 的正弦的实现近似 Number 值

21.3.2.32 Math.sinh ( x )

此函数返回 x 的双曲正弦。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,或 n+0𝔽-0𝔽,则返回 n
  3. 返回表示 (n) 的双曲正弦的实现近似 Number 值
Note

Math.sinh(x) 的值与 (Math.exp(x) - Math.exp(-x)) / 2 的值相同。

21.3.2.33 Math.sqrt ( x )

此函数返回 x 的平方根。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽+∞𝔽 之一,则返回 n
  3. 如果 n < -0𝔽,则返回 NaN
  4. 返回 𝔽((n) 的平方根)。

21.3.2.34 Math.sumPrecise ( items )

给定一个 Numbers 的可迭代对象,此函数对可迭代对象中的每个值求和,并返回其和。如果任何值不是 Number,则抛出 TypeError 异常。

它在被调用时执行以下步骤:

  1. 执行 ? RequireObjectCoercible(items)。
  2. iteratorRecord 为 ? GetIterator(items, sync)。
  3. stateminus-zero
  4. sum 为 0。
  5. count 为 0。
  6. nextnot-started
  7. 重复,只要 next 不是 done
    1. next 设置为 ? IteratorStepValue(iteratorRecord)。
    2. 如果 next 不是 done,则
      1. 如果 count ≥ 253 - 1,则
        1. 注:在实践中不预计会达到此步骤,包含它只是为了使实现可以依赖输入为“合理大小”而不违反本规范。
        2. errorThrowCompletion(一个新创建的 RangeError 对象)。
        3. 返回 ? IteratorClose(iteratorRecord, error)。
      2. 如果 next 不是 Number,则
        1. errorThrowCompletion(一个新创建的 TypeError 对象)。
        2. 返回 ? IteratorClose(iteratorRecord, error)。
      3. nnext
      4. 如果 state 不是 not-a-number,则
        1. 如果 nNaN,则
          1. state 设置为 not-a-number
        2. 否则,如果 n+∞𝔽,则
          1. 如果 stateminus-infinity,则将 state 设置为 not-a-number
          2. 否则,将 state 设置为 plus-infinity
        3. 否则,如果 n-∞𝔽,则
          1. 如果 stateplus-infinity,则将 state 设置为 not-a-number
          2. 否则,将 state 设置为 minus-infinity
        4. 否则,如果 n 不是 -0𝔽stateminus-zerofinite,则
          1. state 设置为 finite
          2. sum 设置为 sum + (n)。
      5. count 设置为 count + 1。
  8. 如果 statenot-a-number,则返回 NaN
  9. 如果 stateplus-infinity,则返回 +∞𝔽
  10. 如果 stateminus-infinity,则返回 -∞𝔽
  11. 如果 stateminus-zero,则返回 -0𝔽
  12. 返回 𝔽(sum)。
Note

sum 的值可以通过多种算法在不使用任意精度算术的情况下计算。其中一种是 Jonathan Richard Shewchuk 在 Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates 中给出的“Grow-Expansion”算法。一个更新的算法见“Fast exact summation using small and large superaccumulators”,其代码可在 https://gitlab.com/radfordneal/xsum 获得。

21.3.2.35 Math.tan ( x )

此函数返回 x 的正切。实参以弧度表示。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n+∞𝔽-∞𝔽,则返回 NaN
  4. 返回表示 (n) 的正切的实现近似 Number 值

21.3.2.36 Math.tanh ( x )

此函数返回 x 的双曲正切。

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 nNaN+0𝔽-0𝔽 之一,则返回 n
  3. 如果 n+∞𝔽,则返回 1𝔽
  4. 如果 n-∞𝔽,则返回 -1𝔽
  5. 返回表示 (n) 的双曲正切的实现近似 Number 值
Note

Math.tanh(x) 的值与 (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)) 的值相同。

21.3.2.37 Math.trunc ( x )

此函数返回数字 x 的整数部分,移除任何小数位。如果 x 已经是整数,则结果为 x

它在被调用时执行以下步骤:

  1. n 为 ? ToNumber(x)。
  2. 如果 n 不是有限的,或 n+0𝔽-0𝔽,则返回 n
  3. 如果 n < 1𝔽n > +0𝔽,则返回 +0𝔽
  4. 如果 n < -0𝔽n > -1𝔽,则返回 -0𝔽
  5. 返回沿 +0𝔽 方向最接近 n 的整数 Number。

21.4 Date 对象

21.4.1 Date 对象概述及抽象操作的定义

以下抽象操作时间值(定义见 21.4.1.1)进行操作。请注意,在所有情况下,如果这些函数中任一函数的任何参数是 NaN,则结果将为 NaN

21.4.1.1 时间值和时间范围

ECMAScript 中的时间度量类似于 POSIX 中的时间度量,特别是都依据公历回溯历法进行定义,以 UTC 1970 年 1 月 1 日开始时的午夜作为纪元,并将每一天计为恰好包含 86,400 秒(每秒为 1000 毫秒)。

ECMAScript 时间值是一个 Number,它可以是表示精确到毫秒的某个时刻的有限整数 Number,也可以是表示没有特定时刻的 NaN。作为 msPerDay 整数倍的时间值(即对于某个整数 d,其值为 msPerDay × d)表示比纪元d 个完整 UTC 日的 UTC 日开始时的时刻(当 d 为负数时则早于纪元)。其他任何有限时间值 tv 都是相对于在它之前且作为这种倍数的最大时间值 s 定义的,并表示与 s 位于同一 UTC 日内、但比它晚 (tv - s) 毫秒的时刻。

时间值不考虑 UTC 闰秒——没有时间值表示正闰秒内的时刻,而被负闰秒从 UTC 时间线中移除的时刻则存在对应的时间值。不过,时间值的定义仍然产生与 UTC 的分段对齐,仅在闰秒边界处出现不连续,并且在闰秒之外差值为零。

Number 可以精确表示从 -9,007,199,254,740,992 到 9,007,199,254,740,992 的所有整数(21.1.2.821.1.2.6)。时间值支持的范围略小,为 -8,640,000,000,000,000 到 8,640,000,000,000,000 毫秒。因此,相对于 UTC 1970 年 1 月 1 日开始时的午夜,受支持的时间值范围恰好为 -100,000,000 日到 100,000,000 日。

UTC 1970 年 1 月 1 日开始时的午夜这一确切时刻由时间值 +0𝔽 表示。

Note

在公历回溯历法中,闰年恰好是既能被 4 整除,又能被 400 整除或不能被 100 整除的年份。

公历回溯历法的 400 年周期包含 97 个闰年。因此,平均每年为 365.2425 日,即 31,556,952,000 毫秒。所以,Number 能够以毫秒精度精确表示的最大范围约为相对于 1970 年的 -285,426 年到 285,426 年。本节规定的时间值所支持的较小范围约为相对于 1970 年的 -273,790 年到 273,790 年。

21.4.1.2 与时间相关的常量

以下各节中的算法会引用这些常量。

HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000
msPerMinute = 60000 = msPerSecond × SecondsPerMinute
msPerHour = 3600000 = msPerMinute × MinutesPerHour
msPerDay = 86400000 = msPerHour × HoursPerDay
NanosecondsPerDay = 106 × msPerDay = 8.64 × 1013
nsPerSecond = 106 × msPerSecond = 109
nsPerMillisecond = 106
nsPerMicrosecond = 103
MaxEpochNanoseconds = 108 × NanosecondsPerDay = 8.64 × 1021
MinEpochNanoseconds = -MaxEpochNanoseconds = -8.64 × 1021

21.4.1.3 Day ( tv )

The abstract operation Day takes argument tv (一个有限时间值) and returns 一个整数. 它返回 tv 所在日期的日编号。 It performs the following steps when called:

  1. 返回 floor((tv) / msPerDay)。

21.4.1.4 TimeWithinDay ( tv )

The abstract operation TimeWithinDay takes argument tv (一个有限时间值) and returns 一个处于从 0(含)到 msPerDay(不含)区间内的整数. 它返回自 tv 所在日期开始以来的毫秒数。 It performs the following steps when called:

  1. 返回 (tv) 模 msPerDay

21.4.1.5 DayFromYear ( y )

The abstract operation DayFromYear takes argument y (一个整数) and returns 一个整数. 它返回年份 y 第一天的日编号。 It performs the following steps when called:

  1. 注:在以下步骤中,numberYears1numberYears4numberYears100numberYears400 分别表示在纪元与年份 y 开始之间出现的可被 1、4、100 和 400 整除的年份数量。如果 y 位于纪元之前,则该数量为负数。
  2. numberYears1 为 (y - 1970)。
  3. numberYears4floor((y - 1969) / 4)。
  4. numberYears100floor((y - 1901) / 100)。
  5. numberYears400floor((y - 1601) / 400)。
  6. 返回 365 × numberYears1 + numberYears4 - numberYears100 + numberYears400

21.4.1.6 TimeFromYear ( y )

The abstract operation TimeFromYear takes argument y (一个整数) and returns 一个时间值. 它返回年份 y 开始时的时间值。 It performs the following steps when called:

  1. 返回 𝔽(msPerDay × DayFromYear(y))。

21.4.1.7 YearFromTime ( tv )

The abstract operation YearFromTime takes argument tv (一个有限时间值) and returns 一个整数. 它返回 tv 所在的年份。 It performs the following steps when called:

  1. 返回满足 TimeFromYear(y) ≤ tv 的最大整数 y(最接近 +∞)。

21.4.1.8 DayWithinYear ( tv )

The abstract operation DayWithinYear takes argument tv (一个有限时间值) and returns 一个处于从 0 到 365 的闭区间内的整数. It performs the following steps when called:

  1. 返回 Day(tv) - DayFromYear(YearFromTime(tv))。

21.4.1.9 InLeapYear ( tv )

The abstract operation InLeapYear takes argument tv (一个有限时间值) and returns 0 或 1. 如果 tv 位于闰年中,则返回 1,否则返回 0。 It performs the following steps when called:

  1. yYearFromTime(tv)。
  2. 如果(y 模 400)= 0,则返回 1。
  3. 如果(y 模 100)= 0,则返回 0。
  4. 如果(y 模 4)= 0,则返回 1。
  5. 返回 0。

21.4.1.10 MonthFromTime ( tv )

The abstract operation MonthFromTime takes argument tv (一个有限时间值) and returns 一个处于从 0 到 11 的闭区间内的整数. 它返回一个标识 tv 所在月份的整数。月份值 0 表示一月;1 表示二月;2 表示三月;3 表示四月;4 表示五月;5 表示六月;6 表示七月;7 表示八月;8 表示九月;9 表示十月;10 表示十一月;11 表示十二月。请注意,MonthFromTime(+0𝔽) = 0,对应于 1970 年 1 月 1 日星期四。 It performs the following steps when called:

  1. inLeapYearInLeapYear(tv)。
  2. dayWithinYearDayWithinYear(tv)。
  3. 如果 dayWithinYear < 31,则返回 0。
  4. 如果 dayWithinYear < 59 + inLeapYear,则返回 1。
  5. 如果 dayWithinYear < 90 + inLeapYear,则返回 2。
  6. 如果 dayWithinYear < 120 + inLeapYear,则返回 3。
  7. 如果 dayWithinYear < 151 + inLeapYear,则返回 4。
  8. 如果 dayWithinYear < 181 + inLeapYear,则返回 5。
  9. 如果 dayWithinYear < 212 + inLeapYear,则返回 6。
  10. 如果 dayWithinYear < 243 + inLeapYear,则返回 7。
  11. 如果 dayWithinYear < 273 + inLeapYear,则返回 8。
  12. 如果 dayWithinYear < 304 + inLeapYear,则返回 9。
  13. 如果 dayWithinYear < 334 + inLeapYear,则返回 10。
  14. 断言:dayWithinYear < 365 + inLeapYear
  15. 返回 11。

21.4.1.11 DateFromTime ( tv )

The abstract operation DateFromTime takes argument tv (一个有限时间值) and returns 一个处于从 1 到 31 的闭区间内的整数. 它返回 tv 所在月份中的日期。 It performs the following steps when called:

  1. inLeapYearInLeapYear(tv)。
  2. dayWithinYearDayWithinYear(tv)。
  3. monthMonthFromTime(tv)。
  4. 如果 month = 0,则返回 dayWithinYear + 1。
  5. 如果 month = 1,则返回 dayWithinYear - 30。
  6. 如果 month = 2,则返回 dayWithinYear - 58 - inLeapYear
  7. 如果 month = 3,则返回 dayWithinYear - 89 - inLeapYear
  8. 如果 month = 4,则返回 dayWithinYear - 119 - inLeapYear
  9. 如果 month = 5,则返回 dayWithinYear - 150 - inLeapYear
  10. 如果 month = 6,则返回 dayWithinYear - 180 - inLeapYear
  11. 如果 month = 7,则返回 dayWithinYear - 211 - inLeapYear
  12. 如果 month = 8,则返回 dayWithinYear - 242 - inLeapYear
  13. 如果 month = 9,则返回 dayWithinYear - 272 - inLeapYear
  14. 如果 month = 10,则返回 dayWithinYear - 303 - inLeapYear
  15. 断言:month = 11。
  16. 返回 dayWithinYear - 333 - inLeapYear

21.4.1.12 WeekDay ( tv )

The abstract operation WeekDay takes argument tv (一个有限时间值) and returns 一个处于从 0 到 6 的闭区间内的整数. 它返回一个标识 tv 所在星期几的整数。星期值 0 表示星期日;1 表示星期一;2 表示星期二;3 表示星期三;4 表示星期四;5 表示星期五;6 表示星期六。请注意,WeekDay(+0𝔽) = 4,对应于 1970 年 1 月 1 日星期四。 It performs the following steps when called:

  1. 返回 (Day(tv) + 4) 模 7。

21.4.1.13 HourFromTime ( tv )

The abstract operation HourFromTime takes argument tv (一个有限时间值) and returns 一个处于从 0 到 23 的闭区间内的整数. 它返回 tv 所在日期中的小时。 It performs the following steps when called:

  1. 返回 floor((tv) / msPerHour) 模 HoursPerDay

21.4.1.14 MinFromTime ( tv )

The abstract operation MinFromTime takes argument tv (一个有限时间值) and returns 一个处于从 0 到 59 的闭区间内的整数. 它返回 tv 所在小时中的分钟。 It performs the following steps when called:

  1. 返回 floor((tv) / msPerMinute) 模 MinutesPerHour

21.4.1.15 SecFromTime ( tv )

The abstract operation SecFromTime takes argument tv (一个有限时间值) and returns 一个处于从 0 到 59 的闭区间内的整数. 它返回 tv 所在分钟中的秒。 It performs the following steps when called:

  1. 返回 floor((tv) / msPerSecond) 模 SecondsPerMinute

21.4.1.16 MillisecFromTime ( tv )

The abstract operation MillisecFromTime takes argument tv (一个有限时间值) and returns 一个处于从 0 到 999 的闭区间内的整数. 它返回 tv 所在秒中的毫秒。 It performs the following steps when called:

  1. 返回 (tv) 模 msPerSecond

21.4.1.17 纪元纳秒与范围

纪元纳秒计数是一个以纳秒精度表示时间瞬时的整数。它支持与时间值相同的范围,但以纳秒表示,即从 MinEpochNanosecondsMaxEpochNanoseconds时间值 NaN 没有对应的纳秒等价值;不存在表示非特定瞬时的形式。

UTC 1970 年 1 月 1 日开始时的午夜确切时刻由值 0 表示。最大值为 MaxEpochNanoseconds,最小值为 MinEpochNanoseconds

21.4.1.18 GetUTCEpochNanoseconds ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The abstract operation GetUTCEpochNanoseconds takes arguments year (一个整数), month (1 到 12 的闭区间内的整数), day (1 到 31 的闭区间内的整数), hour (0 到 23 的闭区间内的整数), minute (0 到 59 的闭区间内的整数), second (0 到 59 的闭区间内的整数), millisecond (0 到 999 的闭区间内的整数), microsecond (0 到 999 的闭区间内的整数), and nanosecond (0 到 999 的闭区间内的整数) and returns 一个纪元纳秒计数. 返回值是与给定的 UTC ISO 8601 日历日期和钟表时间相对应的纪元纳秒计数。 It performs the following steps when called:

  1. dateMakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day))。
  2. timeMakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond))。
  3. msMakeDate(date, time)。
  4. 断言:ms 是一个整数值 Number。
  5. 返回 (ms) × nsPerMillisecond + microsecond × nsPerMicrosecond + nanosecond

21.4.1.19 时区标识符

ECMAScript 中的时区由时区标识符表示,该标识符是完全由位于从 0x0000 到 0x007F 的闭区间内的代码单元组成的 String。 ECMAScript 实现所支持的时区可以是可用具名时区,由 AvailableNamedTimeZoneIdentifiers 返回的 Time Zone Identifier Record 的 [[Identifier]] 字段表示;也可以是偏移时区,由使 IsTimeZoneOffsetString 返回 true 的 String 表示。

主时区标识符是可用具名时区的首选标识符。 非主时区标识符是可用具名时区的标识符,但不是主时区标识符。 可用具名时区标识符是主时区标识符或非主时区标识符。 每个可用具名时区标识符恰好与一个可用具名时区相关联。 每个可用具名时区恰好与一个主时区标识符以及零个或多个非主时区标识符相关联。

ECMAScript 实现必须支持标识符为 "UTC" 的可用具名时区,该标识符必须是 UTC 时区的主时区标识符。 此外,实现可以支持任意数量的其他可用具名时区。

遵循 ECMA-402 国际化 API 规范中所述时区要求的实现称为时区感知实现。 时区感知实现必须支持与 IANA 时区数据库中的“Zone”和“Link”名称相对应的可用命名时区,并且只能支持这些名称。 在时区感知实现中,主时区标识符是 IANA 时区数据库中的“Zone”名称,而非主时区标识符则是“Link”名称,除非 ECMA-402 规范中指定的 AvailableNamedTimeZoneIdentifiers 明确另有规定。 对于不支持整个 IANA 时区数据库的实现,仍建议使用 IANA 时区数据库名称作为表示时区的标识符。

21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (一个 String), year (一个整数), month (1 到 12 的闭区间内的整数), day (1 到 31 的闭区间内的整数), hour (0 到 23 的闭区间内的整数), minute (0 到 59 的闭区间内的整数), second (0 到 59 的闭区间内的整数), millisecond (0 到 999 的闭区间内的整数), microsecond (0 到 999 的闭区间内的整数), and nanosecond (0 到 999 的闭区间内的整数) and returns 纪元纳秒计数的 List. 返回的 List 中的每个值都表示一个与给定的 ISO 8601 日历日期以及由 timeZoneIdentifier 标识的命名时区中的钟表时间相对应的纪元纳秒计数

当输入表示因负向时区转换而多次出现的本地时间时(例如夏令时结束,或因时区规则更改而减小时区偏移量),返回的 List 将包含多个元素,并按数值升序排序。 当输入表示因正向时区转换而被跳过的本地时间时(例如夏令时开始,或因时区规则更改而增大时区偏移量),返回的 List 将为空。 否则,返回的 List 将包含一个元素。

GetNamedTimeZoneEpochNanoseconds 的默认实现供不包含任何时区的当地政治规则的 ECMAScript 实现使用,其在被调用时执行以下步骤:

  1. 断言:timeZoneIdentifier"UTC"
  2. epochNanosecondsGetUTCEpochNanoseconds(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)。
  3. 返回 « epochNanoseconds »。
Note

时区感知实现必须使用 IANA 时区数据库的时区信息(并建议所有其他实现也这样做)。

America/New_York 中 2017 年 11 月 5 日凌晨 1:30 会重复出现两次,因此 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0) 将返回长度为 2 的 List,其中第一个元素表示 05:30 UTC(对应 UTC 偏移量为 -04:00 的美国东部夏令时间 01:30),第二个元素表示 06:30 UTC(对应 UTC 偏移量为 -05:00 的美国东部标准时间 01:30)。

America/New_York 中 2017 年 3 月 12 日凌晨 2:30 不存在,因此 GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0) 将返回一个空 List。

21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier, epochNanoseconds )

The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (一个 String) and epochNanoseconds (一个纪元纳秒计数) and returns 一个整数.

返回的整数表示在与纪元纳秒计数 epochNanoseconds 相对应的瞬时,由 timeZoneIdentifier 标识的命名时区相对于 UTC 的偏移量,以纳秒为单位。

GetNamedTimeZoneOffsetNanoseconds 的默认实现供不包含任何时区的当地政治规则的 ECMAScript 实现使用,其在被调用时执行以下步骤:

  1. 断言:timeZoneIdentifier"UTC"
  2. 返回 0。
Note

时区偏移值可以为正,也可以为负。

21.4.1.22 时区标识符记录

时区标识符记录是一种用于描述可用具名时区标识符及其对应主时区标识符的 Record。

时区标识符记录具有 Table 60 中列出的字段。

Table 60: 时区标识符记录的字段
字段名称 含义
[[Identifier]] 一个 String 实现所支持的可用具名时区标识符
[[PrimaryIdentifier]] 一个 String [[Identifier]] 解析到的主时区标识符
Note

如果 [[Identifier]]主时区标识符,则 [[Identifier]] 就是 [[PrimaryIdentifier]]

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns Time Zone Identifier Record 的 List. 其结果描述此实现中的所有可用具名时区标识符,以及与每个可用具名时区标识符相对应的主时区标识符。 该 List 按照每个 Time Zone Identifier Record 的 [[Identifier]] 字段排序。

时区感知实现(包括所有实现 ECMA-402 国际化 API 的实现)必须按照 ECMA-402 规范中的规定实现 AvailableNamedTimeZoneIdentifiers 抽象操作。 对于非时区感知实现,AvailableNamedTimeZoneIdentifiers 在被调用时执行以下步骤:

  1. 如果实现不包含任何时区的本地政治规则,那么
    1. 返回 « Time Zone Identifier Record { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } »。
  2. identifiers 为由唯一的可用具名时区标识符组成、按照代码单元字典序排序的 List。
  3. result 为一个新的空 List。
  4. 对于 identifiers 中的每个元素 identifier,执行
    1. primaryidentifier
    2. 如果 identifier 是此实现中的非主时区标识符,并且 identifier 不是 "UTC",那么
      1. primary 设置为与 identifier 相关联的主时区标识符
      2. 注:实现可能需要以迭代方式解析 identifier,以获得主时区标识符
    3. record 为 Time Zone Identifier Record { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }。
    4. record 追加到 result
  5. 断言:result 包含一个 Time Zone Identifier Record record,使得 record.[[Identifier]]"UTC"record.[[PrimaryIdentifier]]"UTC"
  6. 返回 result

21.4.1.24 SystemTimeZoneIdentifier ( )

The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns 一个 String. 它返回一个表示宿主环境当前时区的 String,该 String 要么表示一个使 IsTimeZoneOffsetString 返回 true 的 UTC 偏移,要么是一个主时区标识符。 It performs the following steps when called:

  1. 如果实现仅支持 UTC 时区,则返回 "UTC"
  2. systemTimeZoneString 为表示宿主环境当前时区的 String,它是主时区标识符偏移时区标识符。
  3. 返回 systemTimeZoneString
Note

为确保实现能够提供 Date 对象的方法通常所提供的功能级别,建议 SystemTimeZoneIdentifier 返回与宿主环境时区设置相对应的 IANA 时区名称(如果存在这种名称)。 如果该时区存在标准时间和夏令时的本地政治规则,则 GetNamedTimeZoneEpochNanosecondsGetNamedTimeZoneOffsetNanoseconds 必须反映这些规则。

例如,如果宿主环境是某个系统上的浏览器,并且用户选择美国东部时间作为其时区,则 SystemTimeZoneIdentifier 返回 "America/New_York"

21.4.1.25 LocalTime ( tv )

The abstract operation LocalTime takes argument tv (一个有限时间值) and returns 一个整数 Number. 它将 tv 从 UTC 转换为本地时间。 应使用在 tv 时生效的标准时间和夏令时本地政治规则,按照本节规定的方式确定结果。 It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  2. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 为 true,则
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  3. 否则,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, (tv) × nsPerMillisecond)。
  4. offsetMstruncate(offsetNs / nsPerMillisecond)。
  5. 返回 tv + 𝔽(offsetMs)。
Note 1

如果实现中没有本地时间 tv 的政治规则,则结果为 tv,因为 SystemTimeZoneIdentifier 返回 "UTC",而 GetNamedTimeZoneOffsetNanoseconds 返回 0。

Note 2

时区感知实现必须使用 IANA 时区数据库 https://www.iana.org/time-zones/ 的时区信息(并建议所有其他实现也这样做)。

Note 3

在存在重复时间的负时区转换处(例如夏令时结束或时区调整减小),两个不同的输入时间值 tvUTC 会转换为同一本地时间 tlocal

LocalTime(UTC(tvlocal)) 不一定总是等于 tvlocal。相应地,UTC(LocalTime(tvUTC)) 也不一定总是等于 tvUTC

21.4.1.26 UTC ( t )

The abstract operation UTC takes argument t (一个 Number) and returns 一个时间值. 它将 t 从本地时间转换为 UTC 时间值。 应使用在 t 时有效的有关标准时间和夏令时的本地政治规则,按照本节规定的方式确定结果。 It performs the following steps when called:

  1. 如果 t 不是有限值,则返回 NaN
  2. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  3. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 为 true,则
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  4. 否则,
    1. possibleInstantsGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, YearFromTime(t), MonthFromTime(t) + 1, DateFromTime(t), HourFromTime(t), MinFromTime(t), SecFromTime(t), MillisecFromTime(t), 0, 0)。
    2. 注:以下步骤确保,当 t 表示在负时区转换时多次重复的本地时间(例如夏令时结束时,或因时区规则更改而减小时区偏移时),或者表示在正时区转换时被跳过的本地时间(例如夏令时开始时,或因时区规则更改而增大时区偏移时),使用转换前的时区偏移来解释 t
    3. 如果 possibleInstants 非空,则
      1. disambiguatedInstantpossibleInstants[0]。
    4. 否则,
      1. 注:t 表示在正时区转换时被跳过的本地时间(例如由于夏令时开始或时区规则更改增大了 UTC 偏移)。
      2. possibleInstantsBeforeGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, YearFromTime(tBefore), MonthFromTime(tBefore) + 1, DateFromTime(tBefore), HourFromTime(tBefore), MinFromTime(tBefore), SecFromTime(tBefore), MillisecFromTime(tBefore), 0, 0),其中 tBefore 是使 possibleInstantsBefore 非空的最大整数 Number < t(即,tBefore 表示转换前的最后一个本地时间)。
      3. disambiguatedInstantpossibleInstantsBefore 的最后一个元素。
    5. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant)。
  5. offsetMstruncate(offsetNs / nsPerMillisecond)。
  6. 返回 t - 𝔽(offsetMs)。

输入 t 名义上是一个时间值,但也可以是任意 Number 值。 该算法不得将 t 限制在时间值范围内,以便无论本地 UTC 偏移为何,都能支持与时间值范围边界相对应的输入。 例如,最大时间值为 8.64 × 1015,对应于 "+275760-09-13T00:00:00Z"。 在某个环境中,如果该时刻的本地时区偏移比 UTC 快 1 小时,则它由更大的输入 8.64 × 1015 + 3.6 × 106 表示,对应于 "+275760-09-13T01:00:00+01:00"

如果实现中无法获得本地时间 t 的政治规则,则结果为 t,因为 SystemTimeZoneIdentifier 返回 "UTC",而 GetNamedTimeZoneOffsetNanoseconds 返回 0。

Note 1

时区感知实现必须使用 IANA 时区数据库的时区信息(并建议所有其他实现也这样做)。

America/New_York 中 2017 年 11 月 5 日凌晨 1:30 重复了两次(时钟向后拨),但必须将其解释为 UTC-04 的凌晨 1:30,而不是 UTC-05 的凌晨 1:30。 在 UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0)))) 中,offsetMs 的值为 -4 × msPerHour

America/New_York 中 2017 年 3 月 12 日凌晨 2:30 不存在,但必须将其解释为 UTC-05 的凌晨 2:30(等同于 UTC-04 的凌晨 3:30)。 在 UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0)))) 中,offsetMs 的值为 -5 × msPerHour

Note 2

UTC(LocalTime(tUTC)) 不一定总是等于 tUTC。相应地,LocalTime(UTC(tlocal)) 也不一定总是等于 tlocal

21.4.1.27 MakeTime ( hour, min, sec, ms )

The abstract operation MakeTime takes arguments hour (一个 Number), min (一个 Number), sec (一个 Number), and ms (一个 Number) and returns 一个 Number. 它计算毫秒数。 It performs the following steps when called:

  1. 如果 hour 不是有限值、min 不是有限值、sec 不是有限值或 ms 不是有限值,则返回 NaN
  2. h 为 ! ToIntegerOrInfinity(hour)。
  3. m 为 ! ToIntegerOrInfinity(min)。
  4. s 为 ! ToIntegerOrInfinity(sec)。
  5. milli 为 ! ToIntegerOrInfinity(ms)。
  6. 返回 ((𝔽(h) × 𝔽(msPerHour) + 𝔽(m) × 𝔽(msPerMinute)) + 𝔽(s) × 𝔽(msPerSecond)) + 𝔽(milli)。
Note

MakeTime 中的算术是浮点算术,它不满足结合律,因此必须按正确的顺序执行运算。

21.4.1.28 MakeDay ( year, month, date )

The abstract operation MakeDay takes arguments year (一个 Number), month (一个 Number), and date (一个 Number) and returns 一个有限 Number 或 NaN. 它计算天数。 It performs the following steps when called:

  1. 如果 year 不是有限值、month 不是有限值或 date 不是有限值,则返回 NaN
  2. y 为 ! ToIntegerOrInfinity(year)。
  3. m 为 ! ToIntegerOrInfinity(month)。
  4. dt 为 ! ToIntegerOrInfinity(date)。
  5. ym𝔽(y) + 𝔽(floor(m / 12))。
  6. 如果 ym 不是有限值,则返回 NaN
  7. mnm 模 12。
  8. 找到一个有限时间值 tv,使得 YearFromTime(tv) = (ym)、MonthFromTime(tv) = mnDateFromTime(tv) = 1;但如果这不可能实现(因为某个参数超出范围),则返回 NaN
  9. 返回 𝔽(Day(tv)) + 𝔽(dt) - 1𝔽

21.4.1.29 MakeDate ( day, time )

The abstract operation MakeDate takes arguments day (一个 Number) and time (一个 Number) and returns 一个有限 Number 或 NaN. 它计算毫秒数。 It performs the following steps when called:

  1. 如果 day 不是有限值或 time 不是有限值,则返回 NaN
  2. tvday × 𝔽(msPerDay) + time
  3. 如果 tv 不是有限值,则返回 NaN
  4. 返回 tv

21.4.1.30 MakeFullYear ( year )

The abstract operation MakeFullYear takes argument year (一个 Number) and returns 一个整数 Number 或 NaN. 它返回与 year 的整数部分相关联的完整年份,并将从 0 到 99 的闭区间内的任何值解释为自 1900 年开始以来的年数。为与公历回溯历法保持一致,“完整年份”被定义为自年份 0(公元前 1 年)开始以来完整年数的有符号计数。 It performs the following steps when called:

  1. 如果 yearNaN+∞𝔽-∞𝔽 之一,则返回 NaN
  2. truncated 为 ! ToIntegerOrInfinity(year)。
  3. 如果 truncated 位于从 0 到 99 的闭区间内,则返回 1900𝔽 + 𝔽(truncated)。
  4. 返回 𝔽(truncated)。

21.4.1.31 TimeClip ( time )

The abstract operation TimeClip takes argument time (一个 Number) and returns 一个时间值. 它计算毫秒数。 It performs the following steps when called:

  1. 如果 time 不是有限值,则返回 NaN
  2. 如果 abs((time)) > 8.64 × 1015,则返回 NaN
  3. 返回 𝔽(! ToIntegerOrInfinity(time))。

21.4.1.32 日期时间字符串格式

ECMAScript 定义了一种从 ISO 8601 日历日期扩展格式改编而来的日期时间字符串交换格式。该格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

其中各组成部分如下:

YYYY 是公历回溯历法中的年份,表示为从 0000 到 9999 的四位十进制数字,或表示为 "+""-" 后跟六位十进制数字的扩展年份
- "-"(连字符)在字符串中按字面出现两次。
MM 是一年中的月份,表示为从 01(一月)到 12(十二月)的两位十进制数字。
DD 是一个月中的日期,表示为从 01 到 31 的两位十进制数字。
T "T" 在字符串中按字面出现,用于表示时间组成部分的开始。
HH 是自午夜以来经过的完整小时数,表示为从 00 到 24 的两位十进制数字。
: ":"(冒号)在字符串中按字面出现两次。
mm 是自该小时开始以来经过的完整分钟数,表示为从 00 到 59 的两位十进制数字。
ss 是自该分钟开始以来经过的完整秒数,表示为从 00 到 59 的两位十进制数字。
. "."(点)在字符串中按字面出现。
sss 是自该秒开始以来经过的完整毫秒数,表示为三位十进制数字。
Z 是 UTC 偏移表示,指定为 "Z"(表示没有偏移的 UTC),或者指定为 "+""-" 后跟时间表达式 HH:mm时区偏移字符串格式的一个子集),分别表示本地时间早于或晚于 UTC

此格式包含仅日期形式:

YYYY
YYYY-MM
YYYY-MM-DD
        

它还包含“日期时间”形式,该形式由上述仅日期形式之一紧接着以下时间形式之一组成,并可以在其后追加可选的 UTC 偏移表示:

THH:mm
THH:mm:ss
THH:mm:ss.sss
        

包含越界或不符合要求的组成部分的字符串不是此格式的有效实例。

Note 1

由于每一天都从午夜开始并在午夜结束,因此可以使用 00:0024:00 两种表示法来区分可与同一日期相关联的两个午夜。这意味着以下两种表示法指向完全相同的时刻:1995-02-04T24:001995-02-05T00:00

Note 2

此格式不支持 RFC 9557 中定义的带有时区名称的注解,仅支持时区偏移的数字表示。

21.4.1.32.1 扩展年份

为了覆盖从 1970 年 1 月 1 日向前或向后约 273,790 年的完整时间值范围(21.4.1.1),需要表示早于 0 年或晚于 9999 年的年份。ISO 8601 允许扩展年份表示,但仅限于信息交换双方达成一致的情况。在简化的 ECMAScript 格式中,这种扩展年份表示应有 6 位数字,并且始终以 + 或 - 符号为前缀。年份 0 被视为正数,必须以 + 符号为前缀。将年份 0 表示为 -000000 是无效的。符合日期时间字符串格式、但其扩展年份表示的时刻超出时间值范围的字符串,会被 Date.parse 视为不可识别,并使该函数返回 NaN,而不会退回到实现特定的行为或启发式方法。

Note

包含扩展年份的日期时间值示例:

-271821-04-20T00:00:00Z 公元前 271822 年
-000001-01-01T00:00:00Z 公元前 2 年
+000000-01-01T00:00:00Z 公元前 1 年
+000001-01-01T00:00:00Z 公元 1 年
+001970-01-01T00:00:00Z 公元 1970 年
+002009-12-15T00:00:00Z 公元 2009 年
+275760-09-13T00:00:00Z 公元 275760 年

21.4.1.33 时区偏移字符串格式

ECMAScript 定义了一种派生自 ISO 8601 的 UTC 偏移字符串交换格式。 以下语法描述了该格式。

语法

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )

The abstract operation IsTimeZoneOffsetString takes argument offsetString (一个 String) and returns 一个 Boolean. 返回值表示 offsetString 是否符合 UTCOffset 给出的语法。 It performs the following steps when called:

  1. parseResultParseText(offsetString, UTCOffset)。
  2. 如果 parseResult 是一个错误 List,则返回 false
  3. 返回 true

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

The abstract operation ParseTimeZoneOffsetString takes argument offsetString (一个 String) and returns 一个整数. 返回值是与 String offsetString 相对应的 UTC 偏移,以纳秒数表示。 It performs the following steps when called:

  1. parseResultParseText(offsetString, UTCOffset)。
  2. 断言:parseResult 不是一个错误 List。
  3. 断言:parseResult 包含一个 ASCIISign Parse Node
  4. parsedSignparseResult包含ASCIISign Parse Node匹配的源文本
  5. 如果 parsedSign 是单个码点 U+002D (HYPHEN-MINUS),那么
    1. sign 为 -1。
  6. 否则,
    1. sign 为 1。
  7. 注:以下 StringToNumber 的应用不会损失精度,因为可以保证每个已解析值都是足够短的十进制数字字符串。
  8. 断言:parseResult 包含一个 Hour Parse Node
  9. parsedHoursparseResult包含Hour Parse Node匹配的源文本
  10. hours(StringToNumber(CodePointsToString(parsedHours)))。
  11. 如果 parseResult包含 MinuteSecond Parse Node,那么
    1. minutes 为 0。
  12. 否则,
    1. parsedMinutesparseResult包含的第一个 MinuteSecond Parse Node匹配的源文本
    2. minutes(StringToNumber(CodePointsToString(parsedMinutes)))。
  13. 如果 parseResult包含两个 MinuteSecond Parse Node,那么
    1. seconds 为 0。
  14. 否则,
    1. parsedSecondsparseResult包含的第二个 MinuteSecond Parse Node匹配的源文本
    2. seconds(StringToNumber(CodePointsToString(parsedSeconds)))。
  15. 如果 parseResult包含 TemporalDecimalFraction Parse Node,那么
    1. nanoseconds 为 0。
  16. 否则,
    1. parsedFractionparseResult包含TemporalDecimalFraction Parse Node匹配的源文本
    2. fractionCodePointsToString(parsedFraction) 与 "000000000"字符串连接结果。
    3. nanosecondsStringfraction 从 1 到 10 的子字符串
    4. nanoseconds(StringToNumber(nanosecondsString))。
  17. 返回 sign × (((hours × MinutesPerHour + minutes) × SecondsPerMinute + seconds) × nsPerSecond + nanoseconds)。

21.4.2 Date 构造器

Date 构造器:

  • %Date%
  • 全局对象"Date" 属性的初始值。
  • 在作为构造器调用时创建并初始化一个新的 Date。
  • 在作为函数而非构造器调用时返回表示当前时间(UTC)的 String。
  • 是一个其行为取决于其实参数量和类型的函数。
  • 可以用作类定义的 extends 子句的值。意图继承指定 Date 行为的子类构造器必须包含对 Date 构造器的 super 调用,以创建并初始化具有 [[DateValue]] 内部槽的子类实例。

21.4.2.1 Date ( ...values )

此函数在被调用时执行以下步骤:

  1. 如果 NewTarget 是 undefined,则
    1. now 为标识当前时间的时间值(UTC)。
    2. 返回 ToDateString(now)。
  2. numberOfArgsvalues 中元素的数量。
  3. 如果 numberOfArgs = 0,则
    1. dv 为标识当前时间的时间值(UTC)。
  4. 否则,如果 numberOfArgs = 1,则
    1. valuevalues[0]。
    2. 如果 value 是 Object 且 value 具有 [[DateValue]] 内部槽,则
      1. tvvalue.[[DateValue]]
    3. 否则,
      1. v 为 ? ToPrimitive(value)。
      2. 如果 v 是 String,则
        1. 断言:下一步永远不会返回 abrupt completion,因为 v 是 String。
        2. tv 为把 v 解析为日期的结果,其方式与 parse 方法(21.4.3.2)完全相同。
      3. 否则,
        1. tv 为 ? ToNumber(v)。
    4. dvTimeClip(tv)。
  5. 否则,
    1. 断言:numberOfArgs ≥ 2。
    2. y 为 ? ToNumber(values[0])。
    3. m 为 ? ToNumber(values[1])。
    4. 如果 numberOfArgs > 2,则令 dt 为 ? ToNumber(values[2]);否则令 dt1𝔽
    5. 如果 numberOfArgs > 3,则令 h 为 ? ToNumber(values[3]);否则令 h+0𝔽
    6. 如果 numberOfArgs > 4,则令 min 为 ? ToNumber(values[4]);否则令 min+0𝔽
    7. 如果 numberOfArgs > 5,则令 s 为 ? ToNumber(values[5]);否则令 s+0𝔽
    8. 如果 numberOfArgs > 6,则令 milli 为 ? ToNumber(values[6]);否则令 milli+0𝔽
    9. yrMakeFullYear(y)。
    10. finalDateMakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))。
    11. dvTimeClip(UTC(finalDate))。
  6. obj 为 ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)。
  7. obj.[[DateValue]] 设置为 dv
  8. 返回 obj

21.4.3 Date 构造器的属性

Date 构造器:

  • 具有一个 [[Prototype]] 内部槽,其值为 %Function.prototype%
  • 具有一个 "length" 属性,其值为 7𝔽
  • 具有以下属性:

21.4.3.1 Date.now ( )

此函数返回表示调用发生时 UTC 日期和时间的时间值

21.4.3.2 Date.parse ( string )

此函数对其实参应用 ToString 运算符。如果 ToString 产生 abrupt completion,则立即返回该 Completion Record。否则,此函数把所得 String 解释为日期和时间;它返回一个 Number,即与该日期和时间对应的 UTC 时间值。取决于 String 的内容,该 String 可以被解释为本地时间、UTC 时间,或某个其他时区中的时间。此函数首先尝试按照日期时间字符串格式(21.4.1.32)中描述的格式解析该 String,包括扩展年份。如果该 String 不符合该格式,则函数可以回退到任何实现特定的启发式规则或实现特定日期格式。不可识别或包含越界格式元素值的 String 应导致此函数返回 NaN

如果该 String 符合日期时间字符串格式,则替代值会替代缺失的格式元素。当 MMDD 元素缺失时,使用 "01"。当 HHmmss 元素缺失时,使用 "00"。当 sss 元素缺失时,使用 "000"。当 UTC 偏移表示缺失时,仅日期形式被解释为 UTC 时间,而日期时间形式被解释为本地时间。

如果 x 是在 ECMAScript 某个特定实现中其毫秒数量为零的任何 Date,则在所有被引用属性都具有其初始值时,以下所有表达式都应在该实现中产生相同的数值:

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())

然而,表达式

Date.parse(x.toLocaleString())

不要求产生与前三个表达式相同的 Number 值,并且一般来说,当给定任何不符合日期时间字符串格式(21.4.1.32)且无法由该实现中的 toStringtoUTCString 方法产生的 String 值时,此函数产生的值是由实现定义的

21.4.3.3 Date.prototype

Date.prototype 的初始值是 Date 原型对象

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

21.4.3.4 Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )

此函数在被调用时执行以下步骤:

  1. y 为 ? ToNumber(year)。
  2. 如果 month 存在,则令 m 为 ? ToNumber(month);否则令 m+0𝔽
  3. 如果 date 存在,则令 dt 为 ? ToNumber(date);否则令 dt1𝔽
  4. 如果 hours 存在,则令 h 为 ? ToNumber(hours);否则令 h+0𝔽
  5. 如果 minutes 存在,则令 min 为 ? ToNumber(minutes);否则令 min+0𝔽
  6. 如果 seconds 存在,则令 s 为 ? ToNumber(seconds);否则令 s+0𝔽
  7. 如果 ms 存在,则令 milli 为 ? ToNumber(ms);否则令 milli+0𝔽
  8. yrMakeFullYear(y)。
  9. 返回 TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)))。

此函数的 "length" 属性是 7𝔽

Note

此函数与 Date 构造器有两点不同:它返回一个作为 Number 的时间值,而不是创建 Date;并且它把实参解释为 UTC,而不是本地时间。

21.4.4 Date 原型对象的属性

Date 原型对象

  • %Date.prototype%
  • 自身是普通对象
  • 不是 Date 实例,并且没有 [[DateValue]] 内部槽。
  • 具有一个 [[Prototype]] 内部槽,其值为 %Object.prototype%

除非另有明确定义,下文定义的 Date 原型对象方法不是泛型的,并且传给它们的 this 值必须是一个对象,该对象具有已初始化为时间值[[DateValue]] 内部槽。

21.4.4.1 Date.prototype.constructor

Date.prototype.constructor 的初始值是 %Date%

21.4.4.2 Date.prototype.getDate ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(DateFromTime(LocalTime(tv)))。

21.4.4.3 Date.prototype.getDay ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(WeekDay(LocalTime(tv)))。

21.4.4.4 Date.prototype.getFullYear ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(YearFromTime(LocalTime(tv)))。

21.4.4.5 Date.prototype.getHours ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(HourFromTime(LocalTime(tv)))。

21.4.4.6 Date.prototype.getMilliseconds ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(MillisecFromTime(LocalTime(tv)))。

21.4.4.7 Date.prototype.getMinutes ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(MinFromTime(LocalTime(tv)))。

21.4.4.8 Date.prototype.getMonth ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(MonthFromTime(LocalTime(tv)))。

21.4.4.9 Date.prototype.getSeconds ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(SecFromTime(LocalTime(tv)))。

21.4.4.10 Date.prototype.getTime ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. 返回 dateObj.[[DateValue]]

21.4.4.11 Date.prototype.getTimezoneOffset ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 (tv - LocalTime(tv)) / 𝔽(msPerMinute)。

21.4.4.12 Date.prototype.getUTCDate ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(DateFromTime(tv))。

21.4.4.13 Date.prototype.getUTCDay ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(WeekDay(tv))。

21.4.4.14 Date.prototype.getUTCFullYear ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(YearFromTime(tv))。

21.4.4.15 Date.prototype.getUTCHours ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(HourFromTime(tv))。

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(MillisecFromTime(tv))。

21.4.4.17 Date.prototype.getUTCMinutes ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(MinFromTime(tv))。

21.4.4.18 Date.prototype.getUTCMonth ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(MonthFromTime(tv))。

21.4.4.19 Date.prototype.getUTCSeconds ( )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 𝔽(SecFromTime(tv))。

21.4.4.20 Date.prototype.setDate ( date )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. dt 为 ? ToNumber(date)。
  5. 如果 tvNaN,则返回 NaN
  6. tv 设置为 LocalTime(tv)。
  7. newDateMakeDate(MakeDay(𝔽(YearFromTime(tv)), 𝔽(MonthFromTime(tv)), dt), 𝔽(TimeWithinDay(tv)))。
  8. uTimeClip(UTC(newDate))。
  9. dateObj.[[DateValue]] 设置为 u
  10. 返回 u

21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. y 为 ? ToNumber(year)。
  5. 如果 tvNaN,则将 tv 设置为 +0𝔽;否则将 tv 设置为 LocalTime(tv)。
  6. 如果 month 存在,则令 m 为 ? ToNumber(month);否则令 m𝔽(MonthFromTime(tv))。
  7. 如果 date 存在,则令 dt 为 ? ToNumber(date);否则令 dt𝔽(DateFromTime(tv))。
  8. newDateMakeDate(MakeDay(y, m, dt), 𝔽(TimeWithinDay(tv)))。
  9. uTimeClip(UTC(newDate))。
  10. dateObj.[[DateValue]] 设置为 u
  11. 返回 u

此方法的 "length" 属性为 3𝔽

Note

如果 month 不存在,则此方法的行为如同 month 存在且其值为 getMonth()。如果 date 不存在,则其行为如同 date 存在且其值为 getDate()

21.4.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. h 为 ? ToNumber(hour)。
  5. 如果 min 存在,则令 m 为 ? ToNumber(min)。
  6. 如果 sec 存在,则令 s 为 ? ToNumber(sec)。
  7. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  8. 如果 tvNaN,则返回 NaN
  9. tv 设置为 LocalTime(tv)。
  10. 如果 min 不存在,则令 m𝔽(MinFromTime(tv))。
  11. 如果 sec 不存在,则令 s𝔽(SecFromTime(tv))。
  12. 如果 ms 不存在,则令 milli𝔽(MillisecFromTime(tv))。
  13. dateMakeDate(𝔽(Day(tv)), MakeTime(h, m, s, milli))。
  14. uTimeClip(UTC(date))。
  15. dateObj.[[DateValue]] 设置为 u
  16. 返回 u

此方法的 "length" 属性为 4𝔽

Note

如果 min 不存在,则此方法的行为如同 min 存在且其值为 getMinutes()。如果 sec 不存在,则其行为如同 sec 存在且其值为 getSeconds()。如果 ms 不存在,则其行为如同 ms 存在且其值为 getMilliseconds()

21.4.4.23 Date.prototype.setMilliseconds ( ms )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. ms 设置为 ? ToNumber(ms)。
  5. 如果 tvNaN,则返回 NaN
  6. tv 设置为 LocalTime(tv)。
  7. timeMakeTime(𝔽(HourFromTime(tv)), 𝔽(MinFromTime(tv)), 𝔽(SecFromTime(tv)), ms)。
  8. uTimeClip(UTC(MakeDate(𝔽(Day(tv)), time)))。
  9. dateObj.[[DateValue]] 设置为 u
  10. 返回 u

21.4.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. m 为 ? ToNumber(min)。
  5. 如果 sec 存在,则令 s 为 ? ToNumber(sec)。
  6. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  7. 如果 tvNaN,则返回 NaN
  8. tv 设置为 LocalTime(tv)。
  9. 如果 sec 不存在,则令 s𝔽(SecFromTime(tv))。
  10. 如果 ms 不存在,则令 milli𝔽(MillisecFromTime(tv))。
  11. dateMakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), m, s, milli))。
  12. uTimeClip(UTC(date))。
  13. dateObj.[[DateValue]] 设置为 u
  14. 返回 u

此方法的 "length" 属性为 3𝔽

Note

如果 sec 不存在,则此方法的行为如同 sec 存在且其值为 getSeconds()。如果 ms 不存在,则其行为如同 ms 存在且其值为 getMilliseconds()

21.4.4.25 Date.prototype.setMonth ( month [ , date ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. m 为 ? ToNumber(month)。
  5. 如果 date 存在,则令 dt 为 ? ToNumber(date)。
  6. 如果 tvNaN,则返回 NaN
  7. tv 设置为 LocalTime(tv)。
  8. 如果 date 不存在,则令 dt𝔽(DateFromTime(tv))。
  9. newDateMakeDate(MakeDay(𝔽(YearFromTime(tv)), m, dt), 𝔽(TimeWithinDay(tv)))。
  10. uTimeClip(UTC(newDate))。
  11. dateObj.[[DateValue]] 设置为 u
  12. 返回 u

此方法的 "length" 属性为 2𝔽

Note

如果 date 不存在,则此方法的行为如同 date 存在且其值为 getDate()

21.4.4.26 Date.prototype.setSeconds ( sec [ , ms ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. s 为 ? ToNumber(sec)。
  5. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  6. 如果 tvNaN,则返回 NaN
  7. tv 设置为 LocalTime(tv)。
  8. 如果 ms 不存在,则令 milli𝔽(MillisecFromTime(tv))。
  9. dateMakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), 𝔽(MinFromTime(tv)), s, milli))。
  10. uTimeClip(UTC(date))。
  11. dateObj.[[DateValue]] 设置为 u
  12. 返回 u

此方法的 "length" 属性为 2𝔽

Note

如果 ms 不存在,则此方法的行为如同 ms 存在且其值为 getMilliseconds()

21.4.4.27 Date.prototype.setTime ( time )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. t 为 ? ToNumber(time)。
  4. vTimeClip(t)。
  5. dateObj.[[DateValue]] 设置为 v
  6. 返回 v

21.4.4.28 Date.prototype.setUTCDate ( date )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. dt 为 ? ToNumber(date)。
  5. 如果 tvNaN,则返回 NaN
  6. newDateMakeDate(MakeDay(𝔽(YearFromTime(tv)), 𝔽(MonthFromTime(tv)), dt), 𝔽(TimeWithinDay(tv)))。
  7. vTimeClip(newDate)。
  8. dateObj.[[DateValue]] 设置为 v
  9. 返回 v

21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则将 tv 设置为 +0𝔽
  5. y 为 ? ToNumber(year)。
  6. 如果 month 存在,则令 m 为 ? ToNumber(month);否则令 m𝔽(MonthFromTime(tv))。
  7. 如果 date 存在,则令 dt 为 ? ToNumber(date);否则令 dt𝔽(DateFromTime(tv))。
  8. newDateMakeDate(MakeDay(y, m, dt), 𝔽(TimeWithinDay(tv)))。
  9. vTimeClip(newDate)。
  10. dateObj.[[DateValue]] 设置为 v
  11. 返回 v

此方法的 "length" 属性为 3𝔽

Note

如果 month 不存在,则此方法的行为如同 month 存在且其值为 getUTCMonth()。如果 date 不存在,则其行为如同 date 存在且其值为 getUTCDate()

21.4.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. h 为 ? ToNumber(hour)。
  5. 如果 min 存在,则令 m 为 ? ToNumber(min)。
  6. 如果 sec 存在,则令 s 为 ? ToNumber(sec)。
  7. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  8. 如果 tvNaN,则返回 NaN
  9. 如果 min 不存在,则令 m𝔽(MinFromTime(tv))。
  10. 如果 sec 不存在,则令 s𝔽(SecFromTime(tv))。
  11. 如果 ms 不存在,则令 milli𝔽(MillisecFromTime(tv))。
  12. dateMakeDate(𝔽(Day(tv)), MakeTime(h, m, s, milli))。
  13. vTimeClip(date)。
  14. dateObj.[[DateValue]] 设置为 v
  15. 返回 v

此方法的 "length" 属性为 4𝔽

Note

如果 min 不存在,则此方法的行为如同 min 存在且其值为 getUTCMinutes()。如果 sec 不存在,则其行为如同 sec 存在且其值为 getUTCSeconds()。如果 ms 不存在,则其行为如同 ms 存在且其值为 getUTCMilliseconds()

21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. ms 设置为 ? ToNumber(ms)。
  5. 如果 tvNaN,则返回 NaN
  6. timeMakeTime(𝔽(HourFromTime(tv)), 𝔽(MinFromTime(tv)), 𝔽(SecFromTime(tv)), ms)。
  7. vTimeClip(MakeDate(𝔽(Day(tv)), time))。
  8. dateObj.[[DateValue]] 设置为 v
  9. 返回 v

21.4.4.32 Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. m 为 ? ToNumber(min)。
  5. 如果 sec 存在,则令 s 为 ? ToNumber(sec)。
  6. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  7. 如果 tvNaN,则返回 NaN
  8. 如果 sec 不存在,则令 s𝔽(SecFromTime(tv))。
  9. 如果 ms 不存在,则令 milli𝔽(MillisecFromTime(tv))。
  10. dateMakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), m, s, milli))。
  11. vTimeClip(date)。
  12. dateObj.[[DateValue]] 设置为 v
  13. 返回 v

此方法的 "length" 属性为 3𝔽

Note

如果 sec 不存在,则此方法的行为如同 sec 存在且其值为 getUTCSeconds()。如果 ms 不存在,则其行为如同 ms 存在且其值为 getUTCMilliseconds() 的返回值。

21.4.4.33 Date.prototype.setUTCMonth ( month [ , date ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. m 为 ? ToNumber(month)。
  5. 如果 date 存在,则令 dt 为 ? ToNumber(date)。
  6. 如果 tvNaN,则返回 NaN
  7. 如果 date 不存在,则令 dt𝔽(DateFromTime(tv))。
  8. newDateMakeDate(MakeDay(𝔽(YearFromTime(tv)), m, dt), 𝔽(TimeWithinDay(tv)))。
  9. vTimeClip(newDate)。
  10. dateObj.[[DateValue]] 设置为 v
  11. 返回 v

此方法的 "length" 属性为 2𝔽

Note

如果 date 不存在,则此方法的行为如同 date 存在且其值为 getUTCDate()

21.4.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )

调用此方法时,它执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. s 为 ? ToNumber(sec)。
  5. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  6. 如果 tvNaN,则返回 NaN
  7. 如果 ms 不存在,则令 milli𝔽(MillisecFromTime(tv))。
  8. dateMakeDate(𝔽(Day(tv)), MakeTime(𝔽(HourFromTime(tv)), 𝔽(MinFromTime(tv)), s, milli))。
  9. vTimeClip(date)。
  10. dateObj.[[DateValue]] 设置为 v
  11. 返回 v

此方法的 "length" 属性为 2𝔽

Note

如果 ms 不存在,则此方法的行为如同 ms 存在且其值为 getUTCMilliseconds()

21.4.4.35 Date.prototype.toDateString ( )

此方法在被调用时执行以下步骤:

  1. dateObjthis value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 "Invalid Date"
  5. tLocalTime(tv)。
  6. 返回 DateString(t)。

21.4.4.36 Date.prototype.toISOString ( )

此方法在被调用时执行以下步骤:

  1. dateObjthis value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则抛出 RangeError 异常。
  5. 断言:tv 是整数 Number。
  6. 如果 tv 对应于不能在日期时间字符串格式中表示的年份,则抛出 RangeError 异常。
  7. 返回 tv 在 UTC 时间尺度上的日期时间字符串格式中的 String 表示,包括所有格式元素和 UTC 偏移表示 "Z"

21.4.4.37 Date.prototype.toJSON ( key )

此方法提供 Date 的 String 表示,以供 JSON.stringify25.5.4)使用。

它在被调用时执行以下步骤:

  1. obj 为 ? ToObject(this value)。
  2. tv 为 ? ToPrimitive(obj, number)。
  3. 如果 tv 是 Number 且 tv 不是有限的,则返回 null
  4. 返回 ? Invoke(obj, "toISOString")。
Note 1

该实参会被忽略。

Note 2

此方法有意设计为泛型的;它不要求其 this 值是 Date。因此,它可以被转移到其他种类的对象上作为方法使用。不过,它要求任何这样的对象都具有 toISOString 方法。

21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范中的规定实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用此方法的以下规范:

此方法返回一个 String 值。该 String 的内容由实现定义,但旨在以方便且人类可读的形式表示当前时区中 Date 的“日期”部分,并对应于宿主环境当前区域设置的约定。

此方法可选参数的含义在 ECMA-402 规范中定义;不包含 ECMA-402 支持的实现不得把这些参数位置用于任何其他用途。

21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范中的规定实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用此方法的以下规范:

此方法返回一个 String 值。该 String 的内容由实现定义,但旨在以方便且人类可读的形式表示当前时区中的 Date,并对应于宿主环境当前区域设置的约定。

此方法可选参数的含义在 ECMA-402 规范中定义;不包含 ECMA-402 支持的实现不得把这些参数位置用于任何其他用途。

21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )

包含 ECMA-402 国际化 API 的 ECMAScript 实现必须按 ECMA-402 规范中的规定实现此方法。如果 ECMAScript 实现不包含 ECMA-402 API,则使用此方法的以下规范:

此方法返回一个 String 值。该 String 的内容由实现定义,但旨在以方便且人类可读的形式表示当前时区中 Date 的“时间”部分,并对应于宿主环境当前区域设置的约定。

此方法可选参数的含义在 ECMA-402 规范中定义;不包含 ECMA-402 支持的实现不得把这些参数位置用于任何其他用途。

21.4.4.41 Date.prototype.toString ( )

此方法在被调用时执行以下步骤:

  1. dateObjthis value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 返回 ToDateString(tv)。
Note 1

对于任何 Date d,如果 d.[[DateValue]] 可被 1000 整除,则 Date.parse(d.toString()) 的结果 = d.valueOf()。见 21.4.3.2

Note 2

此方法不是泛型的;如果其 this 值不是 Date,它会抛出 TypeError 异常。因此,它不能被转移到其他种类的对象上作为方法使用。

21.4.4.41.1 TimeString ( tv )

The abstract operation TimeString takes argument tv (一个 Number,但不是 NaN) and returns 一个 String. It performs the following steps when called:

  1. hourToZeroPaddedDecimalString(HourFromTime(tv), 2)。
  2. minuteToZeroPaddedDecimalString(MinFromTime(tv), 2)。
  3. secondToZeroPaddedDecimalString(SecFromTime(tv), 2)。
  4. 返回 hour":"minute":"second、代码单元 0x0020 (SPACE) 和 "GMT" 的字符串拼接结果。

21.4.4.41.2 DateString ( tv )

The abstract operation DateString takes argument tv (一个 Number,但不是 NaN) and returns 一个 String. It performs the following steps when called:

  1. weekdayTable 61WeekDay Index = WeekDay(tv) 的条目的 Name。
  2. monthTable 62 中 Month Index = MonthFromTime(tv) 的条目的 Name。
  3. dayToZeroPaddedDecimalString(DateFromTime(tv), 2)。
  4. yvYearFromTime(tv)。
  5. 如果 yv ≥ 0,则令 yearSign 为空 String;否则令 yearSign"-"
  6. paddedYearToZeroPaddedDecimalString(abs(yv), 4)。
  7. 返回 weekday、代码单元 0x0020 (SPACE)、month、代码单元 0x0020 (SPACE)、day、代码单元 0x0020 (SPACE)、yearSignpaddedYear 的字符串拼接结果。
Table 61: 星期名称
WeekDay 索引 名称
0 "Sun"
1 "Mon"
2 "Tue"
3 "Wed"
4 "Thu"
5 "Fri"
6 "Sat"
Table 62: 一年中各月份的名称
月份索引 名称
0 "Jan"
1 "Feb"
2 "Mar"
3 "Apr"
4 "May"
5 "Jun"
6 "Jul"
7 "Aug"
8 "Sep"
9 "Oct"
10 "Nov"
11 "Dec"

21.4.4.41.3 TimeZoneString ( tv )

The abstract operation TimeZoneString takes argument tv (一个整数 Number) and returns 一个 String. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  2. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 为 true,则
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  3. 否则,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, (tv) × nsPerMillisecond)。
  4. offsettruncate(offsetNs / nsPerMillisecond)。
  5. 如果 offset ≥ 0,则
    1. offsetSign"+"
    2. absOffsetoffset
  6. 否则,
    1. offsetSign"-"
    2. absOffset 为 -offset
  7. offsetMinToZeroPaddedDecimalString(MinFromTime(𝔽(absOffset)), 2)。
  8. offsetHourToZeroPaddedDecimalString(HourFromTime(𝔽(absOffset)), 2)。
  9. tzName 为一个实现定义的字符串,该字符串要么是空 String,要么是代码单元 0x0020(空格)、代码单元 0x0028(左圆括号)、一个实现定义的时区名称和代码单元 0x0029(右圆括号)的字符串连接
  10. 返回 offsetSignoffsetHouroffsetMintzName字符串连接

21.4.4.41.4 ToDateString ( tv )

The abstract operation ToDateString takes argument tv (一个整数 Number 或 NaN) and returns 一个 String. It performs the following steps when called:

  1. 如果 tvNaN,则返回 "Invalid Date"
  2. localTimeLocalTime(tv)。
  3. 返回 DateString(localTime)、代码单元 0x0020 (SPACE)、TimeString(localTime) 和 TimeZoneString(tv) 的字符串拼接结果。

21.4.4.42 Date.prototype.toTimeString ( )

此方法在被调用时执行以下步骤:

  1. dateObjthis value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 "Invalid Date"
  5. localTimeLocalTime(tv)。
  6. 返回 TimeString(localTime) 和 TimeZoneString(tv) 的字符串连接

21.4.4.43 Date.prototype.toUTCString ( )

此方法返回一个 String 值,表示与 this 值对应的时间瞬间。该 String 的格式基于 RFC 7231 中的 HTTP-date,并泛化为支持 ECMAScript Date 所支持的完整时间范围。

它在被调用时执行以下步骤:

  1. dateObjthis 值。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 "Invalid Date"
  5. weekdayTable 61WeekDay Index = WeekDay(tv) 的条目的 Name。
  6. monthTable 62 中 Month Index = MonthFromTime(tv) 的条目的 Name。
  7. dayToZeroPaddedDecimalString(DateFromTime(tv), 2)。
  8. yvYearFromTime(tv)。
  9. 如果 yv ≥ 0,则令 yearSign 为空 String;否则令 yearSign"-"
  10. paddedYearToZeroPaddedDecimalString(abs(yv), 4)。
  11. 返回 weekday","、代码单元 0x0020 (SPACE)、day、代码单元 0x0020 (SPACE)、month、代码单元 0x0020 (SPACE)、yearSignpaddedYear、代码单元 0x0020 (SPACE) 和 TimeString(tv) 的字符串拼接结果。

21.4.4.44 Date.prototype.valueOf ( )

此方法在被调用时执行以下步骤:

  1. dateObjthis value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. 返回 dateObj.[[DateValue]]

21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )

此方法由 ECMAScript 语言运算符调用,用于将 Date 转换为原始值。hint 的允许值是 "default""number""string"。Date 在内置 ECMAScript 对象中是独特的,因为它们把 "default" 视为等同于 "string";所有其他内置 ECMAScript 对象都把 "default" 视为等同于 "number"

它在被调用时执行以下步骤:

  1. objthis value。
  2. 如果 obj 不是 Object,则抛出 TypeError 异常。
  3. 如果 hint"string""default",则
    1. tryFirststring
  4. 否则,如果 hint"number",则
    1. tryFirstnumber
  5. 否则,
    1. 抛出 TypeError 异常。
  6. 返回 ? OrdinaryToPrimitive(obj, tryFirst)。

此属性具有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }。

此方法的 "name" 属性的值是 "[Symbol.toPrimitive]"

21.4.5 Date 实例的属性

Date 实例是继承自 Date 原型对象属性的普通对象。Date 实例还具有一个 [[DateValue]] 内部槽。[[DateValue]] 内部槽是此 Date 所表示的时间值