19 전역 객체

다음은 전역 객체이다:

19.1 전역 객체의 값 속성들

19.1.1 globalThis

Realm 기록 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 전역 객체의 함수 속성들

19.2.1 eval ( source )

이 함수는 %eval% 내재 객체이다.

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

  1. PerformEval(source, false, false)를 반환한다.

19.2.1.1 PerformEval ( source, strictCaller, direct )

The abstract operation PerformEval takes arguments source (an ECMAScript language value), strictCaller (a Boolean), and direct (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. 단언: 만약 directfalse이면, strictCallerfalse여야 한다.
  2. 만약 source가 문자열이 아니면, source를 반환한다.
  3. evalRealm을 현재 Realm 기록으로 하자.
  4. 참고: 직접 eval의 경우, evalRealmeval의 호출자와 eval 함수 자체의 영역(realm)이다.
  5. 수행 ? HostEnsureCanCompileStrings(evalRealm, « », source, direct).
  6. inFunctionfalse로 하자.
  7. inMethodfalse로 하자.
  8. inDerivedConstructorfalse로 하자.
  9. inClassFieldInitializerfalse로 하자.
  10. 만약 directtrue이면,
    1. thisEnvRecGetThisEnvironment()로 하자.
    2. 만약 thisEnvRecFunction Environment Record라면,
      1. functhisEnvRec.[[FunctionObject]]로 하자.
      2. inFunctiontrue로 설정하라.
      3. inMethodthisEnvRec.HasSuperBinding()로 설정하라.
      4. 만약 func.[[ConstructorKind]]derived라면 inDerivedConstructortrue로 설정하라.
      5. classFieldInitializerNamefunc.[[ClassFieldInitializerName]]로 하라.
      6. 만약 classFieldInitializerNameempty가 아니면 inClassFieldInitializertrue로 설정하라.
  11. 구현 정의된 순서로, 파싱과 오류 검출을 섞어 수행할 수 있는 다음 하위단계를 수행한다:
    1. scriptParseText(source, Script)로 하자.
    2. 만약 script가 오류 목록이면, SyntaxError 예외를 던진다.
    3. 만약 scriptScriptBody를 포함하지 않으면, undefined를 반환한다.
    4. bodyscriptScriptBody로 하자.
    5. 만약 inFunctionfalse이고 bodyNewTarget을 포함하면, SyntaxError 예외를 던진다.
    6. 만약 inMethodfalse이고 bodySuperProperty를 포함하면, SyntaxError 예외를 던진다.
    7. 만약 inDerivedConstructorfalse이고 bodySuperCall을 포함하면, SyntaxError 예외를 던진다.
    8. 만약 inClassFieldInitializertrue이고 bodyContainsArgumentstrue이면, SyntaxError 예외를 던진다.
  12. 만약 strictCallertrue이면, strictEvaltrue로 한다.
  13. 그렇지 않으면, strictEvalscriptScriptIsStrict로 한다.
  14. runningContext를 실행 중인 실행 컨텍스트로 하자.
  15. 참고: 만약 directtrue이면, runningContext직접 eval을 수행한 실행 컨텍스트가 된다. 만약 directfalse이면, runningContexteval 함수 호출의 실행 컨텍스트가 된다.
  16. 만약 directtrue이면,
    1. lexEnvNewDeclarativeEnvironment(runningContext's LexicalEnvironment)로 하라.
    2. varEnvrunningContext's VariableEnvironment로 하라.
    3. privateEnvrunningContext's PrivateEnvironment로 하라.
  17. 그렇지 않으면,
    1. lexEnvNewDeclarativeEnvironment(evalRealm.[[GlobalEnv]])로 하라.
    2. varEnvevalRealm.[[GlobalEnv]]로 하라.
    3. privateEnvnull로 하라.
  18. 만약 strictEvaltrue이면 varEnvlexEnv로 설정하라.
  19. 만약 runningContext가 이미 일시중단되어 있지 않다면, runningContext를 일시중단하라.
  20. evalContext를 새로운 ECMAScript 코드 실행 컨텍스트로 하자.
  21. evalContext의 Function을 null로 설정하라.
  22. evalContextRealmevalRealm로 설정하라.
  23. evalContext의 ScriptOrModule을 runningContext's ScriptOrModule로 설정하라.
  24. evalContext의 VariableEnvironment을 varEnv로 설정하라.
  25. evalContext의 LexicalEnvironment을 lexEnv로 설정하라.
  26. evalContext의 PrivateEnvironment을 privateEnv로 설정하라.
  27. 실행 컨텍스트 스택에 evalContext를 푸시하라; 이제 evalContext가 실행 중인 실행 컨텍스트이다.
  28. resultCompletion(EvalDeclarationInstantiation(body, varEnv, lexEnv, privateEnv, strictEval))의 결과로 하라.
  29. 만약 result가 정상 완료이면,
    1. resultCompletion(Evaluation of body)의 결과로 설정하라.
  30. 만약 result가 정상 완료이고 result.[[Value]]empty이면,
    1. resultNormalCompletion(undefined)로 설정하라.
  31. evalContext를 일시중단하고 실행 컨텍스트 스택에서 제거하라.
  32. 실행 컨텍스트 스택의 맨 위에 있는 컨텍스트를 다시 실행 중인 실행 컨텍스트로 재개하라.
  33. result를 반환하라.
Note

eval 코드는 호출한 컨텍스트 또는 eval 코드 자체의 코드 중 어느 쪽이라도 엄격 모드 코드인 경우, 호출한 컨텍스트의 변수 환경에 변수나 함수 바인딩을 생성할 수 없다. 대신 그러한 바인딩들은 eval 코드에서만 접근 가능한 새로운 VariableEnvironment에 인스턴스화된다. let, const, 또는 class 선언으로 도입된 바인딩은 항상 새로운 LexicalEnvironment에 인스턴스화된다.

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )

The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (a Realm Record), parameterStrings (a List of Strings), bodyString (a String), and direct (a Boolean) and returns either a normal completion containing unused or a throw completion. 호스트 환경이 문자열을 ECMAScript 코드로 해석·평가하는 것을 허용하는 특정 ECMAScript 함수들을 차단할 수 있도록 한다.

parameterStrings는 함수 생성자들을 사용할 때 매개변수 목록을 만들기 위해 연결될 문자열들을 나타낸다. bodyString은 함수 본문 또는 eval 호출에 전달된 문자열을 나타낸다. direct는 평가가 직접 eval인지 여부를 나타낸다.

HostEnsureCanCompileStrings의 기본 구현은 NormalCompletion(unused)을 반환하는 것이다.

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

The abstract operation EvalDeclarationInstantiation takes arguments body (a ScriptBody Parse Node), varEnv (an Environment Record), lexEnv (a Declarative Environment Record), privateEnv (a PrivateEnvironment Record or null), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. varNamesbodyVarDeclaredNames로 하자.
  2. varDeclarationsbodyVarScopedDeclarations로 하자.
  3. 만약 strictfalse이면,
    1. 만약 varEnvGlobal Environment Record이면,
      1. varNames의 각 요소 name에 대해,
        1. 만약 HasLexicalDeclaration(varEnv, name)가 true이면, SyntaxError 예외를 던진다.
        2. 참고: eval은 전역 lexical 선언으로 가려질 글로벌 var 선언을 만들지 않는다.
    2. thisEnvlexEnv로 하자.
    3. 단언: 다음 루프는 종료된다.
    4. thisEnvvarEnv가 동일한 환경 레코드가 아닐 동안 반복,
      1. 만약 thisEnvObject Environment Record가 아니면,
        1. 참고: with 문(environment)은 어떠한 lexical 선언도 포함할 수 없으므로 var/let 호이스팅 충돌을 검사할 필요가 없다.
        2. varNames의 각 요소 name에 대해,
          1. 만약 ! thisEnv.HasBinding(name)가 true이면,
            1. Normative Optional
              호스트가 웹 브라우저이거나 Catch Block 안의 VariableStatement를 지원하면,
              1. 만약 thisEnvCatch 절의 Environment Record가 아니면 SyntaxError 예외를 던진다.
            2. 그렇지 않으면,
              1. SyntaxError 예외를 던진다.
          2. 참고: 직접 eval은 같은 이름의 lexical 선언보다 var 선언을 끌어올리지 않는다.
      2. thisEnvthisEnv.[[OuterEnv]]로 설정하라.
  4. privateIdentifiers를 새로운 빈 목록으로 하자.
  5. pointerprivateEnv로 하자.
  6. pointernull이 아닐 동안 반복,
    1. pointer.[[Names]]의 각 Private Name binding에 대해,
      1. 만약 privateIdentifiersbinding.[[Description]]을 포함하지 않으면, binding.[[Description]]privateIdentifiers에 추가하라.
    2. pointerpointer.[[OuterPrivateEnvironment]]로 설정하라.
  7. 만약 AllPrivateIdentifiersValid of bodyprivateIdentifiers를 인자로 호출한 결과가 false이면, SyntaxError 예외를 던진다.
  8. functionsToInitialize를 새로운 빈 목록으로 하자.
  9. declaredFunctionNames를 새로운 빈 목록으로 하자.
  10. varDeclarations의 각 요소 d에 대해, 역순으로,
    1. 만약 dVariableDeclaration, ForBinding, 또는 BindingIdentifier가 아니면,
      1. 단언: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, 또는 AsyncGeneratorDeclaration 중 하나이다.
      2. 참고: 동일 이름에 대한 함수 선언이 여러 개 있으면 마지막 선언이 사용된다.
      3. fndBoundNames의 유일한 요소로 하자.
      4. 만약 declaredFunctionNamesfn이 포함되어 있지 않으면,
        1. 만약 varEnvGlobal Environment Record이면,
          1. fnDefinable을 ? CanDeclareGlobalFunction(varEnv, fn)로 하라.
          2. 만약 fnDefinablefalse이면, TypeError 예외를 던진다.
        2. fndeclaredFunctionNames에 추가하라.
        3. dfunctionsToInitialize의 첫 번째 요소로 삽입하라.
  11. declaredVarNames를 새로운 빈 목록으로 하자.
  12. varDeclarations의 각 요소 d에 대해,
    1. 만약 dVariableDeclaration, ForBinding, 또는 BindingIdentifier이면,
      1. dBoundNames의 각 문자열 vn에 대해,
        1. 만약 declaredFunctionNamesvn을 포함하지 않으면,
          1. 만약 varEnvGlobal Environment Record이면,
            1. vnDefinable을 ? CanDeclareGlobalVar(varEnv, vn)로 하라.
            2. 만약 vnDefinablefalse이면, TypeError 예외를 던진다.
          2. 만약 declaredVarNamesvn을 포함하지 않으면,
            1. vndeclaredVarNames에 추가하라.
  13. Normative Optional
    만약 strictfalse이고 호스트가 웹 브라우저이거나 Block-Level Function Declaration 웹 Legacy 호환성 의미론를 지원하면,
    1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNames의 리스트 이어붙이기로 하라.
    2. 어떤 Block, CaseClause, 또는 DefaultClause xStatementList에 직접 포함된 각 FunctionDeclaration f에 대해, 조건: bodyx를 포함하면,
      1. funcNamefBindingIdentifierStringValue로 하라.
      2. 만약 FunctionDeclaration f를 같은 이름의 BindingIdentifier를 가진 VariableStatement으로 바꿔도 body에 대한 Early Errors가 발생하지 않으면,
        1. bindingExistsfalse로 하자.
        2. thisEnvlexEnv로 설정하라.
        3. 단언: 다음 루프는 종료된다.
        4. thisEnvvarEnv가 아닐 동안 반복,
          1. 만약 thisEnvObject Environment Record가 아니면,
            1. 만약 ! thisEnv.HasBinding(funcName)가 true이면,
              1. Normative Optional
                호스트가 웹 브라우저이거나 Catch Block 안의 VariableStatement를 지원하면,
                1. 만약 thisEnvCatch 절의 Environment Record가 아니면 bindingExiststrue로 설정하라.
              2. 그렇지 않으면,
                1. bindingExiststrue로 설정하라.
          2. thisEnvthisEnv.[[OuterEnv]]로 설정하라.
        5. 만약 bindingExistsfalse이고 varEnvGlobal Environment Record이면,
          1. 만약 HasLexicalDeclaration(varEnv, funcName)가 false이면,
            1. fnDefinable을 ? CanDeclareGlobalVar(varEnv, funcName)로 하라.
          2. 그렇지 않으면,
            1. fnDefinablefalse로 하라.
        6. 그렇지 않으면,
          1. fnDefinabletrue로 하라.
        7. 만약 bindingExistsfalse이고 fnDefinabletrue이면,
          1. 만약 declaredFunctionOrVarNamesfuncName을 포함하지 않으면,
            1. 만약 varEnvGlobal Environment Record이면,
              1. 수행 ? CreateGlobalVarBinding(varEnv, funcName, true).
            2. 그렇지 않으면,
              1. bindingExists를 ! varEnv.HasBinding(funcName)로 설정하라.
              2. 만약 bindingExistsfalse이면,
                1. 수행 ! varEnv.CreateMutableBinding(funcName, true).
                2. 수행 ! varEnv.InitializeBinding(funcName, undefined).
            3. funcNamedeclaredFunctionOrVarNames에 추가하라.
          2. FunctionDeclaration f가 평가될 때, 15.2.6에 제공된 FunctionDeclaration 평가 알고리즘 대신 다음 단계를 수행하라:
            1. gEnv를 실행 중인 실행 컨텍스트의 VariableEnvironment로 하라.
            2. bEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 하라.
            3. fObj를 ! bEnv.GetBindingValue(funcName, false)로 하라.
            4. 수행 ? gEnv.SetMutableBinding(funcName, fObj, false).
            5. unused를 반환하라.
  14. 참고: 이 알고리즘 단계 이후에는 varEnvGlobal Environment Record이고 전역 객체가 Proxy 특수 객체가 아닌 한 비정상 종료가 발생하지 않는다.
  15. lexDeclarationsbodyLexicallyScopedDeclarations로 하자.
  16. lexDeclarations의 각 요소 d에 대해,
    1. 참고: 렉시컬 선언 이름들은 여기서만 인스턴스화되며 초기화되지는 않는다.
    2. dBoundNames의 각 요소 dn에 대해,
      1. 만약 IsConstantDeclaration of dtrue이면,
        1. 수행 ? lexEnv.CreateImmutableBinding(dn, true).
      2. 그렇지 않으면,
        1. 수행 ? lexEnv.CreateMutableBinding(dn, false).
  17. functionsToInitialize의 각 Parse Node f에 대해,
    1. fnfBoundNames의 유일한 요소로 하라.
    2. foInstantiateFunctionObject of f에 인자 lexEnvprivateEnv로 하여 얻는다.
    3. 만약 varEnvGlobal Environment Record이면,
      1. 수행 ? CreateGlobalFunctionBinding(varEnv, fn, fo, true).
    4. 그렇지 않으면,
      1. bindingExists를 ! varEnv.HasBinding(fn)로 하라.
      2. 만약 bindingExistsfalse이면,
        1. 참고: 다음 호출은 14 이전의 검증 때문에 비정상 종료를 반환할 수 없다.
        2. 수행 ! varEnv.CreateMutableBinding(fn, true).
        3. 수행 ! varEnv.InitializeBinding(fn, fo).
      3. 그렇지 않으면,
        1. 수행 ! varEnv.SetMutableBinding(fn, fo, false).
  18. declaredVarNames의 각 문자열 vn에 대해,
    1. 만약 varEnvGlobal Environment Record이면,
      1. 수행 ? CreateGlobalVarBinding(varEnv, vn, true).
    2. 그렇지 않으면,
      1. bindingExists를 ! varEnv.HasBinding(vn)로 하라.
      2. 만약 bindingExistsfalse이면,
        1. 참고: 다음 호출은 14 이전의 검증 때문에 비정상 종료를 반환할 수 없다.
        2. 수행 ! varEnv.CreateMutableBinding(vn, true).
        3. 수행 ! varEnv.InitializeBinding(vn, undefined).
  19. unused를 반환하라.

19.2.2 isFinite ( number )

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

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

  1. num을 ? ToNumber(number)로 하라.
  2. 만약 num유한이면, true를 반환한다.
  3. false를 반환한다.

19.2.3 isNaN ( number )

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

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

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

XNaN인지 테스트하는 신뢰할 수 있는 방법은 X !== X 형식의 표현식이다. 그 결과는 오직 XNaN일 때만 true가 된다.

19.2.4 parseFloat ( string )

이 함수는 string 인수의 내용을 십진 리터럴로 해석하여 결정된 Number 값을 생성한다.

이 함수는 %parseFloat% 내재 객체이다.

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

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

이 함수는 string의 선행 부분만을 Number 값으로 해석할 수 있다; 십진수 표기법의 일부로 해석할 수 없는 코드 유닛은 무시되며, 무시된 코드 유닛이 있었다는 표시를 제공하지 않는다.

19.2.5 parseInt ( string, radix )

이 함수는 지정된 radix에 따라 string의 내용을 해석하여 정수 Number를 생성한다. string의 선행 공백은 무시된다. 만약 radix가 0으로 강제 변환되면(예: undefined일 때), 숫자 표기법이 "0x" 또는 "0X"으로 시작하지 않는 한 10으로 간주된다; 시작이 "0x" 또는 "0X"이면 16으로 간주된다. 만약 radix가 16이면, 숫자 표기법은 선택적으로 "0x" 또는 "0X"으로 시작할 수 있다.

이 함수는 %parseInt% 내재 객체이다.

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

  1. inputString을 ? ToString(string)로 하라.
  2. trimmedString을 ! TrimString(inputString, start)로 하라.
  3. sign을 1로 하라.
  4. 만약 trimmedString이 비어있지 않고 첫 코드 유닛이 코드 유닛 0x002D (HYPHEN-MINUS)이면, sign을 -1로 설정하라.
  5. 만약 trimmedString이 비어있지 않고 첫 코드 유닛이 0x002B (PLUS SIGN) 또는 0x002D (HYPHEN-MINUS)이면, trimmedString을 인덱스 1부터의 부분 문자열로 설정하라.
  6. radixMV(? ToInt32(radix))로 하라.
  7. stripPrefixtrue로 하라.
  8. 만약 radixMV ≠ 0이면,
    1. 만약 radixMV < 2 또는 radixMV > 36이면, NaN을 반환한다.
    2. 만약 radixMV ≠ 16이면, stripPrefixfalse로 설정하라.
  9. 그렇지 않으면,
    1. radixMV를 10으로 설정하라.
  10. 만약 stripPrefixtrue이면,
    1. 만약 trimmedString의 길이 ≥ 2이고 처음 두 코드 유닛이 "0x" 또는 "0X"이면,
      1. trimmedString을 인덱스 2부터의 부분 문자열로 설정하라.
      2. radixMV를 16으로 설정하라.
  11. 만약 trimmedString이 radix-radixMV 자릿수가 아닌 코드 유닛을 포함하면, 그 첫 번째 그런 코드 유닛의 인덱스를 end로 하라; 그렇지 않으면 endtrimmedString의 길이로 하라.
  12. numberStringtrimmedString의 0부터 end까지의 부분 문자열로 하라.
  13. 만약 numberString이 비어있으면, NaN을 반환한다.
  14. mathIntnumberString이 radix-radixMV 표기법으로 나타내는 정수 값으로 하라; 값 10~35에 대해 문자 AZaz를 사용한다. (단, 만약 radixMV = 10이고 numberString이 20개를 초과하는 유효 숫자를 포함하면 구현은 20번째 이후의 모든 유효 숫자를 0으로 대체할 수 있다; 그리고 radixMV가 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)을 식별하는 문자열이다. ECMAScript 언어 자체는 URI 사용을 위한 추가 지원을 제공하지 않으며, 이 절에서 설명된 대로 URI를 인코딩하고 디코딩하는 함수들만 제공한다. encodeURIdecodeURI는 전체 URI와 함께 동작하도록 설계되었으며, 예약된 문자가 특별한 의미(예: 구분자)를 갖는 것으로 간주하여 인코딩하지 않는다. encodeURIComponentdecodeURIComponent는 URI의 개별 구성 요소와 함께 동작하도록 설계되었으며, 예약된 문자가 텍스트를 나타내고 구성 요소가 전체 URI의 일부일 때 특별한 의미를 피하기 위해 인코딩되어야 한다고 가정한다.

Note 1

예약 문자의 집합은 RFC 2396을 기반으로 하며 더 최근의 RFC 3986이 도입한 변경을 반영하지 않는다.

Note 2

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

19.2.6.1 decodeURI ( encodedURI )

이 함수는 encodeURI 함수가 도입했을 수 있는 형태의 이스케이프 시퀀스와 UTF-8 인코딩을 해당 코드 포인트가 나타내는 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산한다. encodeURI가 도입했을 수 없는 이스케이프 시퀀스는 대체하지 않는다.

이 함수는 %decodeURI% 내재 객체이다.

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

  1. uriString을 ? ToString(encodedURI)로 하라.
  2. preserveEscapeSet";/?:@&=+$,#"로 하라.
  3. Return ? Decode(uriString, preserveEscapeSet).

19.2.6.2 decodeURIComponent ( encodedURIComponent )

이 함수는 encodeURIComponent 함수가 도입했을 수 있는 형태의 이스케이프 시퀀스와 UTF-8 인코딩을 해당 코드 포인트가 나타내는 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산한다.

이 함수는 %decodeURIComponent% 내재 객체이다.

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

  1. componentString을 ? ToString(encodedURIComponent)로 하라.
  2. preserveEscapeSet을 빈 문자열로 하라.
  3. Return ? 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. Return ? 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. Return ? 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. UTF-16로 인코딩된 코드 포인트의 시퀀스로서 string을 해석하면서 URI 인코딩과 이스케이프를 수행한다(참조 6.1.4). RFC 2396에서 예약되지 않은 것으로 식별되었거나 extraUnescaped에 나타나는 문자는 이스케이프되지 않는다. It performs the following steps when called:

  1. lenstring의 길이로 하라.
  2. result를 빈 문자열로 하라.
  3. alwaysUnescaped를 ASCII 단어 문자와 "-.!~*'()"의 문자열 이어붙이기로 하라.
  4. unescapedSetalwaysUnescapedextraUnescaped의 문자열 이어붙이기로 하라.
  5. k를 0으로 하라.
  6. k < len인 동안 반복,
    1. codeUnitstring의 인덱스 k의 코드 유닛으로 하라.
    2. 만약 unescapedSetcodeUnit을 포함하면,
      1. kk + 1로 설정하라.
      2. resultresultcodeUnit의 문자열 이어붙이기로 설정하라.
    3. 그렇지 않으면,
      1. cpCodePointAt(string, k)로 하라.
      2. 만약 cp.[[IsUnpairedSurrogate]]true이면, URIError 예외를 던진다.
      3. kk + cp.[[CodeUnitCount]]로 설정하라.
      4. octetscp.[[CodePoint]]에 UTF-8 변환을 적용하여 얻은 옥텟들의 목록으로 하라.
      5. octets의 각 요소 octet에 대해,
        1. hex를 대문자 16진수로 포맷된 octet의 문자열 표현으로 하라.
        2. resultresult, "%", 및 StringPad(hex, 2, "0", start)의 문자열 이어붙이기로 설정하라.
  7. result를 반환한다.
Note

퍼센트 인코딩은 개별 옥텟을 표현하기 위해 사용되므로, 단일 코드 포인트가 여러 연속된 이스케이프 시퀀스(각 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. Basic Latin 문자들 중 preserveEscapeSet에 해당하는 이스케이프 시퀀스는 보존하면서 URI 언이스케이프와 디코딩을 수행한다. It performs the following steps when called:

  1. lenstring의 길이로 하라.
  2. result를 빈 문자열로 하라.
  3. k를 0으로 하라.
  4. k < len인 동안 반복,
    1. codeUnitstring의 인덱스 k의 코드 유닛으로 하라.
    2. segmentcodeUnit로 하라.
    3. 만약 codeUnit이 코드 유닛 0x0025 (PERCENT SIGN)이면,
      1. 만약 k + 3 > len이면, URIError 예외를 던진다.
      2. escapestringk부터 k + 3까지의 부분 문자열로 하라.
      3. firstOctetParseHexOctet(string, k + 1)로 하라.
      4. 만약 firstOctet정수가 아니면, URIError 예외를 던진다.
      5. kk + 2로 설정하라.
      6. nfirstOctet의 선행 1 비트 수로 하라.
      7. 만약 n = 0이면,
        1. asciiChar를 숫자 값이 firstOctet인 코드 유닛으로 하라.
        2. 만약 preserveEscapeSetasciiChar를 포함하면 segmentescape로 설정; 그렇지 않으면 segmentasciiChar로 설정하라.
      8. 그렇지 않으면,
        1. 만약 n = 1 또는 n > 4이면, URIError 예외를 던진다.
        2. octets를 « firstOctet »로 하라.
        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. continuationByteoctets에 추가하라.
          7. kk + 2로 설정하라.
          8. jj + 1로 설정하라.
        5. 단언: octets의 길이는 n이다.
        6. 만약 octets가 유효한 UTF-8 인코딩을 포함하지 않으면, URIError 예외를 던진다.
        7. codePointoctets에 UTF-8 변환을 적용해 얻은 코드 포인트로 하라.
        8. segmentUTF16EncodeCodePoint(codePoint)로 설정하라.
    4. resultresultsegment의 문자열 이어붙이기로 설정하라.
    5. kk + 1로 설정하라.
  5. result를 반환한다.
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. 문자열의 지정된 position에서 두 개의 16진수 문자를 파싱하여 부호 없는 8비트 정수로 변환한다. It performs the following steps when called:

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

19.3 전역 객체의 생성자 속성들

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.