19 전역 객체(The Global Object)

전역 객체:

19.1 전역 객체의 값(Value) 프로퍼티

19.1.1 globalThis

Realm Record realm 에서 전역 객체"globalThis" 프로퍼티 초기 값은 realm.[[GlobalEnv]].[[GlobalThisValue]] 이다.

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

19.1.2 Infinity

Infinity 의 값은 +∞𝔽 이다(6.1.6.1 참조). 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 갖는다.

19.1.3 NaN

NaN 의 값은 NaN 이다(6.1.6.1 참조). 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 갖는다.

19.1.4 undefined

undefined 의 값은 undefined 이다(6.1.1 참조). 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 갖는다.

19.2 전역 객체의 함수(Function) 프로퍼티

19.2.1 eval ( x )

이 함수는 %eval% 고유(intrinsic) 객체이다.

호출 시 다음 단계를 수행한다:

  1. Return ? PerformEval(x, false, false).

19.2.1.1 PerformEval ( x, strictCaller, direct )

The abstract operation PerformEval takes arguments x (ECMAScript 언어 값), strictCaller (Boolean), and direct (Boolean) and returns ECMAScript 언어 값을 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. 단언: directfalse 이면 strictCallerfalse.
  2. x 가 String 이 아니면 x 를 반환.
  3. evalRealm 을 현재 Realm Record 로 둔다.
  4. 참고: direct eval 의 경우 evalRealmeval 호출자와 eval 함수 자체의 realm 이다.
  5. HostEnsureCanCompileStrings(evalRealm, « », x, direct) 수행.
  6. inFunction = false.
  7. inMethod = false.
  8. inDerivedConstructor = false.
  9. inClassFieldInitializer = false.
  10. directtrue 이면
    1. thisEnvRec = GetThisEnvironment().
    2. thisEnvRecFunction Environment Record 이면
      1. F = thisEnvRec.[[FunctionObject]].
      2. inFunction = true 로.
      3. inMethod = thisEnvRec.HasSuperBinding().
      4. F.[[ConstructorKind]]derived 이면 inDerivedConstructor = true.
      5. classFieldInitializerName = F.[[ClassFieldInitializerName]].
      6. classFieldInitializerNameempty 가 아니면 inClassFieldInitializer = true.
  11. 구현 정의 순서(파싱과 오류 검출을 교차 실행 가능)로 다음 하위 단계 수행:
    1. script = ParseText(x, Script).
    2. script 가 오류 리스트면 SyntaxError 예외 throw.
    3. script Contains ScriptBodyfalse 이면 undefined 반환.
    4. body = scriptScriptBody.
    5. inFunctionfalse 이고 body Contains NewTarget 이면 SyntaxError throw.
    6. inMethodfalse 이고 body Contains SuperProperty 이면 SyntaxError throw.
    7. inDerivedConstructorfalse 이고 body Contains SuperCall 이면 SyntaxError throw.
    8. inClassFieldInitializertrue 이고 ContainsArguments(body) 가 true 이면 SyntaxError throw.
  12. strictCallertrue 이면 strictEval = true.
  13. Else strictEval = ScriptIsStrict(script).
  14. runningContext = 실행 중 실행 컨텍스트.
  15. 참고: direct true 이면 호출한 컨텍스트; false 이면 eval 호출 실행 컨텍스트.
  16. directtrue 이면
    1. lexEnv = NewDeclarativeEnvironment(runningContext.LexicalEnvironment).
    2. varEnv = runningContext.VariableEnvironment.
    3. privateEnv = runningContext.PrivateEnvironment.
  17. Else
    1. lexEnv = NewDeclarativeEnvironment(evalRealm.[[GlobalEnv]]).
    2. varEnv = evalRealm.[[GlobalEnv]].
    3. privateEnv = null.
  18. strictEvaltrue 이면 varEnv = lexEnv.
  19. runningContext 가 아직 suspend 상태가 아니면 suspend.
  20. evalContext = 새 ECMAScript 코드 실행 컨텍스트.
  21. evalContext.Function = null.
  22. evalContext.Realm = evalRealm.
  23. evalContext.ScriptOrModule = runningContext.ScriptOrModule.
  24. evalContext.VariableEnvironment = varEnv.
  25. evalContext.LexicalEnvironment = lexEnv.
  26. evalContext.PrivateEnvironment = privateEnv.
  27. evalContext 를 실행 컨텍스트 스택에 push; 현재 실행 컨텍스트.
  28. result = Completion(EvalDeclarationInstantiation(body, varEnv, lexEnv, privateEnv, strictEval)).
  29. result 가 normal 이면
    1. result = Completion(Evaluation(body)).
  30. result 가 normal 이고 result.[[Value]]empty 이면
    1. result = NormalCompletion(undefined).
  31. evalContext suspend 후 스택에서 제거.
  32. 스택 맨 위 컨텍스트 resume.
  33. Return ? result.
