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 value)。
  2. 如果 radixundefined,则令 radixMV 为 10。
  3. 否则,令 radixMV 为 ? ToIntegerOrInfinity(radix)。
  4. 如果 radixMV 不在从 2 到 36 的闭区间内,则抛出 RangeError 异常。
  5. 返回 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 value)。
  2. 如果 radixundefined,则令 radixMV 为 10。
  3. 否则,令 radixMV 为 ? ToIntegerOrInfinity(radix)。
  4. 如果 radixMV 不在从 2 到 36 的闭区间内,则抛出 RangeError 异常。
  5. 返回 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 日开始时的午夜作为 epoch,并且把每一天都计为正好 86,400 秒(每秒长度为 1000 毫秒)的定义。

ECMAScript 时间值是 Number,要么是表示毫秒精度的时间瞬间的有限整数 Number,要么是表示没有特定瞬间的 NaN。作为 24 × 60 × 60 × 1000 = 86,400,000 的倍数的时间值(即,对于某个整数 d,是 86,400,000 × d)表示从 epoch 起经过 d 个完整 UTC 日后的 UTC 日开始处的瞬间(负 d 表示早于 epoch)。其他每个有限时间值 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)

21.4.1.3 Day ( tv )

The abstract operation Day takes argument tv (a finite time value) and returns an integral Number. 它返回 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 (a finite time value) and returns an integral Number in the interval from +0𝔽 (inclusive) to msPerDay (exclusive). 它返回自 tv 所落入日期开始以来的毫秒数。 It performs the following steps when called:

  1. 返回 𝔽((tv) modulo (msPerDay))。

21.4.1.5 DaysInYear ( y )

The abstract operation DaysInYear takes argument y (an integral Number) and returns 365𝔽 or 366𝔽. 它返回年份 y 中的天数。闰年有 366 天;所有其他年份有 365 天。 It performs the following steps when called:

  1. ry(y)。
  2. 如果 (ry modulo 400) = 0,则返回 366𝔽
  3. 如果 (ry modulo 100) = 0,则返回 365𝔽
  4. 如果 (ry modulo 4) = 0,则返回 366𝔽
  5. 返回 365𝔽

21.4.1.6 DayFromYear ( y )

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

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

21.4.1.7 TimeFromYear ( y )

The abstract operation TimeFromYear takes argument y (an integral Number) and returns a time value. 它返回年份 y 开始处的时间值。 It performs the following steps when called:

  1. 返回 msPerDay × DayFromYear(y)。

21.4.1.8 YearFromTime ( tv )

The abstract operation YearFromTime takes argument tv (a finite time value) and returns an integral Number. 它返回 tv 所落入的年份。 It performs the following steps when called:

  1. 返回最大的整数 Number y(最接近 +∞),使得 TimeFromYear(y) ≤ tv

21.4.1.9 DayWithinYear ( tv )

The abstract operation DayWithinYear takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 365𝔽. It performs the following steps when called:

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

21.4.1.10 InLeapYear ( tv )

The abstract operation InLeapYear takes argument tv (a finite time value) and returns +0𝔽 or 1𝔽. 如果 tv 位于闰年内,则返回 1𝔽;否则返回 +0𝔽。 It performs the following steps when called:

  1. 如果 DaysInYear(YearFromTime(tv)) 是 366𝔽,则返回 1𝔽
  2. 返回 +0𝔽

21.4.1.11 MonthFromTime ( tv )

The abstract operation MonthFromTime takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 11𝔽. 它返回一个 Number,用于标识 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.12 DateFromTime ( tv )

The abstract operation DateFromTime takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from 1𝔽 to 31𝔽. 它返回 tv 所落入月份中的日期。 It performs the following steps when called:

  1. inLeapYearInLeapYear(tv)。
  2. dayWithinYearDayWithinYear(tv)。
  3. monthMonthFromTime(tv)。
  4. 如果 month+0𝔽,则返回 dayWithinYear + 1𝔽
  5. 如果 month1𝔽,则返回 dayWithinYear - 30𝔽
  6. 如果 month2𝔽,则返回 dayWithinYear - 58𝔽 - inLeapYear
  7. 如果 month3𝔽,则返回 dayWithinYear - 89𝔽 - inLeapYear
  8. 如果 month4𝔽,则返回 dayWithinYear - 119𝔽 - inLeapYear
  9. 如果 month5𝔽,则返回 dayWithinYear - 150𝔽 - inLeapYear
  10. 如果 month6𝔽,则返回 dayWithinYear - 180𝔽 - inLeapYear
  11. 如果 month7𝔽,则返回 dayWithinYear - 211𝔽 - inLeapYear
  12. 如果 month8𝔽,则返回 dayWithinYear - 242𝔽 - inLeapYear
  13. 如果 month9𝔽,则返回 dayWithinYear - 272𝔽 - inLeapYear
  14. 如果 month10𝔽,则返回 dayWithinYear - 303𝔽 - inLeapYear
  15. 断言:month11𝔽
  16. 返回 dayWithinYear - 333𝔽 - inLeapYear

