21 숫자와 날짜 (Numbers and Dates)

21.1 Number 객체 (Number Objects)

21.1.1 Number 생성자 (The Number Constructor)

Number 생성자는 다음과 같다:

  • %Number% 이다.
  • 전역 객체 "Number" 프로퍼티의 초기 값이다.
  • 생성자로 호출될 때 새로운 Number 객체를 생성하고 초기화한다.
  • 생성자가 아니라 함수로 호출될 때 타입 변환을 수행한다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Number 동작을 상속하려는 서브클래스 생성자[[NumberData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 Number 생성자에 대한 super 호출을 포함해야 한다.

21.1.1.1 Number ( value )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. value 가 존재하면
    1. prim 을 ? ToNumeric(value) 로 둔다.
    2. prim 이 BigInt 이면 n𝔽((prim)) 로 둔다.
    3. 그렇지 않으면 nprim 으로 둔다.
  2. 그렇지 않으면,
    1. n+0𝔽 로 둔다.
  3. NewTarget 이 undefined 이면 n 을 반환한다.
  4. O 를 ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] ») 로 둔다.
  5. O.[[NumberData]]n 으로 설정한다.
  6. O 를 반환한다.

21.1.2 Number 생성자의 프로퍼티 (Properties of the Number Constructor)

Number 생성자는:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티들을 가진다:

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 가 finite 가 아니면 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

이 함수는 인수를 NaN 인지 판정하기 전에 Number 로 변환한다는 점에서 전역 isNaN 함수(19.2.3)와 다르다.

21.1.2.5 Number.isSafeInteger ( number )

Note

정수 n 이 "안전한 정수(safe integer)" 이려면, 그리고 그럴 때에 한해 n 의 Number 값이 다른 어떤 정수의 Number 값과 같지 않아야 한다.

이 함수는 호출될 때 다음 단계를 수행한다:

  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 배정밀도 이진 표현에서 가장 작은 가능한 값은 비정규(denormalized) 수이다. 구현이 비정규 값을 지원하지 않는다면 Number.MIN_VALUE 의 값은 구현이 실제로 표현할 수 있는 가장 작은 0이 아닌 양의 값이어야 한다.