Note

eval 코드는 호출 컨텍스트나 eval 코드 둘 중 하나라도 strict 모드이면 호출자 변수 환경에 var/function 바인딩을 인스턴스화할 수 없다. 대신 새 VariableEnvironment 에 인스턴스화된다. let, const, class 선언이 도입하는 바인딩은 항상 새 LexicalEnvironment 에 인스턴스화된다.

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )

The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (Realm Record), parameterStrings (문자열 리스트), bodyString (String), and direct (Boolean) and returns unused 를 담은 정상 completion 또는 throw completion. 문자열을 ECMAScript 코드로 해석·평가할 수 있게 하는 특정 ECMAScript 함수를 호스트 환경이 차단할 수 있도록 한다.

parameterStrings 는 함수 생성자 중 하나를 사용할 때 파라미터 목록을 구성하기 위해 연결될 문자열들을 나타낸다. bodyString 은 함수 본문 또는 eval 에 전달된 문자열을 나타낸다. direct 는 평가가 direct eval 인지 여부를 나타낸다.

기본 구현은 NormalCompletion(unused) 을 반환한다.

19.2.1.3 EvalDeclarationInstantiation ( body, varEnv, lexEnv, privateEnv, strict )

The abstract operation EvalDeclarationInstantiation takes arguments body (ScriptBody Parse Node), varEnv (Environment Record), lexEnv (Declarative Environment Record), privateEnv (PrivateEnvironment Record 또는 null), and strict (Boolean) and returns unused 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:

  1. varNames = VarDeclaredNames(body).
  2. varDeclarations = VarScopedDeclarations(body).
  3. strictfalse 이면
    1. varEnv 가 Global Environment Record 이면
      1. namevarNames 에 대해
        1. HasLexicalDeclaration(varEnv, name) 가 true 이면 SyntaxError throw.
        2. 참고: eval 은 전역 lexical 선언에 의해 shadow 되는 전역 var 선언을 만들지 않는다.
    2. thisEnv = lexEnv.
    3. 단언: 다음 루프는 종료한다.
    4. 반복 (thisEnvvarEnv 가 동일 Environment Record 가 아닐 동안)
      1. thisEnvObject Environment Record 가 아니면
        1. 참고: with 문의 환경은 lexical 선언을 포함할 수 없으므로 var/let hoisting 충돌 점검 불필요.
        2. namevarNames 에 대해
          1. thisEnv.HasBinding(name) 가 true 이면
            1. Normative Optional
              호스트가 웹 브라우저이거나 Catch 블록 내 VariableStatement 를 지원하면
              1. thisEnvCatch 절의 Environment Record 가 아니면 SyntaxError throw.
            2. Else
              1. SyntaxError throw.
          2. 참고: direct eval 은 같은 이름의 lexical 선언 위로 var 를 hoist 하지 않는다.
      2. thisEnv = thisEnv.[[OuterEnv]].
  4. privateIdentifiers = 새 빈 리스트.
  5. pointer = privateEnv.
  6. 반복 (pointernull)
    1. pointer.[[Names]] 의 각 Private Name binding 에 대해
      1. privateIdentifiersbinding.[[Description]] 포함하지 않으면 append.
    2. pointer = pointer.[[OuterPrivateEnvironment]].
  7. AllPrivateIdentifiersValid(body, privateIdentifiers) 가 false 이면 SyntaxError throw.
  8. functionsToInitialize = 새 빈 리스트.
  9. declaredFunctionNames = 새 빈 리스트.
  10. varDeclarations 을 역순으로 순회하며 각 d 에 대해
    1. dVariableDeclaration, ForBinding, BindingIdentifier 가 아니면
      1. 단언: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration.
      2. 참고: 같은 이름의 다수 함수 선언이 있으면 마지막 것이 사용됨.
      3. fn = BoundNames(d) 의 유일한 요소.
      4. declaredFunctionNamesfn 포함하지 않으면
        1. varEnv 가 Global Environment Record 이면
          1. fnDefinable = ? CanDeclareGlobalFunction(varEnv, fn).
          2. fnDefinablefalse 이면 TypeError throw.
        2. fndeclaredFunctionNames 에 추가.
        3. dfunctionsToInitialize 의 첫 요소로 삽입.
  11. declaredVarNames = 새 빈 리스트.
  12. varDeclarations 의 각 d 에 대해
    1. dVariableDeclaration, ForBinding, BindingIdentifier 이면
      1. BoundNames(d) 의 각 String vn 에 대해
        1. declaredFunctionNamesvn 포함하지 않으면
          1. varEnv 가 Global Environment Record 이면
            1. vnDefinable = ? CanDeclareGlobalVar(varEnv, vn).
            2. vnDefinable false 이면 TypeError throw.
          2. declaredVarNamesvn 포함하지 않으면 append.
  13. Normative Optional
    strictfalse 이고 호스트가 웹 브라우저이거나 블록 수준 함수 선언 웹 레거시 호환 의미 를 지원하면
    1. declaredFunctionOrVarNames = declaredFunctionNamesdeclaredVarNames (리스트 연결).
    2. body Contains xtrue 인 모든 Block, CaseClause, DefaultClause xStatementList 에 직접 포함된 각 FunctionDeclaration f 에 대해
      1. F = fBindingIdentifier StringValue.
      2. fFBindingIdentifier 로 하는 VariableStatement 로 치환해도 body 에 Early Error 가 발생하지 않으면
        1. bindingExists = false.
        2. thisEnv = lexEnv.
        3. 단언: 루프 종료 보장.
        4. 반복 (thisEnvvarEnv)
          1. thisEnvObject Environment Record 가 아니면
            1. thisEnv.HasBinding(F) 가 true 이면
              1. Normative Optional
                호스트가 웹 브라우저이거나 Catch 블록 내 VariableStatement 를 지원하면
                1. thisEnvCatchEnvironment Record 가 아니면 bindingExists = true.
              2. Else
                1. bindingExists = true.
          2. thisEnv = thisEnv.[[OuterEnv]].
        5. bindingExistsfalse 이고 varEnv 가 Global Environment Record 이면
          1. HasLexicalDeclaration(varEnv, F) 가 false 이면
            1. fnDefinable = ? CanDeclareGlobalVar(varEnv, F).
          2. Else
            1. fnDefinable = false.
        6. Else
          1. fnDefinable = true.
        7. bindingExists false 이고 fnDefinable true 이면
          1. declaredFunctionOrVarNamesF 포함하지 않으면
            1. varEnv 가 Global Environment Record 이면
              1. CreateGlobalVarBinding(varEnv, F, true).
            2. Else
              1. bindingExists = ! varEnv.HasBinding(F).
              2. bindingExists false 이면
                1. varEnv.CreateMutableBinding(F, true).
                2. varEnv.InitializeBinding(F, undefined).
            3. FdeclaredFunctionOrVarNames 에 추가.
          2. FunctionDeclaration f 평가 시 15.2.6 의 기본 알고리즘 대신:
            1. gEnv = 실행 중 컨텍스트 VariableEnvironment.
            2. bEnv = 실행 중 컨텍스트 LexicalEnvironment.
            3. fObj = ! bEnv.GetBindingValue(F, false).
            4. gEnv.SetMutableBinding(F, fObj, false).
            5. unused 반환.
  14. 참고: varEnv 가 Global Environment Record 이고 전역 객체가 Proxy exotic object 인 경우가 아니면 이 단계 이후 비정상 종료 없음.
  15. lexDeclarations = LexicallyScopedDeclarations(body).
  16. dlexDeclarations 에 대해
    1. 참고: 어휘 선언된 이름은 여기서 인스턴스화만 하고 초기화하지 않음.
    2. BoundNames(d) 의 각 dn 에 대해
      1. IsConstantDeclaration(d) true 이면
        1. lexEnv.CreateImmutableBinding(dn, true).
      2. Else
        1. lexEnv.CreateMutableBinding(dn, false).
  17. functionsToInitialize 의 각 Parse Node f 에 대해
    1. fn = BoundNames(f) 의 유일한 요소.
    2. fo = InstantiateFunctionObject(f, lexEnv, privateEnv).
    3. varEnv 가 Global Environment Record 이면
      1. CreateGlobalFunctionBinding(varEnv, fn, fo, true).
    4. Else
      1. bindingExists = ! varEnv.HasBinding(fn).
      2. bindingExists false 이면
        1. 참고: 앞선 검증 때문에 abrupt 발생 불가.
        2. varEnv.CreateMutableBinding(fn, true).
        3. varEnv.InitializeBinding(fn, fo).
      3. Else
        1. varEnv.SetMutableBinding(fn, fo, false).
  18. 각 String vndeclaredVarNames 에 대해
    1. varEnv 가 Global Environment Record 이면
      1. CreateGlobalVarBinding(varEnv, vn, true).
    2. Else
      1. bindingExists = ! varEnv.HasBinding(vn).
      2. bindingExists false 이면
        1. 참고: 앞선 검증으로 abrupt 불가.
        2. varEnv.CreateMutableBinding(vn, true).
        3. varEnv.InitializeBinding(vn, undefined).
  19. unused 반환.