21.4.1.13 WeekDay ( tv )

The abstract operation WeekDay takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 6𝔽. 它返回一个 Number,用于标识 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𝔽) modulo 7)。

21.4.1.14 HourFromTime ( tv )

The abstract operation HourFromTime takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 23𝔽. 它返回 tv 所落入日期中的小时。 It performs the following steps when called:

  1. 返回 𝔽(floor((tv / msPerHour)) modulo HoursPerDay)。

21.4.1.15 MinFromTime ( tv )

The abstract operation MinFromTime takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 59𝔽. 它返回 tv 所落入小时中的分钟。 It performs the following steps when called:

  1. 返回 𝔽(floor((tv / msPerMinute)) modulo MinutesPerHour)。

21.4.1.16 SecFromTime ( tv )

The abstract operation SecFromTime takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 59𝔽. 它返回 tv 所落入分钟中的秒。 It performs the following steps when called:

  1. 返回 𝔽(floor((tv / msPerSecond)) modulo SecondsPerMinute)。

21.4.1.17 msFromTime ( tv )

The abstract operation msFromTime takes argument tv (a finite time value) and returns an integral Number in the inclusive interval from +0𝔽 to 999𝔽. 它返回 tv 所落入秒中的毫秒。 It performs the following steps when called:

  1. 返回 𝔽((tv) modulo (msPerSecond))。

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

The abstract operation GetUTCEpochNanoseconds takes arguments year (an integer), month (an integer in the inclusive interval from 1 to 12), day (an integer in the inclusive interval from 1 to 31), hour (an integer in the inclusive interval from 0 to 23), minute (an integer in the inclusive interval from 0 to 59), second (an integer in the inclusive interval from 0 to 59), millisecond (an integer in the inclusive interval from 0 to 999), microsecond (an integer in the inclusive interval from 0 to 999), and nanosecond (an integer in the inclusive interval from 0 to 999) and returns a BigInt. 返回值表示自 epoch 以来的纳秒数,该值对应于给定的 ISO 8601 日历日期和 UTC 挂钟时间。 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) × 106 + microsecond × 103 + nanosecond)。

21.4.1.19 时区标识符

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

主时区标识符是某个可用命名时区的首选标识符。 非主时区标识符是某个可用命名时区的标识符,且不是主时区标识符。 可用命名时区标识符要么是主时区标识符,要么是非主时区标识符。 每个可用命名时区标识符都恰好关联到一个可用命名时区。 每个可用命名时区都恰好关联到一个主时区标识符,并关联到零个或更多非主时区标识符。

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

遵循 ECMA-402 国际化 API 规范中所述时区要求的实现称为时区感知。 时区感知实现必须支持与 IANA Time Zone Database 的 Zone 和 Link 名称对应的可用命名时区,并且只能支持这样的名称。 在时区感知实现中,主时区标识符分别是 IANA Time Zone Database 中的 Zone 名称,非主时区标识符是 Link 名称,但 ECMA-402 规范中规定的 AvailableNamedTimeZoneIdentifiers 特别覆盖的情况除外。 仍建议不支持完整 IANA Time Zone Database 的实现使用 IANA Time Zone Database 名称作为表示时区的标识符。

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

The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (a String), year (an integer), month (an integer in the inclusive interval from 1 to 12), day (an integer in the inclusive interval from 1 to 31), hour (an integer in the inclusive interval from 0 to 23), minute (an integer in the inclusive interval from 0 to 59), second (an integer in the inclusive interval from 0 to 59), millisecond (an integer in the inclusive interval from 0 to 999), microsecond (an integer in the inclusive interval from 0 to 999), and nanosecond (an integer in the inclusive interval from 0 to 999) and returns a List of BigInts. 返回的 List 中的每个值都表示自 epoch 以来的纳秒数,该值对应于由 timeZoneIdentifier 标识的命名时区中的给定 ISO 8601 日历日期和挂钟时间。

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

GetNamedTimeZoneEpochNanoseconds 的默认实现(用于不包含任何时区本地政治规则的 ECMAScript 实现)在被调用时执行以下步骤:

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

要求时区感知实现(并建议所有其他实现)使用 IANA Time Zone Database 的时区信息 https://www.iana.org/time-zones/

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 (a String) and epochNanoseconds (a BigInt) and returns an integer.