이 프로퍼티는 { [[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 프로토타입 객체의 프로퍼티 (Properties of the Number Prototype Object)

Number 프로토타입 객체는:

  • %Number.prototype% 이다.
  • ordinary 객체이다.
  • 자체가 Number 객체이며 값이 +0𝔽[[NumberData]] 내부 슬롯을 가진다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.

명시적으로 달리 언급되지 않는 한 아래 정의된 Number 프로토타입 객체의 메서드는 generic 하지 않으며, 그들에게 전달된 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 )

이 메서드는 이 Number 값을 십진 지수 표기(유효숫자 부분의 소수점 앞에 한 자리, 소수점 뒤에 fractionDigits 자리)로 표현한 String 을 반환한다. fractionDigitsundefined 이면, (항상 지수 표기로 출력된다는 점을 제외하면 ToString 과 같이) Number 를 유일하게 지정하는 데 필요한 만큼의 유효숫자 자릿수를 포함한다.

호출될 때 다음 단계를 수행한다:

  1. x 를 ? ThisNumberValue(this value) 로 둔다.
  2. f 를 ? ToIntegerOrInfinity(fractionDigits) 로 둔다.
  3. 단언: fractionDigitsundefined 이면 f 는 0.
  4. x 가 finite 가 아니면 Number::toString(x, 10) 반환.
  5. f < 0 또는 f > 100 이면 RangeError 예외 throw.
  6. x(x) 로 설정.
  7. s 를 빈 문자열로 둔다.
  8. x < 0 이면
    1. s = "-".
    2. x = -x.
  9. x = 0 이면
    1. mf + 1 번의 코드 유닛 0x0030 (DIGIT ZERO) 로 구성된 String 값으로 둔다.
    2. e = 0.
  10. 그렇지 않으면,
    1. fractionDigitsundefined 가 아니면
      1. 10fn < 10f + 1 이고 n × 10e - f - x 가 0 에 가장 가깝도록 하는 정수 e, n 을 둔다. 그러한 ( e, n ) 이 두 개 있으면 n × 10e - f 가 더 큰 것을 고른다.
    2. 그렇지 않으면,
      1. ff ≥ 0, 10ffn < 10ff + 1, 𝔽(n × 10e - ff) 가 𝔽(x), 그리고 ff 가 가능한 한 작은 정수인 e, n, ff 를 둔다. 이때 n 의 십진 표현은 ff + 1 자리이며, n 은 10 으로 나누어떨어지지 않고, n 의 최하위 자리는 유일하게 결정되지 않을 수 있다.
      2. f = ff.
    3. mn 의 십진 표현의 자릿수들(선행 0 없이 순서대로)로 구성된 String 값으로 둔다.
  11. f ≠ 0 이면
    1. a = m 의 첫 코드 유닛.
    2. b = 나머지 f 개의 코드 유닛.
    3. m = a, ".", b 의 문자열 연결.
  12. e = 0 이면
    1. c = "+".
    2. d = "0".
  13. 그렇지 않으면,
    1. e > 0 이면
      1. c = "+".
    2. 그렇지 않으면
      1. 단언: e < 0.
      2. c = "-".
      3. e = -e.
    3. d = e 의 십진 표현 자릿수들(선행 0 없이)로 구성된 String 값.
  14. m = m, "e", c, d 의 문자열 연결.
  15. sm 의 문자열 연결을 반환한다.
Note

위 규칙이 요구하는 것보다 더 정확한 변환을 제공하는 구현은 step 10.b.i 의 다음 대안 버전을 지침으로 사용하는 것이 권장된다:

  1. f ≥ 0, 10fn < 10f + 1, 𝔽(n × 10e - f) 가 𝔽(x), 그리고 f 가 가능한 한 작은 정수인 e, n, f 를 둔다. n 의 후보가 여러 개면 𝔽(n × 10e - f) 가 𝔽(x) 에 가장 가까운 값을 선택한다. 그런 후보가 두 개면 짝수인 것을 선택한다.

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

Note 1

이 메서드는 이 Number 값을 십진 고정 소수점 표기로 표시한 String 을 반환하며 소수점 이하 자리수는 fractionDigits 이다. fractionDigitsundefined 이면 0 으로 간주한다.

호출될 때 다음 단계를 수행한다:

  1. x 를 ? ThisNumberValue(this value) 로 둔다.
  2. f 를 ? ToIntegerOrInfinity(fractionDigits) 로 둔다.
  3. 단언: fractionDigitsundefined 이면 f = 0.
  4. f 가 finite 가 아니면 RangeError 예외 throw.
  5. f < 0 또는 f > 100 이면 RangeError 예외 throw.
  6. x 가 finite 가 아니면 Number::toString(x, 10) 반환.
  7. x = (x).
  8. s = 빈 문자열.
  9. x < 0 이면
    1. s = "-".
    2. x = -x.
  10. x ≥ 1021 이면
    1. m = ! ToString(𝔽(x)).
  11. 그렇지 않으면
    1. nn / 10f - x 가 0 에 가장 가깝도록 하는 정수로 둔다. 그런 n 이 두 개면 더 큰 n 선택.
    2. n = 0 이면 m = "0"; 아니면 m = n 의 십진 표현 자릿수(선행 0 없이).
    3. f ≠ 0 이면
      1. k = m 의 길이.
      2. kf 이면
        1. z = f + 1 - k 번의 코드 유닛 0x0030 (DIGIT ZERO) 로 구성된 String.
        2. m = zm 의 문자열 연결.
        3. k = f + 1.
      3. a = m 의 처음 k - f 코드 유닛.
      4. b = 나머지 f 코드 유닛.
      5. m = a, ".", b 의 문자열 연결.
  12. sm 의 문자열 연결을 반환한다.
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 명세에 따라 구현해야 한다. 구현이 ECMA-402 API 를 포함하지 않는 경우 다음 명세가 사용된다:

이 메서드는 호스트 환경의 현재 로케일 관례에 따라 포맷된 이 Number 값을 나타내는 String 값을 생성한다. 이 메서드는 구현 정의이며 toString 과 같은 결과를 반환하는 것이 허용되나 권장되지는 않는다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의된다; ECMA-402 를 지원하지 않는 구현은 그 매개변수 위치를 다른 용도로 사용해서는 안 된다.

21.1.3.5 Number.prototype.toPrecision ( precision )

이 메서드는 이 Number 값을 (유효숫자 부분 소수점 앞에 한 자리, 소수점 뒤에 precision - 1 자리)인 십진 지수 표기 또는 precision 개의 유효숫자를 갖는 십진 고정 표기 중 하나로 표현한 String 을 반환한다. precisionundefined 이면 대신 ToString 을 호출한다.

호출될 때 다음 단계를 수행한다:

  1. x 를 ? ThisNumberValue(this value) 로 둔다.
  2. precisionundefined 이면 ! ToString(x) 반환.
  3. p 를 ? ToIntegerOrInfinity(precision) 로 둔다.
  4. x 가 finite 가 아니면 Number::toString(x, 10) 반환.
  5. p < 1 또는 p > 100 이면 RangeError 예외 throw.
  6. x = (x).
  7. s = 빈 문자열.
  8. x < 0 이면
    1. s = 코드 유닛 0x002D (HYPHEN-MINUS).
    2. x = -x.
  9. x = 0 이면
    1. m = p 번의 코드 유닛 0x0030 (DIGIT ZERO) 로 구성된 String.
    2. e = 0.
  10. 그렇지 않으면
    1. 10p - 1n < 10p 이고 n × 10e - p + 1 - x 가 0 에 가장 가깝도록 하는 정수 e, n 을 둔다. 그러한 ( e, n ) 이 두 개면 n × 10e - p + 1 이 더 큰 것을 선택.
    2. mn 의 십진 표현 자릿수들(선행 0 없이)로 구성된 String 값으로 둔다.
    3. e < -6 또는 ep 이면
      1. 단언: e ≠ 0.
      2. p ≠ 1 이면
        1. a = m 의 첫 코드 유닛.
        2. b = 나머지 p - 1 코드 유닛.
        3. m = a, ".", b 의 문자열 연결.
      3. e > 0 이면
        1. c = 코드 유닛 0x002B (PLUS SIGN).
      4. 그렇지 않으면
        1. 단언: e < 0.
        2. c = 코드 유닛 0x002D (HYPHEN-MINUS).
        3. e = -e.
      5. d = e 의 십진 표현 자릿수들(선행 0 없이)로 구성된 String.
      6. s, m, 코드 유닛 0x0065 (e), c, d 의 문자열 연결을 반환.
  11. e = p - 1 이면 sm 의 문자열 연결 반환.
  12. e ≥ 0 이면
    1. m = 처음 e + 1 코드 유닛, 코드 유닛 0x002E (FULL STOP), 그리고 남은 p - (e + 1) 코드 유닛의 문자열 연결.
  13. 그렇지 않으면
    1. m = 코드 유닛 0x0030 (DIGIT ZERO), 코드 유닛 0x002E (FULL STOP), -(e + 1) 번의 코드 유닛 0x0030 (DIGIT ZERO), 그리고 String m 의 문자열 연결.
  14. sm 의 문자열 연결 반환.

21.1.3.6 Number.prototype.toString ( [ radix ] )

Note

선택적 radix2𝔽 에서 36𝔽 사이(포함)의 정수 Number 값이어야 한다. radixundefined 이면 10𝔽radix 값으로 사용된다.

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. x 를 ? ThisNumberValue(this value) 로 둔다.
  2. radixundefined 이면 radixMV = 10.
  3. 그렇지 않으면 radixMV = ? ToIntegerOrInfinity(radix).
  4. radixMV 가 2 이상 36 이하 구간에 없으면 RangeError 예외 throw.
  5. Number::toString(x, radixMV) 반환.

이 메서드는 generic 하지 않으며, this 값이 Number 또는 Number 객체가 아니면 TypeError 예외를 던진다. 따라서 다른 종류의 객체로 이전하여 메서드로 사용할 수 없다.

이 메서드의 "length" 프로퍼티 값은 1𝔽 이다.

21.1.3.7 Number.prototype.valueOf ( )

  1. ThisNumberValue(this value) 를 반환한다.

21.1.3.7.1 ThisNumberValue ( value )

The abstract operation ThisNumberValue takes argument value (ECMAScript 언어 값) and returns Number 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. value 가 Number 이면 value 반환.
  2. value 가 Object 이고 [[NumberData]] 내부 슬롯을 가지면
    1. n = value.[[NumberData]].
    2. 단언: n 은 Number.
    3. n 반환.
  3. TypeError 예외 throw.

21.1.4 Number 인스턴스의 프로퍼티 (Properties of Number Instances)

Number 인스턴스는 Number 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. Number 인스턴스는 또한 [[NumberData]] 내부 슬롯을 가진다. [[NumberData]] 내부 슬롯은 이 Number 객체가 나타내는 Number 값이다.

21.2 BigInt 객체 (BigInt Objects)

21.2.1 BigInt 생성자 (The BigInt Constructor)

BigInt 생성자는 다음과 같다:

  • %BigInt% 이다.
  • 전역 객체"BigInt" 프로퍼티 초기 값이다.
  • 생성자가 아니라 함수로 호출될 때 타입 변환을 수행한다.
  • new 연산자와 함께 사용하거나 서브클래싱하도록 의도되지 않았다. 클래스 정의의 extends 절 값으로 사용할 수는 있으나 BigInt 생성자에 대한 super 호출은 예외를 발생시킨다.

21.2.1.1 BigInt ( value )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. NewTarget 이 undefined 가 아니면 TypeError 예외를 throw 한다.
  2. prim 을 ? ToPrimitive(value, number) 로 둔다.
  3. prim 이 Number 이면 ? NumberToBigInt(prim) 를 반환한다.
  4. 그렇지 않으면 ? ToBigInt(prim) 를 반환한다.

21.2.1.1.1 NumberToBigInt ( number )

The abstract operation NumberToBigInt takes argument number (a Number) and returns BigInt 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. number 가 정수(Number)가 아니면 RangeError 예외를 throw 한다.
  2. ((number)) 를 반환한다.

21.2.2 BigInt 생성자의 프로퍼티 (Properties of the BigInt Constructor)

BigInt 생성자는:

  • 값이 %Function.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 다음 프로퍼티들을 가진다:

21.2.2.1 BigInt.asIntN ( bits, bigint )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. bits 를 ? ToIndex(bits) 로 설정한다.
  2. bigint 를 ? ToBigInt(bigint) 로 설정한다.
  3. mod(bigint) mod 2bits 로 둔다.
  4. mod ≥ 2bits - 1 이면 (mod - 2bits) 를 반환; 그렇지 않으면 (mod) 를 반환한다.

21.2.2.2 BigInt.asUintN ( bits, bigint )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. bits 를 ? ToIndex(bits) 로 설정한다.
  2. bigint 를 ? ToBigInt(bigint) 로 설정한다.
  3. ((bigint) mod 2bits) 를 반환한다.

21.2.2.3 BigInt.prototype

BigInt.prototype 의 초기 값은 BigInt 프로토타입 객체이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.

21.2.3 BigInt 프로토타입 객체의 프로퍼티 (Properties of the BigInt Prototype Object)

BigInt 프로토타입 객체는:

  • %BigInt.prototype% 이다.
  • ordinary 객체이다.
  • BigInt 객체가 아니며 [[BigIntData]] 내부 슬롯을 갖지 않는다.
  • 값이 %Object.prototype%[[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 명세에 따라 구현해야 한다. 구현이 ECMA-402 API 를 포함하지 않는 경우 아래 명세가 사용된다:

이 메서드는 호스트 환경의 현재 로케일 관례에 따라 포맷된 이 BigInt 값을 나타내는 String 값을 생성한다. 이 메서드는 구현 정의이며 toString 과 동일한 결과를 반환하는 것이 허용되나 권장되지는 않는다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되며, ECMA-402 지원이 없는 구현은 해당 매개변수 위치를 다른 목적으로 사용해서는 안 된다.

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

Note

선택적 radix2𝔽 이상 36𝔽 이하(포함)의 정수 Number 값이어야 한다. radixundefined 이면 10𝔽radix 값으로 사용된다.

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. x 를 ? ThisBigIntValue(this value) 로 둔다.
  2. radixundefined 이면 radixMV = 10.
  3. 그렇지 않으면 radixMV = ? ToIntegerOrInfinity(radix).
  4. radixMV 가 2 이상 36 이하 구간에 없으면 RangeError 예외를 throw 한다.
  5. BigInt::toString(x, radixMV) 를 반환한다.

이 메서드는 generic 하지 않으며 this 값이 BigInt 또는 BigInt 객체가 아니면 TypeError 예외를 던진다. 따라서 다른 종류의 객체로 이전하여 메서드로 사용할 수 없다.

21.2.3.4 BigInt.prototype.valueOf ( )

  1. ThisBigIntValue(this value) 를 반환한다.

21.2.3.4.1 ThisBigIntValue ( value )

The abstract operation ThisBigIntValue takes argument value (an ECMAScript language value) and returns BigInt 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. value 가 BigInt 이면 value 를 반환한다.
  2. value 가 Object 이고 [[BigIntData]] 내부 슬롯을 가진다면
    1. 단언: value.[[BigIntData]] 는 BigInt 이다.
    2. value.[[BigIntData]] 를 반환한다.
  3. TypeError 예외를 throw 한다.

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 String 값 "BigInt" 이다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.

21.2.4 BigInt 인스턴스의 프로퍼티 (Properties of BigInt Instances)

BigInt 인스턴스는 BigInt 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. BigInt 인스턴스는 또한 [[BigIntData]] 내부 슬롯을 가진다. [[BigIntData]] 내부 슬롯은 해당 BigInt 객체가 나타내는 BigInt 값이다.

21.3 Math 객체 (The Math Object)

Math 객체는 다음과 같다:

  • %Math% 이다.
  • 전역 객체 "Math" 프로퍼티의 초기 값이다.
  • ordinary 객체이다.
  • 값이 %Object.prototype%[[Prototype]] 내부 슬롯을 가진다.
  • 함수 객체가 아니다.
  • [[Construct]] 내부 메서드를 가지지 않아 new 연산자로 생성자로 사용할 수 없다.
  • [[Call]] 내부 메서드를 가지지 않아 함수로 호출될 수 없다.
Note

이 명세에서 “the Number value for x” 라는 구문은 6.1.6.1 에 정의된 기술적 의미를 가진다.

21.3.1 Math 객체의 값 프로퍼티 (Value Properties of the Math Object)

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 객체의 함수 프로퍼티 (Function Properties of the Math Object)

Note

acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log, log1p, log2, log10, pow, random, sin, sinh, tan, tanh 함수의 동작은 경계 사례에 대해 특정 결과를 요구하는 것 외에는 여기서 정확히 규정되지 않는다. 다른 인수 값에 대해서는 익숙한 수학 함수의 결과를 근사하도록 의도되며, 근사 알고리즘 선택에 다소 재량이 허용된다. 일반적인 의도는 구현자가 해당 하드웨어 플랫폼에서 C 프로그래머가 사용할 수 있는 동일한 수학 라이브러리를 ECMAScript 에도 사용할 수 있도록 하는 것이다.

알고리즘 선택은 구현에 맡기지만(표준에서 강제하지 않음) IEEE 754-2019 산술 근사 알고리즘을 포함하는 Sun Microsystems 의 자유 배포 수학 라이브러리 fdlibm 사용이 권장된다 (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. nNaN 이거나 n > 1𝔽 이거나 n < -1𝔽 이면 NaN 반환.
  3. n1𝔽 이면 +0𝔽 반환.
  4. (n) 의 역코사인을 나타내는 구현 근사 Number 값을 반환한다.

21.3.2.3 Math.acosh ( x )

x 의 역쌍곡코사인(acosh)을 반환한다.

호출될 때 다음 단계를 수행한다:

  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 의 역쌍곡사인(asinh)을 반환한다.

호출될 때 다음 단계를 수행한다:

  1. n 을 ? ToNumber(x) 로 둔다.
  2. n 이 finite 가 아니거나 +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 의 역쌍곡탄젠트(atanh)를 반환한다.

호출될 때:

  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 )

두 인수 y, x 의 몫 y / x 에 대한 역탄젠트를 반환하며, yx 의 부호를 사용해 사분면을 결정한다. 2인수 역탄젠트에서 y 가 첫 번째, x 가 두 번째 인수인 것은 의도적이며 전통이다. 결과는 라디안으로 -π 이상 +π 이하 구간.

호출될 때:

  1. ny = ? ToNumber(y).
  2. nx = ? ToNumber(x).
  3. ny 또는 nxNaN 이면 NaN 반환.
  4. ny = +∞𝔽 이면
    1. nx = +∞𝔽 이면 π / 4 근사값 반환.
    2. nx = -∞𝔽 이면 3π / 4 근사값 반환.
    3. 그렇지 않으면 π / 2 근사값 반환.
  5. ny = -∞𝔽 이면
    1. nx = +∞𝔽 이면 -π / 4 근사값 반환.
    2. nx = -∞𝔽 이면 -3π / 4 근사값 반환.
    3. 그렇지 않으면 -π / 2 근사값 반환.
  6. ny = +0𝔽 이면
    1. nx > +0𝔽 또는 nx = +0𝔽 이면 +0𝔽 반환.
    2. 그렇지 않으면 π 근사값 반환.
  7. ny = -0𝔽 이면
    1. nx > +0𝔽 또는 nx = +0𝔽 이면 -0𝔽 반환.
    2. 그렇지 않으면 -π 근사값 반환.
  8. 단언: ny 는 finite 이고 ±0 아님.
  9. ny > +0𝔽 이면
    1. nx = +∞𝔽 이면 +0𝔽 반환.
    2. nx = -∞𝔽 이면 π 근사값 반환.
    3. nx+0𝔽 또는 -0𝔽 이면 π / 2 근사값 반환.
  10. ny < -0𝔽 이면
    1. nx = +∞𝔽 이면 -0𝔽 반환.
    2. nx = -∞𝔽 이면 -π 근사값 반환.
    3. nx+0𝔽 또는 -0𝔽 이면 -π / 2 근사값 반환.
  11. 단언: nx 는 finite 이고 ±0 아님.
  12. rabs((ny)/(nx)) 의 역탄젠트로 둔다.
  13. nx < -0𝔽 이면
    1. ny > +0𝔽 이면 r = π - r.
    2. 그렇지 않으면 r = -π + r.
  14. 그렇지 않으면
    1. ny < -0𝔽 이면 r = -r.
  15. r 를 나타내는 구현 근사 Number 값 반환.

21.3.2.9 Math.cbrt ( x )

x 의 세제곱근을 반환한다.

호출될 때:

  1. n = ? ToNumber(x).
  2. n 이 finite 가 아니거나 +0𝔽 또는 -0𝔽 이면 n 반환.
  3. (n) 의 세제곱근을 나타내는 구현 근사 Number 값 반환.

21.3.2.10 Math.ceil ( x )

x 보다 작지 않은 가장 작은( -∞ 에 가장 가까운 ) 정수 Number 값을 반환한다. x 가 이미 정수이면 결과는 x.

호출될 때:

  1. n = ? ToNumber(x).
  2. n 이 finite 가 아니거나 ±0 이면 n 반환.
  3. n < -0𝔽 이고 n > -1𝔽 이면 -0𝔽 반환.
  4. n 이 정수이면 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비트 이진 표현에서 선행 0 비트 개수로 둔다.
  3. 𝔽(p) 를 반환한다.
Note

n+0𝔽 또는 -0𝔽 이면 32𝔽 반환. 최상위 비트가 1 이면 +0𝔽 반환.

21.3.2.12 Math.cos ( x )

라디안 인수 x 의 코사인을 반환한다.

호출될 때:

  1. n = ? ToNumber(x).
  2. n 이 finite 가 아니면 NaN 반환.
  3. n 이 ±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 이면 1𝔽 반환.
  5. (n) 의 쌍곡코사인을 나타내는 구현 근사 Number 값 반환.
Note

Math.cosh(x) = (Math.exp(x) + Math.exp(-x)) / 2.

21.3.2.14 Math.exp ( x )

x 의 지수 함수(e^x) 값을 반환한다.

호출될 때:

  1. n = ? ToNumber(x).
  2. nNaN 또는 +∞𝔽 이면 n 반환.
  3. n 이 ±0 이면 1𝔽 반환.
  4. n-∞𝔽 이면 +0𝔽 반환.
  5. (n) 의 지수 함수를 나타내는 구현 근사 Number 값 반환.

21.3.2.15 Math.expm1 ( x )

e^x - 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.

호출될 때:

  1. n = ? ToNumber(x).
  2. n 이 finite 가 아니거나 ±0 이면 n 반환.
  3. n < 1𝔽 그리고 n > +0𝔽 이면 +0𝔽 반환.
  4. n 이 정수이면 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, ±∞ 중 하나이면 n 반환.
  4. n32 = n 을 roundTiesToEven 모드로 IEEE 754-2019 binary32 로 변환한 결과.
  5. n64 = n32IEEE 754-2019 binary64 로 변환한 결과.
  6. n64 에 대응하는 ECMAScript Number 값 반환.

21.3.2.18 Math.f16round ( x )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. n = ? ToNumber(x).
  2. nNaN 이면 NaN 반환.
  3. n 이 ±0, ±∞ 중 하나이면 n 반환.
  4. n16 = n 을 roundTiesToEven 모드로 IEEE 754-2019 binary16 으로 변환한 결과.
  5. n64 = n16IEEE 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 라이브러리 등 사용 가능. 또는 binary64→binary32 (roundTiesToEven) 후 잘못된 이중 반올림 가능성 검사, 해당 경우 mantissa 조정(odd 라운드에 해당) 후 최종 binary16 캐스팅 등으로 구현 가능.

21.3.2.19 Math.hypot ( ...args )

0개 이상의 인수에 대해 제곱들의 합의 제곱근을 반환한다.

호출될 때:

  1. coerced = 새 빈 리스트.
  2. argsarg 에 대해
    1. n = ? ToNumber(arg).
    2. coercedn 추가.
  3. coercednumber 에 대해
    1. number 가 ±∞ 이면 +∞𝔽 반환.
  4. onlyZero = true.
  5. coercednumber 에 대해
    1. numberNaN 이면 NaN 반환.
    2. number+0𝔽-0𝔽 도 아니면 onlyZero = false.
  6. onlyZerotrue 이면 +0𝔽 반환.
  7. coerced 요소들의 수학적 값 각각 제곱 합의 제곱근을 나타내는 구현 근사 Number 값 반환.

이 함수의 "length" 프로퍼티는 2𝔽 이다.

Note

두 개 이상 인수 시 단순 구현에서 발생하기 쉬운 overflow/underflow 로 인한 정밀도 손실을 피해야 한다.

21.3.2.20 Math.imul ( x, y )

이 함수는 호출될 때 다음 단계를 수행한다:

  1. a = (? ToUint32(x)).
  2. b = (? ToUint32(y)).
  3. product = (a × b) mod 232.
  4. product ≥ 231 이면 𝔽(product - 232) 반환; 아니면 𝔽(product) 반환.

21.3.2.21 Math.log ( x )

x 의 자연로그를 반환한다.

호출될 때:

  1. n = ? ToNumber(x).
  2. nNaN 또는 +∞𝔽 이면 n 반환.
  3. n = 1𝔽 이면 +0𝔽 반환.
  4. n 이 ±0 이면 -∞𝔽 반환.
  5. n < -0𝔽 이면 NaN 반환.
  6. (n) 의 자연로그를 나타내는 구현 근사 Number 값 반환.

21.3.2.22 Math.log1p ( x )

1 + x 의 자연로그를 반환하며 x 가 0 에 매우 가까울 때도 정확하도록 계산된다.

호출될 때:

  1. n = ? ToNumber(x).
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면 n 반환.
  3. n = -1𝔽 이면 -∞𝔽 반환.
  4. n < -1𝔽 이면 NaN 반환.
  5. 1 + (n) 의 자연로그를 나타내는 구현 근사 Number 값 반환.

21.3.2.23 Math.log10 ( x )

x 의 밑 10 로그를 반환한다.

호출될 때:

  1. n = ? ToNumber(x).
  2. nNaN 또는 +∞𝔽 이면 n 반환.
  3. n = 1𝔽 이면 +0𝔽 반환.
  4. n 이 ±0 이면 -∞𝔽 반환.
  5. n < -0𝔽 이면 NaN 반환.
  6. (n) 의 밑 10 로그 구현 근사 값 반환.

21.3.2.24 Math.log2 ( x )

x 의 밑 2 로그를 반환한다.

호출될 때:

  1. n = ? ToNumber(x).
  2. nNaN 또는 +∞𝔽 이면 n 반환.
  3. n = 1𝔽 이면 +0𝔽 반환.
  4. n 이 ±0 이면 -∞𝔽 반환.
  5. n < -0𝔽 이면 NaN 반환.
  6. (n) 의 밑 2 로그 구현 근사 값 반환.

21.3.2.25 Math.max ( ...args )

0개 이상의 인수에 대해 각 인수에 ToNumber 를 적용한 결과 중 최댓값을 반환한다.

호출될 때:

  1. coerced = 새 빈 리스트.
  2. argsarg 에 대해
    1. n = ? ToNumber(arg).
    2. coercedn 추가.
  3. highest = -∞𝔽.
  4. coercednumber 에 대해
    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 )

0개 이상의 인수에 대해 각 인수에 ToNumber 를 적용한 결과 중 최솟값을 반환한다.

호출될 때:

  1. coerced = 새 빈 리스트.
  2. argsarg 에 대해
    1. n = ? ToNumber(arg).
    2. coercedn 추가.
  3. lowest = +∞𝔽.
  4. coercednumber 에 대해
    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 값을 반환한다. 두 정수가 동일하게 가깝다면 +∞ 에 더 가까운 값을 반환. x 가 이미 정수면 x 반환.

호출될 때:

  1. n = ? ToNumber(x).
  2. n 이 finite 가 아니거나 정수이면 n 반환.
  3. n < 0.5𝔽 그리고 n > +0𝔽 이면 +0𝔽 반환.
  4. n < -0𝔽 그리고 n-0.5𝔽 이면 -0𝔽 반환.
  5. n 과 가장 가까운 정수 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𝔽 이거나 -0𝔽 보다 작고 -0.5𝔽 이상이면 Math.round(x)-0𝔽 반환하지만 Math.floor(x + 0.5)+0𝔽 를 반환. 또한 내부 반올림으로 인해 차이날 수 있다.

21.3.2.30 Math.sign ( x )

x 의 부호(양수/음수/0)를 나타내는 값을 반환한다.

호출될 때:

  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 이 finite 가 아니거나 ±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 )

Number 들로 이루어진 iterable 을 받아 모든 값을 더해 합을 반환한다. 어떤 값이 Number 가 아니면 TypeError 예외를 던진다.

호출될 때:

  1. RequireObjectCoercible(items) 수행.
  2. iteratorRecord = ? GetIterator(items, sync).
  3. state = minus-zero.
  4. sum = 0.
  5. count = 0.
  6. next = not-started.
  7. nextdone 이 아닐 동안 반복
    1. next = ? IteratorStepValue(iteratorRecord).
    2. nextdone 이 아니면
      1. count ≥ 253 - 1 이면
        1. NOTE: 현실적으로 도달하지 않는 단계이며 입력이 “적당한 크기” 임을 가정 가능하게 하기 위한 것.
        2. error = ThrowCompletion(새 RangeError 객체).
        3. IteratorClose(iteratorRecord, error) 반환.
      2. next 가 Number 가 아니면
        1. error = ThrowCompletion(새 TypeError 객체).
        2. IteratorClose(iteratorRecord, error) 반환.
      3. n = next.
      4. statenot-a-number 이면
        1. nNaN 이면
          1. state = not-a-number.
        2. Else if n = +∞𝔽
          1. state = minus-infinity 이면 not-a-number, 아니면 plus-infinity.
        3. Else if n = -∞𝔽
          1. state = plus-infinity 이면 not-a-number, 아니면 minus-infinity.
        4. Else if n-0𝔽 가 아니고 stateminus-zero 또는 finite 이면
          1. state = finite.
          2. sum = sum + (n).
      5. count = count + 1.
  8. state = not-a-number 이면 NaN 반환.
  9. state = plus-infinity 이면 +∞𝔽 반환.
  10. state = minus-infinity 이면 -∞𝔽 반환.
  11. state = minus-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 이 finite 가 아니거나 ±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의 시간 측정과 유사하며, 특히 전환 그레고리력(proleptic Gregorian calendar), 1970년 1월 1일 0시 UTC의 기점(epoch), 그리고 하루가 정확히 86,400초(각 초는 1000밀리초)로 구성된다는 정의를 공유합니다.

ECMAScript의 시간 값은 Number로, 밀리초 단위의 한 순간을 나타내는 유한 정수 Number이거나 특정 순간을 나타내지 않는 NaN일 수 있습니다. 24 × 60 × 60 × 1000 = 86,400,000의 배수(즉, 정수 d에 대해 86,400,000 × d)인 시간 값은 기점 이후 d일이 지난 UTC 일의 시작 순간(음수 d라면 기점 이전)을 나타냅니다. 그 외의 유한 시간 값 t는 그와 가장 가까운 이전 배수 시간 값 s를 기준으로 정의되며, s와 동일한 UTC 일 내에서 (t - s) 밀리초가 지난 순간을 나타냅니다.

시간 값은 UTC 윤초(leap seconds)를 고려하지 않습니다—양의 윤초 내의 순간을 나타내는 시간 값은 없으며, 음의 윤초로 인해 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 밀리초까지의 약간 더 작은 범위를 지원합니다. 이는 1970년 1월 1일 0시 UTC 기준으로 -100,000,000일부터 100,000,000일까지의 시간 값 범위를 제공합니다.

1970년 1월 1일 0시 UTC의 정확한 순간은 시간 값 +0𝔽으로 표현됩니다.

Note

전환 그레고리력에서는 윤년이 4로 나누어떨어지고, 400으로 나누어떨어지거나 100으로 나누어떨어지지 않는 해입니다.

전환 그레고리력의 400년 주기에는 97번의 윤년이 있습니다. 평균적으로 연간 365.2425일, 즉 31,556,952,000 밀리초가 됩니다. 따라서 Number가 밀리초 단위로 정확하게 표현할 수 있는 최대 범위는 1970년 기준으로 약 -285,426년에서 285,426년입니다. 이 절에서 명시된 시간 값의 더 작은 범위는 약 -273,790년에서 273,790년(1970년 기준)입니다.

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 ( t )

The abstract operation Day takes argument t (유한시간 값) and returns 정수 Number. t가 속한 날짜의 일 번호(day number)를 반환합니다. It performs the following steps when called:

  1. 𝔽(floor((t / msPerDay)))를 반환합니다.

21.4.1.4 TimeWithinDay ( t )

The abstract operation TimeWithinDay takes argument t (유한시간 값) and returns +0𝔽 (포함)부터 msPerDay (제외)까지의 정수 Number. t가 속한 날짜의 시작부터 지난 밀리초 수를 반환합니다. It performs the following steps when called:

  1. 𝔽((t) modulo (msPerDay))를 반환합니다.

21.4.1.5 DaysInYear ( y )

The abstract operation DaysInYear takes argument y (정수 Number) and returns 365𝔽 또는 366𝔽. y년의 일(day) 수를 반환합니다. 윤년은 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 (정수 Number) and returns 정수 Number. y년의 첫날의 일 번호(day number)를 반환합니다. It performs the following steps when called:

  1. ry(y)로 합니다.
  2. 다음 단계에서 numYears1, numYears4, numYears100, numYears400은 기점 이후 y년 시작까지 1, 4, 100, 400으로 나누어떨어지는 연도 수를 나타냅니다. y가 기점 이전이면 음수입니다.
  3. numYears1에 (ry - 1970)을 할당합니다.
  4. numYears4floor((ry - 1969) / 4)을 할당합니다.
  5. numYears100floor((ry - 1901) / 100)을 할당합니다.
  6. numYears400floor((ry - 1601) / 400)을 할당합니다.
  7. 𝔽(365 × numYears1 + numYears4 - numYears100 + numYears400)을 반환합니다.

21.4.1.7 TimeFromYear ( y )

The abstract operation TimeFromYear takes argument y (정수 Number) and returns 시간 값. y년의 시작 순간의 시간 값을 반환합니다. It performs the following steps when called:

  1. msPerDay × DayFromYear(y)를 반환합니다.

21.4.1.8 YearFromTime ( t )

The abstract operation YearFromTime takes argument t (유한시간 값) and returns 정수 Number. t가 속한 연도를 반환합니다. It performs the following steps when called:

  1. TimeFromYear(y) ≤ t를 만족하는 가장 큰 정수 y를 반환합니다 (+∞에 가장 가까움).

21.4.1.9 DayWithinYear ( t )

The abstract operation DayWithinYear takes argument t (유한시간 값) and returns +0𝔽부터 365𝔽까지 포함하는 구간의 정수 Number. It performs the following steps when called:

  1. Day(t) - DayFromYear(YearFromTime(t))을 반환합니다.

21.4.1.10 InLeapYear ( t )

The abstract operation InLeapYear takes argument t (유한시간 값) and returns +0𝔽 또는 1𝔽. t가 윤년 내에 있으면 1𝔽, 아니면 +0𝔽을 반환합니다. It performs the following steps when called:

  1. DaysInYear(YearFromTime(t))이 366𝔽이면 1𝔽을, 아니면 +0𝔽을 반환합니다.

21.4.1.11 MonthFromTime ( t )

The abstract operation MonthFromTime takes argument t (유한시간 값) and returns +0𝔽부터 11𝔽까지 포함하는 구간의 정수 Number. t가 속한 월(month)을 식별하는 Number를 반환합니다. +0𝔽은 1월, 1𝔽은 2월, … 11𝔽은 12월을 의미합니다. MonthFromTime(+0𝔽) = +0𝔽은 1970년 1월 1일 목요일에 해당합니다. It performs the following steps when called:

  1. inLeapYearInLeapYear(t)를 할당합니다.
  2. dayWithinYearDayWithinYear(t)를 할당합니다.
  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. Assert: dayWithinYear < 365𝔽 + inLeapYear.
  15. 11𝔽을 반환합니다.

21.4.1.12 DateFromTime ( t )

The abstract operation DateFromTime takes argument t (유한시간 값) and returns 1𝔽부터 31𝔽까지 포함하는 구간의 정수 Number. t가 속한 월의 날짜(day of month)를 반환합니다. It performs the following steps when called:

  1. inLeapYearInLeapYear(t)를 할당합니다.
  2. dayWithinYearDayWithinYear(t)를 할당합니다.
  3. monthMonthFromTime(t)를 할당합니다.
  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. Assert: month11𝔽임을 보장합니다.
  16. dayWithinYear - 333𝔽 - inLeapYear을 반환합니다.

21.4.1.13 WeekDay ( t )

The abstract operation WeekDay takes argument t (유한시간 값) and returns +0𝔽부터 6𝔽까지 포함하는 구간의 정수 Number. t가 속한 요일(week day)을 식별하는 Number를 반환합니다. +0𝔽은 일요일, 1𝔽은 월요일, … 6𝔽은 토요일을 의미합니다. WeekDay(+0𝔽) = 4𝔽은 1970년 1월 1일 목요일에 해당합니다. It performs the following steps when called:

  1. 𝔽((Day(t) + 4𝔽) modulo 7)을 반환합니다.

21.4.1.14 HourFromTime ( t )

The abstract operation HourFromTime takes argument t (유한시간 값) and returns +0𝔽부터 23𝔽까지 포함하는 구간의 정수 Number. t가 속한 시(hour)를 반환합니다. It performs the following steps when called:

  1. 𝔽(floor((t / msPerHour)) modulo HoursPerDay)을 반환합니다.

21.4.1.15 MinFromTime ( t )

The abstract operation MinFromTime takes argument t (유한시간 값) and returns +0𝔽부터 59𝔽까지 포함하는 구간의 정수 Number. t가 속한 분(minute)을 반환합니다. It performs the following steps when called:

  1. 𝔽(floor((t / msPerMinute)) modulo MinutesPerHour)을 반환합니다.

21.4.1.16 SecFromTime ( t )

The abstract operation SecFromTime takes argument t (유한시간 값) and returns +0𝔽부터 59𝔽까지 포함하는 구간의 정수 Number. It performs the following steps when called:

  1. 𝔽(floor((t / msPerSecond)) modulo SecondsPerMinute)를 반환한다.

21.4.1.17 msFromTime ( t )

The abstract operation msFromTime takes argument t (유한시간 값) and returns +0𝔽부터 999𝔽까지 포함하는 구간의 정수 Number. It performs the following steps when called:

  1. 𝔽((t) modulo (msPerSecond))를 반환한다.

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 BigInt. It performs the following steps when called:

  1. dateMakeDay(𝔽(year), 𝔽(month - 1), 𝔽(day))로 한다.
  2. timeMakeTime(𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond))로 한다.
  3. msMakeDate(date, time)로 한다.
  4. Assert: ms는 정수 Number이다.
  5. ((ms) × 106 + microsecond × 103 + nanosecond)를 반환한다.

21.4.1.19 시간대 식별자

ECMAScript에서 시간대는 시간대 식별자로 표현되며, 이는 0x0000~0x007F의 코드 유닛으로만 구성된 문자열입니다. ECMAScript 구현이 지원하는 시간대는 사용 가능한 명명된 시간대일 수 있고, 이는 AvailableNamedTimeZoneIdentifiers가 반환하는 시간대 식별자 레코드[[Identifier]] 필드로 표현됩니다. 또는 오프셋 시간대일 수 있고, 이는 IsTimeZoneOffsetStringtrue를 반환하는 문자열로 표현됩니다.

기본 시간대 식별자는 사용 가능한 명명된 시간대의 대표 식별자입니다. 비기본 시간대 식별자는 명명된 시간대를 나타내지만 기본 식별자가 아닌 식별자입니다. 사용 가능한 명명된 시간대 식별자는 기본 또는 비기본 식별자입니다. 각 사용 가능한 명명된 시간대 식별자는 정확히 하나의 명명된 시간대와 연결됩니다. 각 명명된 시간대는 정확히 하나의 기본 시간대 식별자와 0개 이상의 비기본 식별자와 연결됩니다.

ECMAScript 구현은 "UTC" 식별자를 가진 명명된 시간대를 지원해야 하며, 이는 UTC 시간대의 기본 식별자여야 합니다. 추가로, 구현은 다른 명명된 시간대를 임의로 지원할 수 있습니다.

ECMA-402 국제화 API 명세의 시간대 요구 사항을 따르는 구현은 시간대 지원 구현(time zone aware)이라고 합니다. 시간대 지원 구현은 IANA Time Zone Database의 Zone 및 Link 이름에 해당하는 명명된 시간대를 지원해야 하며, 오직 그러한 이름만 지원해야 합니다. 시간대 지원 구현에서는 기본 식별자가 Zone 이름, 비기본 식별자가 Link 이름에 해당합니다(ECMA-402에서 특별히 재정의한 경우 제외). 전체 IANA Time Zone Database를 지원하지 않더라도 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 (문자열), 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 BigInt 리스트.

입력값이 음의 시간대 전환(예: 서머타임 종료나 시간대 오프셋 감소) 때문에 지역 시간이 두 번 발생하면, 반환 리스트에 두 개 이상의 요소가 들어가고 오름차순으로 정렬됩니다. 입력값이 양의 시간대 전환(예: 서머타임 시작이나 시간대 오프셋 증가) 때문에 지역 시간이 건너뛰어진 경우, 반환 리스트는 비어 있습니다. 그 외에는 반환 리스트에 하나의 요소가 들어갑니다.

지역 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneEpochNanoseconds 기본 구현은 다음과 같은 단계로 동작합니다:

  1. Assert: 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/.

2017년 11월 5일 America/New_York의 오전 1:30은 두 번 반복되므로, GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0)은 길이 2인 리스트를 반환하며 첫 번째 요소는 05:30 UTC(미국 동부 일광절약시 UTC-04:00의 01:30)에, 두 번째 요소는 06:30 UTC(미국 동부 표준시 UTC-05:00의 01:30)에 해당합니다.