19.2.2 isFinite ( number )

이 함수는 %isFinite% 내장 객체이다.

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

  1. num을 ? ToNumber(number)로 한다.
  2. num유한한 값(finite)이면 true를 반환한다.
  3. false를 반환한다.

19.2.3 isNaN ( number )

이 함수는 %isNaN% 내장 객체이다.

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

  1. num을 ? ToNumber(number)로 한다.
  2. numNaN이면 true를 반환한다.
  3. false를 반환한다.
Note

ECMAScript 코드에서 어떤 값 XNaN인지 신뢰할 수 있게 판별하려면 X !== X와 같은 식을 사용할 수 있다. 결과가 true면 오직 XNaN일 때이다.

19.2.4 parseFloat ( string )

이 함수는 string 인자의 내용을 10진수 리터럴로 해석한 결과에 따라 Number 값을 생성한다.

%parseFloat% 내장 객체이다.

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

  1. inputString을 ? ToString(string)으로 한다.
  2. trimmedString을 ! TrimString(inputString, start)으로 한다.
  3. trimmed을 StringToCodePoints(trimmedString)으로 한다.
  4. trimmedPrefixStrDecimalLiteral 문법을 만족하는 trimmed의 가장 긴 접두사로 한다; 만약 그런 접두사가 없으면 NaN을 반환한다.
  5. parsedNumber를 ParseText(trimmedPrefix, StrDecimalLiteral)로 한다.
  6. 단언: parsedNumber는 Parse Node이다.
  7. parsedNumber의 StringNumericValue를 반환한다.