返回的整数表示由 timeZoneIdentifier 标识的命名时区,在相对于 epochepochNanoseconds 对应的瞬间相对于 UTC 的偏移,两者都以纳秒为单位。

GetNamedTimeZoneOffsetNanoseconds 的默认实现(用于不包含任何时区本地政治规则的 ECMAScript 实现)在被调用时执行以下步骤:

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

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

21.4.1.22 Time Zone Identifier Record

Time Zone Identifier Record 是一种 Record,用于描述可用命名时区标识符及其对应的主时区标识符

Time Zone Identifier Record 具有 Table 60 中列出的字段。

Table 60: Time Zone Identifier Record 字段
字段名 含义
[[Identifier]] a String 实现支持的可用命名时区标识符
[[PrimaryIdentifier]] a String [[Identifier]] 解析到的主时区标识符
Note

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

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns a List of Time Zone Identifier Records. 其结果描述此实现中的所有可用命名时区标识符,以及每个可用命名时区标识符对应的主时区标识符。 该 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. recordTime 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 a String. 它返回一个表示宿主环境当前时区的 String,该 String 要么是表示 UTC 偏移且使 IsTimeZoneOffsetString 返回 true 的 String,要么是主时区标识符。 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 (a finite time value) and returns an integral 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) × 106))。
  4. offsetMstruncate(offsetNs / 106)。
  5. 返回 tv + 𝔽(offsetMs)。
Note 1

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

Note 2

要求时区感知实现(并建议所有其他实现)使用 IANA Time Zone Database 的时区信息 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 (a Number) and returns a time value. 它将 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)), (msFromTime(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)), (msFromTime(tBefore)), 0, 0),其中 tBefore 是小于 t 且使 possibleInstantsBefore 非空的最大整数 Number(即,tBefore 表示转换前的最后一个本地时间)。
      3. disambiguatedInstantpossibleInstantsBefore 的最后一个元素。
    5. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant)。
  5. offsetMstruncate(offsetNs / 106)。
  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 Time Zone Database 的时区信息 https://www.iana.org/time-zones/

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 (a Number), min (a Number), sec (a Number), and ms (a Number) and returns a 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 (a Number), month (a Number), and date (a Number) and returns a finite Number or 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. ymy + 𝔽(floor((m) / 12))。
  6. 如果 ym 不是有限的,则返回 NaN
  7. mn𝔽((m) modulo 12)。
  8. 找到一个有限时间值 tv,使得 YearFromTime(tv) 是 ymMonthFromTime(tv) 是 mn,并且 DateFromTime(tv) 是 1𝔽;但如果这不可能(因为某个实参超出范围),则返回 NaN
  9. 返回 Day(tv) + dt - 1𝔽

21.4.1.29 MakeDate ( day, time )

The abstract operation MakeDate takes arguments day (a Number) and time (a Number) and returns a finite Number or 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 (a Number) and returns an integral Number or 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 (a Number) and returns a time value. 它计算毫秒数。 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。后一种形式作为“日历日结束”的这种解释与 ISO 8601 一致,尽管该规范将其保留用于描述时间区间,并且不允许在单个时间点的表示中使用它。

Note 2

不存在指定 CET、EST 等民用时区缩写的国际标准,并且有时同一个缩写甚至会用于两个非常不同的时区。因此,ISO 8601 和此格式都指定时区偏移的数字表示。

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

带扩展年份的 date-time values 示例:

-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 (a String) and returns a Boolean. 返回值指示 offsetString 是否符合 UTCOffset 给出的文法。 It performs the following steps when called:

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

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

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

  1. parseResultParseText(offsetString, UTCOffset)。
  2. 断言:parseResult 不是错误列表。
  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 × 60 + minutes) × 60 + seconds) × 109 + 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 value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 NaN
  5. 返回 DateFromTime(LocalTime(tv))。

21.4.4.3 Date.prototype.getDay ( )

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

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

21.4.4.4 Date.prototype.getFullYear ( )

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

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

21.4.4.5 Date.prototype.getHours ( )

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

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

21.4.4.6 Date.prototype.getMilliseconds ( )

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

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

21.4.4.7 Date.prototype.getMinutes ( )

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

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

21.4.4.8 Date.prototype.getMonth ( )

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

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

21.4.4.9 Date.prototype.getSeconds ( )

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

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

21.4.4.10 Date.prototype.getTime ( )

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

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

21.4.4.11 Date.prototype.getTimezoneOffset ( )

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

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

21.4.4.12 Date.prototype.getUTCDate ( )

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

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

21.4.4.13 Date.prototype.getUTCDay ( )

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

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

21.4.4.14 Date.prototype.getUTCFullYear ( )

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

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

21.4.4.15 Date.prototype.getUTCHours ( )

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

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

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

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

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