2017년 3월 12일 America/New_York의 오전 2:30은 존재하지 않으므로, GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0)은 빈 리스트를 반환합니다.

21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier, epochNanoseconds )

The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (문자열) and epochNanoseconds (BigInt) and returns 정수.

반환되는 정수는 timeZoneIdentifier로 지정된 명명된 시간대에서, epochNanoseconds에 해당하는 순간의 UTC로부터의 오프셋(나노초 단위)을 나타냅니다.

지역 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 기본 구현은 다음과 같이 동작합니다:

  1. Assert: timeZoneIdentifier"UTC"임을 보장한다.
  2. 0을 반환한다.
Note

시간대 오프셋 값은 양수일 수도 음수일 수도 있습니다.

21.4.1.22 시간대 식별자 레코드

시간대 식별자 레코드사용 가능한 명명된 시간대 식별자와 해당 기본 시간대 식별자를 설명하는 데 사용되는 레코드입니다.

시간대 식별자 레코드는 Table 62에 나열된 필드를 가집니다.

Table 62: 시간대 식별자 레코드 필드
필드 이름 의미
[[Identifier]] 문자열 구현에서 지원하는 사용 가능한 명명된 시간대 식별자입니다.
[[PrimaryIdentifier]] 문자열 [[Identifier]]가 resolve되는 기본 시간대 식별자입니다.
Note