Note

이 함수는 string의 앞부분만을 Number 값으로 해석할 수 있으며, 10진수 리터럴 표기에 포함될 수 없는 코드 유닛들은 무시된다. 무시된 코드 유닛에 관해 어떤 표시도 하지 않는다.

19.2.5 parseInt ( string, radix )

이 함수는 string의 내용을 지정된 radix에 따라 해석하여 정수(Number) 값을 생성한다. string의 앞에 있는 공백은 무시된다. radix가 0으로 변환될 경우(undefined 등), 숫자 표기가 "0x" 또는 "0X"로 시작하지 않는 한 10으로 간주한다. 만약 "0x" 또는 "0X"로 시작하면 16으로 간주한다. radix가 16이면 숫자 표기는 선택적으로 "0x" 또는 "0X"로 시작할 수 있다.

%parseInt% 내장 객체이다.

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

  1. inputString을 ? ToString(string)으로 한다.
  2. S를 ! TrimString(inputString, start)으로 한다.
  3. sign을 1로 한다.
  4. S가 비어 있지 않고 첫 번째 코드 유닛이 0x002D(HYPHEN-MINUS)면 sign을 -1로 한다.
  5. S가 비어 있지 않고 첫 번째 코드 유닛이 0x002B(PLUS SIGN) 또는 0x002D(HYPHEN-MINUS)이면 S를 인덱스 1부터의 부분문자열로 바꾼다.
  6. R(? ToInt32(radix))로 한다.
  7. stripPrefixtrue로 한다.
  8. R ≠ 0이면,
    1. R < 2 또는 R > 36이면 NaN을 반환한다.
    2. R ≠ 16이면 stripPrefixfalse로 한다.
  9. 그렇지 않으면,
    1. R을 10으로 한다.
  10. stripPrefixtrue이면,
    1. S의 길이 ≥ 2이고, 앞 두 코드 유닛이 "0x" 또는 "0X"이면,
      1. S를 인덱스 2부터의 부분문자열로 바꾼다.
      2. R을 16으로 한다.
  11. S에 radix-R 숫자가 아닌 코드 유닛이 있다면 그 첫 번째 코드 유닛의 인덱스를 end로, 없다면 endS의 길이로 한다.
  12. ZS의 0부터 end까지의 부분문자열로 한다.
  13. Z가 비어 있으면 NaN을 반환한다.
  14. mathIntZ에 대해 radix-R 표기법으로 나타낸 정수 값으로 한다. (단, R = 10이고 Z에 의미 있는 숫자가 20개를 넘을 경우, 20번째 이후의 숫자는 구현 선택으로 0으로 대체될 수 있다; R이 2, 4, 8, 10, 16, 32 중 하나가 아니면, mathInt는 구현체 근사치로 나타낼 수 있다.)
  15. mathInt = 0이면,
    1. sign = -1이면 -0𝔽을 반환한다.
    2. +0𝔽을 반환한다.
  16. 𝔽(sign × mathInt)을 반환한다.