21.4.4.17 Date.prototype.getUTCMinutes ( )

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

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

21.4.4.18 Date.prototype.getUTCMonth ( )

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

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

21.4.4.19 Date.prototype.getUTCSeconds ( )

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

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

21.4.4.20 Date.prototype.setDate ( date )

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

  1. dateObjthis value。
  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 value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. y 为 ? ToNumber(year)。
  5. 如果 tvNaN,则将 tv 设置为 +0𝔽;否则将 tv 设置为 LocalTime(tv)。
  6. 如果 month 存在,则令 m 为 ? ToNumber(month);否则令 mMonthFromTime(tv)。
  7. 如果 date 存在,则令 dt 为 ? ToNumber(date);否则令 dtDateFromTime(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 value。
  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 不存在,则令 mMinFromTime(tv)。
  11. 如果 sec 不存在,则令 sSecFromTime(tv)。
  12. 如果 ms 不存在,则令 millimsFromTime(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 value。
  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 value。
  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 不存在,则令 sSecFromTime(tv)。
  10. 如果 ms 不存在,则令 millimsFromTime(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 value。
  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 不存在,则令 dtDateFromTime(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 value。
  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 不存在,则令 millimsFromTime(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 value。
  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 value。
  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 value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则将 tv 设置为 +0𝔽
  5. y 为 ? ToNumber(year)。
  6. 如果 month 存在,则令 m 为 ? ToNumber(month);否则令 mMonthFromTime(tv)。
  7. 如果 date 存在,则令 dt 为 ? ToNumber(date);否则令 dtDateFromTime(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 value。
  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 不存在,则令 mMinFromTime(tv)。
  10. 如果 sec 不存在,则令 sSecFromTime(tv)。
  11. 如果 ms 不存在,则令 millimsFromTime(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 value。
  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 value。
  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 不存在,则令 sSecFromTime(tv)。
  9. 如果 ms 不存在,则令 millimsFromTime(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 value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. m 为 ? ToNumber(month)。
  5. 如果 date 存在,则令 dt 为 ? ToNumber(date)。
  6. 如果 tvNaN,则返回 NaN
  7. 如果 date 不存在,则令 dtDateFromTime(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 value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. s 为 ? ToNumber(sec)。
  5. 如果 ms 存在,则令 milli 为 ? ToNumber(ms)。
  6. 如果 tvNaN,则返回 NaN
  7. 如果 ms 不存在,则令 millimsFromTime(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 (a Number, but not NaN) and returns a 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 (a Number, but not NaN) and returns a String. It performs the following steps when called:

  1. weekdayTable 61 中 Number 为 WeekDay(tv) 的条目的 Name。
  2. monthTable 62 中 Number 为 MonthFromTime(tv) 的条目的 Name。
  3. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)。
  4. yvYearFromTime(tv)。
  5. 如果 yv+0𝔽yv > +0𝔽,则令 yearSign 为空 String;否则令 yearSign"-"
  6. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)。
  7. 返回 weekday、码元 0x0020(SPACE)、month、码元 0x0020(SPACE)、day、码元 0x0020(SPACE)、yearSignpaddedYear字符串连接
Table 61: 星期中各天的名称
Number Name
+0𝔽 "Sun"
1𝔽 "Mon"
2𝔽 "Tue"
3𝔽 "Wed"
4𝔽 "Thu"
5𝔽 "Fri"
6𝔽 "Sat"
Table 62: 一年中各月份的名称
Number Name
+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 (an integral Number) and returns a String. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()。
  2. 如果 IsTimeZoneOffsetString(systemTimeZoneIdentifier) 是 true,则
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)。
  3. 否则,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((tv) × 106))。
  4. offset𝔽(truncate(offsetNs / 106))。
  5. 如果 offset+0𝔽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(SPACE)、码元 0x0028(LEFT PARENTHESIS)、一个由实现定义的时区名称和码元 0x0029(RIGHT PARENTHESIS)的字符串连接
  10. 返回 offsetSignoffsetHouroffsetMintzName字符串连接

21.4.4.41.4 ToDateString ( tv )

The abstract operation ToDateString takes argument tv (an integral Number or NaN) and returns a 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 value。
  2. 执行 ? RequireInternalSlot(dateObj, [[DateValue]])。
  3. tvdateObj.[[DateValue]]
  4. 如果 tvNaN,则返回 "Invalid Date"
  5. weekdayTable 61 中 Number 为 WeekDay(tv) 的条目的 Name。
  6. monthTable 62 中 Number 为 MonthFromTime(tv) 的条目的 Name。
  7. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)。
  8. yvYearFromTime(tv)。
  9. 如果 yv+0𝔽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 所表示的时间值