[[Identifier]]기본 시간대 식별자라면, [[Identifier]][[PrimaryIdentifier]]입니다.

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

The implementation-defined abstract operation AvailableNamedTimeZoneIdentifiers takes no arguments and returns 시간대 식별자 레코드 리스트.

ECMA-402 국제화 API를 구현하는 모든 시간대 지원 구현은 ECMA-402 명세에 따라 AvailableNamedTimeZoneIdentifiers 추상 연산을 구현해야 합니다. 시간대 지원하지 않는 구현에서는 다음과 같이 동작합니다:

  1. 구현에 지역 정치적 규칙이 없으면,
    1. « 시간대 식별자 레코드 { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } »를 반환한다.
  2. identifiers를 고유한 사용 가능한 명명된 시간대 식별자 리스트(코드 유닛 사전순으로 정렬)로 한다.
  3. result를 새로운 빈 리스트로 한다.
  4. identifiers의 요소 identifier에 대해,
    1. primaryidentifier로 한다.
    2. identifier가 이 구현에서 비기본 시간대 식별자이고 "UTC"가 아니면,
      1. primaryidentifier와 연결된 기본 시간대 식별자로 설정한다.
      2. NOTE: 기본 식별자를 얻기 위해 identifier를 반복적으로 resolve해야 할 수도 있다.
    3. record시간대 식별자 레코드 { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }로 한다.
    4. resultrecord를 추가한다.
  5. Assert: result[[Identifier]]"UTC"이고 [[PrimaryIdentifier]]"UTC"인 레코드 r가 포함됨을 보장한다.
  6. result를 반환한다.