Note

이 함수는 string의 앞부분만 정수로 해석할 수 있으며, 정수 표기법에 해석될 수 없는 코드 유닛들은 모두 무시한다. 무시된 코드 유닛에 대해선 아무런 표시도 하지 않는다.

19.2.6 URI 처리 함수

Uniform Resource Identifier(URI)는 인터넷상에서 리소스(예: 웹 페이지, 파일)와 접근에 사용되는 전송 프로토콜(예: HTTP, FTP)을 식별하는 문자열(String)이다. ECMAScript 언어 자체는 이 섹션에 기술된 URI 인코딩/디코딩 함수를 제외하고는 URI 사용을 위한 지원을 제공하지 않는다. encodeURIdecodeURI는 전체 URI에 대해 동작하며, 예약 문자가 특별한 의미(예: 구분자)로 사용될 것으로 가정하여 인코딩하지 않는다. encodeURIComponentdecodeURIComponent는 URI의 구성 요소에 대해 동작하며, 예약 문자가 텍스트를 표현할 경우 전체 URI의 일부가 될 때 특별한 의미를 피하기 위해 인코딩해야 한다고 가정한다.

Note 1

예약 문자 집합은 RFC 2396을 기반으로 하며, 최신 RFC 3986에 도입된 변경 사항을 반영하지 않는다.

Note 2

많은 ECMAScript 구현체는 웹 페이지를 다루는 추가 함수와 메서드를 제공한다; 이 함수들은 본 표준의 범위를 벗어난다.

19.2.6.1 decodeURI ( encodedURI )

이 함수는 URI의 각 이스케이프 시퀀스와 encodeURI 함수가 생성할 수 있는 UTF-8 인코딩을 그 코드 포인트를 나타내는 UTF-16 인코딩으로 바꾼 새로운 URI 버전을 계산한다. encodeURI로 생성될 수 없는 이스케이프 시퀀스는 변경되지 않는다.

%decodeURI% 내장 객체이다.

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

  1. uriString을 ? ToString(encodedURI)으로 한다.
  2. preserveEscapeSet";/?:@&=+$,#"로 한다.
  3. Decode(uriString, preserveEscapeSet)를 반환한다.

19.2.6.2 decodeURIComponent ( encodedURIComponent )

이 함수는 URI의 각 이스케이프 시퀀스와 encodeURIComponent 함수가 생성할 수 있는 UTF-8 인코딩을 그 코드 포인트를 나타내는 UTF-16 인코딩으로 바꾼 새로운 URI 버전을 계산한다.

%decodeURIComponent% 내장 객체이다.

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

  1. componentString을 ? ToString(encodedURIComponent)으로 한다.
  2. preserveEscapeSet을 빈 문자열로 한다.
  3. Decode(componentString, preserveEscapeSet)를 반환한다.

19.2.6.3 encodeURI ( uri )

이 함수는 UTF-16 인코딩된 (6.1.4) URI에서 특정 코드 포인트를 하나, 둘, 셋, 넷의 이스케이프 시퀀스로 대체하여 해당 코드 포인트의 UTF-8 인코딩을 나타내는 새로운 버전을 계산한다.

%encodeURI% 내장 객체이다.

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

  1. uriString을 ? ToString(uri)으로 한다.
  2. extraUnescaped";/?:@&=+$,#"로 한다.
  3. Encode(uriString, extraUnescaped)를 반환한다.

19.2.6.4 encodeURIComponent ( uriComponent )

이 함수는 UTF-16 인코딩된 (6.1.4) URI에서 특정 코드 포인트를 하나, 둘, 셋, 넷의 이스케이프 시퀀스로 대체하여 해당 코드 포인트의 UTF-8 인코딩을 나타내는 새로운 버전을 계산한다.

%encodeURIComponent% 내장 객체이다.

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

  1. componentString을 ? ToString(uriComponent)으로 한다.
  2. extraUnescaped를 빈 문자열로 한다.
  3. Encode(componentString, extraUnescaped)를 반환한다.

19.2.6.5 Encode ( string, extraUnescaped )