21.4.1.24 SystemTimeZoneIdentifier ( )

The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns 문자열. It performs the following steps when called:

  1. 구현이 UTC 시간대만 지원하면 "UTC"를 반환한다.
  2. systemTimeZoneString호스트 환경의 현재 시간대를 나타내는 문자열(기본 시간대 식별자 또는 오프셋 시간대 식별자)로 한다.
  3. systemTimeZoneString을 반환한다.
Note

Date 객체의 메서드가 일반적으로 제공하는 기능 수준을 보장하려면, SystemTimeZoneIdentifier가 호스트 환경의 시간대 설정에 대응하는 IANA 시간대 이름을 반환하는 것이 권장됩니다(존재한다면). GetNamedTimeZoneEpochNanosecondsGetNamedTimeZoneOffsetNanoseconds는 해당 시간대의 표준시 및 서머타임에 대한 지역 정치적 규칙을 반영해야 합니다(존재한다면).

예를 들어, 호스트 환경이 미국 동부 시간대로 설정된 브라우저라면 SystemTimeZoneIdentifier는 "America/New_York"을 반환합니다.

21.4.1.25 LocalTime ( t )

The abstract operation LocalTime takes argument t (유한시간 값) and returns 정수 Number. It performs the following steps when called:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()로 한다.
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier)이 true이면
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)로 한다.
  3. 그렇지 않으면,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((t) × 106))로 한다.
  4. offsetMstruncate(offsetNs / 106)로 한다.
  5. t + 𝔽(offsetMs)를 반환한다.