The abstract operation Encode takes arguments string (a String) and extraUnescaped (a String) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:

  1. lenstring의 길이로 한다.
  2. R을 빈 문자열로 한다.
  3. alwaysUnescaped를 ASCII 영단어 문자와 "-.!~*'()"을 이어붙인 문자열로 한다.
  4. unescapedSetalwaysUnescapedextraUnescaped를 이어붙인 문자열로 한다.
  5. k를 0으로 한다.
  6. k < len인 동안 반복한다,
    1. Cstring의 인덱스 k에 위치한 코드 유닛으로 한다.
    2. unescapedSetC를 포함하면,
      1. kk + 1로 한다.
      2. RRC를 이어붙인 문자열로 한다.
    3. 그렇지 않으면,
      1. cp를 CodePointAt(string, k)로 한다.
      2. cp.[[IsUnpairedSurrogate]]true이면 URIError 예외를 던진다.
      3. kk + cp.[[CodeUnitCount]]로 한다.
      4. Octetscp.[[CodePoint]]에 UTF-8 변환을 적용해 얻은 octet 리스트로 한다.
      5. Octets의 각 octet에 대해,
        1. hexoctet을 대문자 16진수 문자열로 만든 값으로 한다.
        2. RR, "%", 그리고 StringPad(hex, 2, "0", start)를 이어붙인 값으로 한다.
  7. R을 반환한다.
Note

퍼센트 인코딩은 개별 octet을 나타내므로 한 코드 포인트가 여러 연속된 이스케이프 시퀀스로 표현될 수 있다(각 8비트 UTF-8 코드 유닛마다 하나씩).

19.2.6.6 Decode ( string, preserveEscapeSet )

The abstract operation Decode takes arguments string (a String) and preserveEscapeSet (a String) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:

  1. lenstring의 길이로 한다.
  2. R을 빈 문자열로 한다.
  3. k를 0으로 한다.
  4. k < len인 동안 반복한다,
    1. Cstring의 인덱스 k에 위치한 코드 유닛으로 한다.
    2. SC로 한다.
    3. C가 코드 유닛 0x0025(PERCENT SIGN)이면,
      1. k + 3 > len이면 URIError 예외를 던진다.
      2. escapestringk에서 k + 3까지의 부분문자열로 한다.
      3. BParseHexOctet(string, k + 1)로 한다.
      4. B가 정수가 아니면 URIError 예외를 던진다.
      5. kk + 2로 한다.
      6. B의 선행 1 비트 개수를 n으로 한다.
      7. n = 0이면,
        1. asciiChar를 숫자값이 B인 코드 유닛으로 한다.
        2. preserveEscapeSetasciiChar가 포함되면 Sescape로, 아니면 SasciiChar로 한다.
      8. 그렇지 않으면,
        1. n = 1 또는 n > 4이면 URIError 예외를 던진다.
        2. Octets를 « B »로 한다.
        3. j를 1로 한다.
        4. j < n인 동안 반복한다,
          1. kk + 1로 한다.
          2. k + 3 > len이면 URIError 예외를 던진다.
          3. string의 인덱스 k의 코드 유닛이 코드 유닛 0x0025(PERCENT SIGN)이 아니면 URIError 예외를 던진다.
          4. continuationByteParseHexOctet(string, k + 1)로 한다.
          5. continuationByte가 정수가 아니면 URIError 예외를 던진다.
          6. OctetscontinuationByte를 추가한다.
          7. kk + 2로 한다.
          8. jj + 1로 한다.
        5. 단언: Octets의 길이가 n이다.
        6. Octets가 유효한 유니코드 코드 포인트의 UTF-8 인코딩을 포함하지 않으면 URIError 예외를 던진다.
        7. VOctets에 UTF-8 변환을 적용해 얻은 코드 포인트(21비트 값)로 한다.
        8. S를 UTF16EncodeCodePoint(V)로 한다.
    4. RRS를 이어붙인 값으로 한다.
    5. kk + 1로 한다.
  5. R을 반환한다.
Note

RFC 3629는 잘못된 UTF-8 옥텟 시퀀스의 디코딩을 금지한다. 예를 들어, 잘못된 시퀀스 0xC0 0x80은 코드 유닛 0x0000으로 디코딩해서는 안 된다. Decode 알고리즘의 구현은 이런 잘못된 시퀀스를 만났을 때 반드시 URIError를 던져야 한다.

19.2.6.7 ParseHexOctet ( string, position )