Note 1

구현에 지역 시간 t에 대한 정치적 규칙이 없으면, 결과는 t입니다. SystemTimeZoneIdentifier"UTC"이고 GetNamedTimeZoneOffsetNanoseconds가 0을 반환하기 때문입니다.

Note 2

시간대 지원 구현(및 모든 구현에 권장됨)은 IANA Time Zone Database의 시간대 정보를 사용해야 합니다 https://www.iana.org/time-zones/.

Note 3

음의 시간대 전환(예: 서머타임 종료나 시간대 조정 감소)으로 인해 지역 시간이 반복될 때 서로 다른 입력 시간 값 tUTC이 동일한 지역 시간 tlocal으로 변환될 수 있습니다.

LocalTime(UTC(tlocal))이 항상 tlocal과 같지 않을 수 있습니다. 이에 대응하여 UTC(LocalTime(tUTC)) 또한 항상 tUTC과 같지 않을 수 있습니다.

21.4.1.26 UTC ( t )

The abstract operation UTC takes argument t (Number) and returns 시간 값. 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. NOTE: 다음 단계는 t가 음의 시간대 전환(예: 서머타임 종료나 시간대 오프셋 감소)에서 지역 시간이 여러 번 반복되거나, 양의 시간대 전환(예: 서머타임 시작이나 시간대 오프셋 증가)에서 지역 시간이 건너뛰어진 경우에, 전환 직전의 시간대 오프셋을 사용해 t를 해석할 수 있도록 한다.
    3. possibleInstants가 비어 있지 않으면
      1. disambiguatedInstantpossibleInstants[0]로 한다.
    4. 그렇지 않으면,
      1. NOTE: t가 양의 시간대 전환에서 건너뛰어진 지역 시간을 나타낸다(예: 서머타임 시작이나 시간대 오프셋 증가).
      2. possibleInstantsBeforeGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(tBefore)), (MonthFromTime(tBefore)) + 1, (DateFromTime(tBefore)), (HourFromTime(tBefore)), (MinFromTime(tBefore)), (SecFromTime(tBefore)), (msFromTime(tBefore)), 0, 0)로 한다. 여기서 tBeforepossibleInstantsBefore가 비어 있지 않은 가장 큰 정수(< t)이다(즉, 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/.

2017년 11월 5일 America/New_York의 오전 1:30은 두 번 반복되지만, 반드시 1:30 AM UTC-04로 해석되어야 하며 1:30 AM UTC-05로 해석되어서는 안 됩니다. UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0))))에서 offsetMs 값은 -4 × msPerHour입니다.

2017년 3월 12일 America/New_York의 오전 2:30은 존재하지 않지만, 반드시 2:30 AM UTC-05(동일한 3:30 AM UTC-04와 동일)로 해석되어야 합니다. 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의 연산은 부동소수점 연산(floating-point arithmetic)으로, 결합법칙이 성립하지 않으므로 반드시 올바른 순서로 연산해야 합니다.

21.4.1.28 MakeDay ( year, month, date )

The abstract operation MakeDay takes arguments year (Number), month (Number), and date (Number) and returns Number. 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. YearFromTime(t)가 ym, MonthFromTime(t)가 mn, DateFromTime(t)가 1𝔽유한시간 값 t를 찾는다. 단, 찾을 수 없다면(인수가 범위 밖인 경우 등) NaN을 반환한다.
  9. Day(t) + dt - 1𝔽를 반환한다.

21.4.1.29 MakeDate ( day, time )

The abstract operation MakeDate takes arguments day (Number) and time (Number) and returns Number. 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. 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 Number. 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의 4자리 십진수, 또는 확장 연도(expanded year)로서 "+" 또는 "-" 뒤에 6자리 십진수.
- "-" (하이픈)은 문자열에 두 번 그대로 나타납니다.
MM 연도의 월(month). 01(1월)~12(12월)까지 두 자리 십진수.
DD 월의 날짜(day). 01~31의 두 자리 십진수.
T "T"는 문자열에 그대로 나타나며, 시간 요소의 시작임을 나타냅니다.
HH 자정 이후 지난 전체 시간(hour) 수. 00~24의 두 자리 십진수.
: ":" (콜론)은 문자열에 두 번 그대로 나타납니다.
mm 시간(hour) 시작 이후 지난 전체 분(minute) 수. 00~59의 두 자리 십진수.
ss 분(minute) 시작 이후 지난 전체 초(second) 수. 00~59의 두 자리 십진수.
. "." (점)은 문자열에 그대로 나타납니다.
sss 초(second) 시작 이후 지난 전체 밀리초(millisecond) 수. 세 자리 십진수.
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년 전후의 전체 시간 값 범위를 나타내려면 0년 이전 또는 9999년 이후의 연도 표현이 필요합니다(21.4.1.1). ISO 8601은 연도 표현의 확장을 허용하지만, 정보 교환 당사자 간의 합의가 있을 때만 허용합니다. ECMAScript 단순화 형식에서는 확장 연도 표현이 6자리 숫자로 되어야 하며 항상 + 또는 - 기호가 붙습니다. 0년은 양수로 간주하고 반드시 + 기호를 붙여야 합니다. -000000 형식의 0년 표현은 유효하지 않습니다. 확장 연도가 시간 값 범위를 벗어나는 경우, 날짜-시간 문자열 형식과 일치하는 문자열이라도 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 (문자열) and returns 불리언(Boolean). It performs the following steps when called:

  1. parseResult를 ParseText(offsetString, UTCOffset)로 한다.
  2. parseResult가 오류 목록이면 false를 반환한다.
  3. true를 반환한다.

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

The abstract operation ParseTimeZoneOffsetString takes argument offsetString (문자열) and returns 정수. It performs the following steps when called:

  1. parseResult를 ParseText(offsetString, UTCOffset)로 한다.
  2. Assert: parseResult가 오류 목록이 아님을 보장한다.
  3. Assert: parseResultASCIISign Parse Node가 포함됨을 보장한다.
  4. parsedSignparseResult에 포함된 ASCIISign Parse Node가 일치시킨 소스 텍스트로 한다.
  5. parsedSign이 U+002D(하이픈) 단일 코드 포인트면
    1. sign을 -1로 한다.
  6. 그렇지 않으면
    1. sign을 1로 한다.
  7. NOTE: 아래 StringToNumber 이용 시 정밀도 손실 없음(파싱된 값은 충분히 짧은 십진수 문자열임이 보장됨).
  8. Assert: parseResultHour Parse Node가 포함됨을 보장한다.
  9. parsedHoursparseResult에 포함된 Hour Parse Node가 일치시킨 소스 텍스트로 한다.
  10. hours(StringToNumber(CodePointsToString(parsedHours)))로 한다.
  11. parseResultMinuteSecond 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. parseResultTemporalDecimalFraction Parse Node가 없으면
    1. nanoseconds를 0으로 한다.
  16. 그렇지 않으면
    1. parsedFractionparseResult에 포함된 TemporalDecimalFraction Parse Node가 일치시킨 소스 텍스트로 한다.
    2. fraction을 CodePointsToString(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)을 나타내는 문자열을 반환한다.
  • 인수의 개수와 타입에 따라 동작이 달라지는 함수이다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Date 동작을 상속하려는 서브클래스 생성자[[DateValue]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Date 생성자로의 super 호출을 포함해야 한다.

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가 객체이고 [[DateValue]] 내부 슬롯이 있으면
      1. tvvalue.[[DateValue]]로 설정한다.
    3. 그렇지 않으면
      1. v를 ? ToPrimitive(value)로 설정한다.
      2. v가 문자열이면
        1. 다음 단계에서 갑작스런 완료가 발생하지 않음을 단언한다(v는 문자열이므로).
        2. tvparse 메서드(21.4.3.2)와 동일한 방식으로 v를 날짜로 파싱한 결과로 설정한다.
      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. O를 ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] »)로 설정한다.
  7. O.[[DateValue]]dv를 설정한다.
  8. O를 반환한다.

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 결과가 갑작스런 완료라면 즉시 Completion Record를 반환한다. 그렇지 않으면, 이 함수는 결과 문자열을 날짜와 시간으로 해석하여 해당 날짜와 시간에 해당하는 UTC 시간 값을 Number로 반환한다. 문자열의 내용에 따라 지역 시간, UTC 시간, 또는 다른 시간대의 시간으로 해석될 수 있다. 함수는 먼저 Date Time String Format (21.4.1.32)에 설명된 형식(확장된 연도 포함)에 따라 문자열을 파싱하려 시도한다. 문자열이 해당 형식에 맞지 않으면 구현별 휴리스틱 또는 구현별 날짜 형식으로 대체할 수 있다. 인식 불가하거나 형식 요소 값이 범위를 벗어난 문자열은 이 함수가 NaN을 반환하게 한다.

문자열이 Date Time String Format에 맞는 경우, 대체 값이 없는 형식 요소에는 대체 값이 사용된다. MM 또는 DD 요소가 없으면 "01"이 사용된다. HH, mm, ss 요소가 없으면 "00"이 사용된다. sss 요소가 없으면 "000"이 사용된다. UTC 오프셋 표현이 없으면 날짜만 있는 형식은 UTC로, 날짜-시간 형식은 지역 시간으로 해석된다.

어떤 ECMAScript 구현에서 밀리초가 0인 Date x에 대해 다음 모든 표현식은 모든 관련 프로퍼티가 초기값일 때 동일한 숫자 값을 반환해야 한다:

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

그러나 다음 표현식은

Date.parse(x.toLocaleString())