The abstract operation ParseHexOctet takes arguments string (a String) and position (a non-negative integer) and returns either a non-negative integer or a non-empty List of SyntaxError objects. It performs the following steps when called:

  1. lenstring의 길이로 한다.
  2. 단언: position + 2 ≤ len이다.
  3. hexDigitsstringposition부터 position + 2까지의 부분문자열로 한다.
  4. parseResult를 ParseText(hexDigits, HexDigits[~Sep])로 한다.
  5. parseResult가 Parse Node가 아니면 parseResult를 반환한다.
  6. nparseResult의 MV로 한다.
  7. 단언: n은 0 이상 255 이하의 구간에 있다.
  8. n을 반환한다.

19.3 전역 객체의 생성자(Constructor) 프로퍼티

19.3.1 AggregateError ( . . . )

20.5.7.1 참조.

19.3.2 Array ( . . . )

23.1.1 참조.

19.3.3 ArrayBuffer ( . . . )

25.1.4 참조.

19.3.4 BigInt ( . . . )

21.2.1 참조.

19.3.5 BigInt64Array ( . . . )

23.2.5 참조.

19.3.6 BigUint64Array ( . . . )

23.2.5 참조.

19.3.7 Boolean ( . . . )

20.3.1 참조.

19.3.8 DataView ( . . . )

25.3.2 참조.

19.3.9 Date ( . . . )

21.4.2 참조.

19.3.10 Error ( . . . )

20.5.1 참조.

19.3.11 EvalError ( . . . )

20.5.5.1 참조.

19.3.12 FinalizationRegistry ( . . . )

26.2.1 참조.

19.3.13 Float16Array ( . . . )

23.2.5 참조.

19.3.14 Float32Array ( . . . )

23.2.5 참조.

19.3.15 Float64Array ( . . . )

23.2.5 참조.

19.3.16 Function ( . . . )

20.2.1 참조.

19.3.17 Int8Array ( . . . )

23.2.5 참조.

19.3.18 Int16Array ( . . . )

23.2.5 참조.

19.3.19 Int32Array ( . . . )

23.2.5 참조.

19.3.20 Iterator ( . . . )

27.1.3.1 참조.

19.3.21 Map ( . . . )

24.1.1 참조.

19.3.22 Number ( . . . )

21.1.1 참조.

19.3.23 Object ( . . . )

20.1.1 참조.

19.3.24 Promise ( . . . )

27.2.3 참조.

19.3.25 Proxy ( . . . )

28.2.1 참조.

19.3.26 RangeError ( . . . )

20.5.5.2 참조.

19.3.27 ReferenceError ( . . . )

20.5.5.3 참조.

19.3.28 RegExp ( . . . )

22.2.4 참조.

19.3.29 Set ( . . . )

24.2.2 참조.

19.3.30 SharedArrayBuffer ( . . . )

25.2.3 참조.

19.3.31 String ( . . . )

22.1.1 참조.

19.3.32 Symbol ( . . . )

20.4.1 참조.

19.3.33 SyntaxError ( . . . )

20.5.5.4 참조.

19.3.34 TypeError ( . . . )

20.5.5.5 참조.

19.3.35 Uint8Array ( . . . )

23.2.5 참조.

19.3.36 Uint8ClampedArray ( . . . )

23.2.5 참조.

19.3.37 Uint16Array ( . . . )

23.2.5 참조.

19.3.38 Uint32Array ( . . . )

23.2.5 참조.

19.3.39 URIError ( . . . )

20.5.5.6 참조.

19.3.40 WeakMap ( . . . )

24.3.1 참조.

19.3.41 WeakRef ( . . . )

26.1.1 참조.

19.3.42 WeakSet ( . . . )

24.4 참조.

19.4 전역 객체의 기타 프로퍼티

19.4.1 Atomics

25.4 참조.

19.4.2 JSON

25.5 참조.

19.4.3 Math

21.3 참조.

19.4.4 Reflect

28.1 참조.