앞의 세 표현식과 동일한 Number 값을 반환할 필요는 없으며, 일반적으로 이 함수가 Date Time String Format (21.4.1.32)에 맞지 않고 해당 구현에서 toString 또는 toUTCString 메서드로 생성할 수 없는 문자열 값을 받으면 반환 값은 구현에 따라 달라진다.

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 생성자와 두 가지 차이가 있다: Date를 생성하는 대신 시간 값을 Number로 반환하며, 인수를 지역 시간 대신 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. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. DateFromTime(LocalTime(t))을 반환한다.

21.4.4.3 Date.prototype.getDay ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. WeekDay(LocalTime(t))을 반환한다.

21.4.4.4 Date.prototype.getFullYear ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. YearFromTime(LocalTime(t))을 반환한다.

21.4.4.5 Date.prototype.getHours ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. HourFromTime(LocalTime(t))을 반환한다.

21.4.4.6 Date.prototype.getMilliseconds ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. msFromTime(LocalTime(t))을 반환한다.

21.4.4.7 Date.prototype.getMinutes ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. MinFromTime(LocalTime(t))을 반환한다.

21.4.4.8 Date.prototype.getMonth ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. MonthFromTime(LocalTime(t))을 반환한다.

21.4.4.9 Date.prototype.getSeconds ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. SecFromTime(LocalTime(t))을 반환한다.

21.4.4.10 Date.prototype.getTime ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. dateObject.[[DateValue]]를 반환한다.

21.4.4.11 Date.prototype.getTimezoneOffset ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. (t - LocalTime(t)) / msPerMinute를 반환한다.

21.4.4.12 Date.prototype.getUTCDate ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. DateFromTime(t)를 반환한다.

21.4.4.13 Date.prototype.getUTCDay ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. WeekDay(t)를 반환한다.

21.4.4.14 Date.prototype.getUTCFullYear ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. YearFromTime(t)를 반환한다.

21.4.4.15 Date.prototype.getUTCHours ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. HourFromTime(t)를 반환한다.

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. msFromTime(t)를 반환한다.

21.4.4.17 Date.prototype.getUTCMinutes ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. MinFromTime(t)를 반환한다.

21.4.4.18 Date.prototype.getUTCMonth ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. MonthFromTime(t)를 반환한다.

21.4.4.19 Date.prototype.getUTCSeconds ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 NaN을 반환한다.
  5. SecFromTime(t)를 반환한다.

21.4.4.20 Date.prototype.setDate ( date )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. dt를 ? ToNumber(date)로 설정한다.
  5. tNaN이면 NaN을 반환한다.
  6. tLocalTime(t)로 설정한다.
  7. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))로 설정한다.
  8. uTimeClip(UTC(newDate))로 설정한다.
  9. dateObject.[[DateValue]]u를 설정한다.
  10. u를 반환한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. y를 ? ToNumber(year)로 설정한다.
  5. tNaN이면 t+0𝔽로 설정하고; 아니면 tLocalTime(t)로 설정한다.
  6. month가 없으면 mMonthFromTime(t)로 설정하고; 있으면 m를 ? ToNumber(month)로 설정한다.
  7. date가 없으면 dtDateFromTime(t)로 설정하고; 있으면 dt를 ? ToNumber(date)로 설정한다.
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t))로 설정한다.
  9. uTimeClip(UTC(newDate))로 설정한다.
  10. dateObject.[[DateValue]]u를 설정한다.
  11. u를 반환한다.

이 메서드의 "length" 프로퍼티는 3𝔽이다.

Note

month가 없으면 이 메서드는 getMonth() 값이 있는 것처럼 동작한다. date가 없으면 getDate() 값이 있는 것처럼 동작한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. h를 ? ToNumber(hour)로 설정한다.
  5. min이 있으면 m를 ? ToNumber(min)로 설정한다.
  6. sec이 있으면 s를 ? ToNumber(sec)로 설정한다.
  7. ms가 있으면 milli를 ? ToNumber(ms)로 설정한다.
  8. tNaN이면 NaN을 반환한다.
  9. tLocalTime(t)로 설정한다.
  10. min이 없으면 mMinFromTime(t)로 설정한다.
  11. sec이 없으면 sSecFromTime(t)로 설정한다.
  12. ms가 없으면 millimsFromTime(t)로 설정한다.
  13. dateMakeDate(Day(t), MakeTime(h, m, s, milli))로 설정한다.
  14. uTimeClip(UTC(date))로 설정한다.
  15. dateObject.[[DateValue]]u를 설정한다.
  16. u를 반환한다.

이 메서드의 "length" 프로퍼티는 4𝔽이다.

Note

min이 없으면 getMinutes() 값이 있는 것처럼 동작한다. sec이 없으면 getSeconds() 값이 있는 것처럼, ms가 없으면 getMilliseconds() 값이 있는 것처럼 동작한다.

21.4.4.23 Date.prototype.setMilliseconds ( ms )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. ms를 ? ToNumber(ms)로 설정한다.
  5. tNaN이면 NaN을 반환한다.
  6. tLocalTime(t)로 설정한다.
  7. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)로 설정한다.
  8. uTimeClip(UTC(MakeDate(Day(t), time)))로 설정한다.
  9. dateObject.[[DateValue]]u를 설정한다.
  10. u를 반환한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. m를 ? ToNumber(min)로 설정한다.
  5. sec이 있으면 s를 ? ToNumber(sec)로 설정한다.
  6. ms가 있으면 milli를 ? ToNumber(ms)로 설정한다.
  7. tNaN이면 NaN을 반환한다.
  8. tLocalTime(t)로 설정한다.
  9. sec이 없으면 sSecFromTime(t)로 설정한다.
  10. ms가 없으면 millimsFromTime(t)로 설정한다.
  11. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli))로 설정한다.
  12. uTimeClip(UTC(date))로 설정한다.
  13. dateObject.[[DateValue]]u를 설정한다.
  14. u를 반환한다.

이 메서드의 "length" 프로퍼티는 3𝔽이다.

Note

sec이 없으면 getSeconds() 값이 있는 것처럼, ms가 없으면 getMilliseconds() 값이 있는 것처럼 동작한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. m를 ? ToNumber(month)로 설정한다.
  5. date가 있으면 dt를 ? ToNumber(date)로 설정한다.
  6. tNaN이면 NaN을 반환한다.
  7. tLocalTime(t)로 설정한다.
  8. date가 없으면 dtDateFromTime(t)로 설정한다.
  9. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))로 설정한다.
  10. uTimeClip(UTC(newDate))로 설정한다.
  11. dateObject.[[DateValue]]u를 설정한다.
  12. u를 반환한다.

이 메서드의 "length" 프로퍼티는 2𝔽이다.

Note

date가 없으면 getDate() 값이 있는 것처럼 동작한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. s를 ? ToNumber(sec)로 설정한다.
  5. ms가 있으면 milli를 ? ToNumber(ms)로 설정한다.
  6. tNaN이면 NaN을 반환한다.
  7. tLocalTime(t)로 설정한다.
  8. ms가 없으면 millimsFromTime(t)로 설정한다.
  9. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))로 설정한다.
  10. uTimeClip(UTC(date))로 설정한다.
  11. dateObject.[[DateValue]]u를 설정한다.
  12. u를 반환한다.

이 메서드의 "length" 프로퍼티는 2𝔽이다.

Note

ms가 없으면 getMilliseconds() 값이 있는 것처럼 동작한다.

21.4.4.27 Date.prototype.setTime ( time )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. t를 ? ToNumber(time)로 설정한다.
  4. vTimeClip(t)로 설정한다.
  5. dateObject.[[DateValue]]v를 설정한다.
  6. v를 반환한다.

21.4.4.28 Date.prototype.setUTCDate ( date )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. dt를 ? ToNumber(date)로 설정한다.
  5. tNaN이면 NaN을 반환한다.
  6. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))로 설정한다.
  7. vTimeClip(newDate)로 설정한다.
  8. dateObject.[[DateValue]]v를 설정한다.
  9. v를 반환한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. tNaN이면 t+0𝔽로 설정한다.
  5. y를 ? ToNumber(year)로 설정한다.
  6. month가 없으면 mMonthFromTime(t)로 설정하고; 있으면 m를 ? ToNumber(month)로 설정한다.
  7. date가 없으면 dtDateFromTime(t)로 설정하고; 있으면 dt를 ? ToNumber(date)로 설정한다.
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t))로 설정한다.
  9. vTimeClip(newDate)로 설정한다.
  10. dateObject.[[DateValue]]v를 설정한다.
  11. v를 반환한다.

이 메서드의 "length" 프로퍼티는 3𝔽이다.

Note

month가 없으면 getUTCMonth() 값이 있는 것처럼, date가 없으면 getUTCDate() 값이 있는 것처럼 동작한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. h를 ? ToNumber(hour)로 설정한다.
  5. min이 있으면 m를 ? ToNumber(min)로 설정한다.
  6. sec이 있으면 s를 ? ToNumber(sec)로 설정한다.
  7. ms가 있으면 milli를 ? ToNumber(ms)로 설정한다.
  8. tNaN이면 NaN을 반환한다.
  9. min이 없으면 mMinFromTime(t)로 설정한다.
  10. sec이 없으면 sSecFromTime(t)로 설정한다.
  11. ms가 없으면 millimsFromTime(t)로 설정한다.
  12. dateMakeDate(Day(t), MakeTime(h, m, s, milli))로 설정한다.
  13. vTimeClip(date)로 설정한다.
  14. dateObject.[[DateValue]]v를 설정한다.
  15. v를 반환한다.

이 메서드의 "length" 프로퍼티는 4𝔽이다.

Note

min이 없으면 getUTCMinutes() 값이 있는 것처럼, sec이 없으면 getUTCSeconds() 값이 있는 것처럼, ms가 없으면 getUTCMilliseconds() 값이 있는 것처럼 동작한다.

21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. ms를 ? ToNumber(ms)로 설정한다.
  5. tNaN이면 NaN을 반환한다.
  6. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)로 설정한다.
  7. vTimeClip(MakeDate(Day(t), time))로 설정한다.
  8. dateObject.[[DateValue]]v를 설정한다.
  9. v를 반환한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. m를 ? ToNumber(min)로 설정한다.
  5. sec이 있으면 s를 ? ToNumber(sec)로 설정한다.
  6. ms가 있으면 milli를 ? ToNumber(ms)로 설정한다.
  7. tNaN이면 NaN을 반환한다.
  8. sec이 없으면 sSecFromTime(t)로 설정한다.
  9. ms가 없으면 millimsFromTime(t)로 설정한다.
  10. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli))로 설정한다.
  11. vTimeClip(date)로 설정한다.
  12. dateObject.[[DateValue]]v를 설정한다.
  13. v를 반환한다.

이 메서드의 "length" 프로퍼티는 3𝔽이다.

Note

sec이 없으면 getUTCSeconds() 값이 있는 것처럼, ms가 없으면 getUTCMilliseconds() 값이 있는 것처럼 동작한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. m를 ? ToNumber(month)로 설정한다.
  5. date가 있으면 dt를 ? ToNumber(date)로 설정한다.
  6. tNaN이면 NaN을 반환한다.
  7. date가 없으면 dtDateFromTime(t)로 설정한다.
  8. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))로 설정한다.
  9. vTimeClip(newDate)로 설정한다.
  10. dateObject.[[DateValue]]v를 설정한다.
  11. v를 반환한다.

이 메서드의 "length" 프로퍼티는 2𝔽이다.

Note

date가 없으면 getUTCDate() 값이 있는 것처럼 동작한다.

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

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 설정한다.
  4. s를 ? ToNumber(sec)로 설정한다.
  5. ms가 있으면 milli를 ? ToNumber(ms)로 설정한다.
  6. tNaN이면 NaN을 반환한다.
  7. ms가 없으면 millimsFromTime(t)로 설정한다.
  8. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))로 설정한다.
  9. vTimeClip(date)로 설정한다.
  10. dateObject.[[DateValue]]v를 설정한다.
  11. v를 반환한다.

이 메서드의 "length" 프로퍼티는 2𝔽이다.

Note

ms가 없으면 getUTCMilliseconds() 값이 있는 것처럼 동작한다.

21.4.4.35 Date.prototype.toDateString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]로 설정한다.
  4. tvNaN이면 "Invalid Date"를 반환한다.
  5. tLocalTime(tv)로 설정한다.
  6. DateString(t)을 반환한다.

21.4.4.36 Date.prototype.toISOString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]로 설정한다.
  4. tvNaN이면 RangeError 예외를 throw 한다.
  5. 단언: tv는 정수 Number이다.
  6. tvDate Time String Format에서 표현할 수 없는 연도라면 RangeError 예외를 throw 한다.
  7. tvDate Time String Format의 UTC 타임스케일로 모든 형식 요소와 UTC 오프셋 표현 "Z"를 포함한 문자열로 반환한다.

21.4.4.37 Date.prototype.toJSON ( key )

이 메서드는 JSON.stringify(25.5.2)에서 사용할 Date의 문자열 표현을 제공한다.

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. O를 ? ToObject(this 값)으로 설정한다.
  2. tv를 ? ToPrimitive(O, number)로 설정한다.
  3. tv가 Number이고 유한하지 않으면 null을 반환한다.
  4. Invoke(O, "toISOString")을 반환한다.
Note 1

인수는 무시된다.

Note 2

이 메서드는 일부러 제네릭이다; this 값이 Date일 필요는 없다. 따라서 다른 종류의 객체로 이전해 메서드로 사용할 수 있다. 단, 해당 객체는 반드시 toISOString 메서드를 가지고 있어야 한다.

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

ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 한다. ECMA-402 API를 포함하지 않는 ECMAScript 구현에서는 다음 명세에 따른다:

이 메서드는 문자열 값을 반환한다. 문자열 내용은 구현 정의이지만, 현재 시간대의 Date의 “날짜” 부분을 편리하고 사람이 읽기 쉬운 형태로, 호스트 환경의 현재 로캘 관습에 맞게 나타내야 한다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있다. ECMA-402를 지원하지 않는 구현에서는 해당 위치에 다른 용도를 사용하면 안 된다.

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

ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 한다. ECMA-402 API를 포함하지 않는 ECMAScript 구현에서는 다음 명세에 따른다:

이 메서드는 문자열 값을 반환한다. 문자열 내용은 구현 정의이지만, 현재 시간대의 Date를 편리하고 사람이 읽기 쉬운 형태로, 호스트 환경의 현재 로캘 관습에 맞게 나타내야 한다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있다. ECMA-402를 지원하지 않는 구현에서는 해당 위치에 다른 용도를 사용하면 안 된다.

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

ECMA-402 국제화 API를 포함하는 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 한다. ECMA-402 API를 포함하지 않는 ECMAScript 구현에서는 다음 명세에 따른다:

이 메서드는 문자열 값을 반환한다. 문자열 내용은 구현 정의이지만, 현재 시간대의 Date의 “시간” 부분을 편리하고 사람이 읽기 쉬운 형태로, 호스트 환경의 현재 로캘 관습에 맞게 나타내야 한다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있다. ECMA-402를 지원하지 않는 구현에서는 해당 위치에 다른 용도를 사용하면 안 된다.

21.4.4.41 Date.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[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 예외를 throw 한다. 따라서 다른 객체로 이전해 메서드로 사용할 수 없다.

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(공백), "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 63에서 Number WeekDay(tv)에 해당하는 Name으로 설정한다.
  2. monthTable 64에서 Number MonthFromTime(tv)에 해당하는 Name으로 설정한다.
  3. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)로 설정한다.
  4. yvYearFromTime(tv)로 설정한다.
  5. yv+0𝔽이거나 yv > +0𝔽이면 yearSign을 빈 문자열로, 아니면 yearSign"-"로 설정한다.
  6. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)로 설정한다.
  7. weekday, 코드 유닛 0x0020(공백), month, 코드 유닛 0x0020(공백), day, 코드 유닛 0x0020(공백), yearSign, paddedYear를 차례로 연결한 문자열을 반환한다.
Table 63: Names of days of the week
Number Name
+0𝔽 "Sun"
1𝔽 "Mon"
2𝔽 "Tue"
3𝔽 "Wed"
4𝔽 "Thu"
5𝔽 "Fri"
6𝔽 "Sat"
Table 64: Names of months of the year
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구현 정의 문자열(빈 문자열 또는 코드 유닛 0x0020(공백), 0x0028(왼쪽 괄호), 구현 정의 타임존 이름, 0x0029(오른쪽 괄호) 연결)로 설정한다.
  10. offsetSign, offsetHour, offsetMin, tzName을 차례로 연결한 문자열을 반환한다.

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. tLocalTime(tv)로 설정한다.
  3. DateString(t), 코드 유닛 0x0020(공백), TimeString(t), TimeZoneString(tv)를 차례로 연결한 문자열을 반환한다.

21.4.4.42 Date.prototype.toTimeString ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]로 설정한다.
  4. tvNaN이면 "Invalid Date"를 반환한다.
  5. tLocalTime(tv)로 설정한다.
  6. TimeString(t), TimeZoneString(tv)를 차례로 연결한 문자열을 반환한다.

21.4.4.43 Date.prototype.toUTCString ( )

이 메서드는 this 값에 해당하는 순간을 나타내는 문자열 값을 반환한다. 문자열 형식은 RFC 7231의 "HTTP-date"를 기반으로 ECMAScript Date가 지원하는 전체 시간 범위에 맞게 일반화된 것이다.

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]로 설정한다.
  4. tvNaN이면 "Invalid Date"를 반환한다.
  5. weekdayTable 63에서 Number WeekDay(tv)에 해당하는 Name으로 설정한다.
  6. monthTable 64에서 Number MonthFromTime(tv)에 해당하는 Name으로 설정한다.
  7. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)로 설정한다.
  8. yvYearFromTime(tv)로 설정한다.
  9. yv+0𝔽이거나 yv > +0𝔽이면 yearSign을 빈 문자열로, 아니면 yearSign"-"로 설정한다.
  10. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)로 설정한다.
  11. weekday, ",", 코드 유닛 0x0020(공백), day, 코드 유닛 0x0020(공백), month, 코드 유닛 0x0020(공백), yearSign, paddedYear, 코드 유닛 0x0020(공백), TimeString(tv)를 차례로 연결한 문자열을 반환한다.

21.4.4.44 Date.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. dateObjectthis 값으로 설정한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. dateObject.[[DateValue]]를 반환한다.

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

이 메서드는 ECMAScript 언어 연산자가 Date를 원시 값으로 변환할 때 호출된다. hint에 허용되는 값은 "default", "number", "string"이다. Date는 내장 ECMAScript 객체 중 유일하게 "default""string"과 동등하게 취급한다. 다른 내장 객체는 "default""number"와 동등하게 취급한다.

이 메서드는 호출될 때 다음 단계를 수행한다:

  1. Othis 값으로 설정한다.
  2. O가 객체가 아니면 TypeError 예외를 throw 한다.
  3. hint"string" 또는 "default"이면
    1. tryFirststring으로 설정한다.
  4. 아니고 hint"number"이면
    1. tryFirstnumber로 설정한다.
  5. 아니면
    1. TypeError 예외를 throw 한다.
  6. OrdinaryToPrimitive(O, tryFirst)를 반환한다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }이다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.toPrimitive]"이다.

21.4.5 Date 인스턴스의 프로퍼티

Date 인스턴스는 Date 프로토타입 객체에서 속성을 상속받는 일반 객체이다. Date 인스턴스는 또한 [[DateValue]] 내부 슬롯을 가진다. [[DateValue]] 내부 슬롯은 해당 Date가 나타내는 시간 값이다.