페이지 표시 설정

19 전역 객체

전역 객체는:

19.1 전역 객체의 값 프로퍼티

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 전역 객체의 함수 프로퍼티

19.2.1 eval ( source )

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

호출되면 다음 단계를 수행합니다:

  1. ? PerformEval(source, false, false)를 반환합니다.

19.2.1.1 PerformEval ( source, strictCaller, direct )

추상 연산 PerformEval. 인수 source (ECMAScript 언어 값), strictCaller (Boolean) 및 direct (Boolean). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. 단언: direct가 false이면 strictCaller도 false입니다.
  2. source가 String이 아니면 source를 반환합니다.
  3. evalRealm을 현재 Realm Record로 둡니다.
  4. 참고: 직접 eval의 경우 evalRealm은 eval 호출자와 eval 함수 자체 모두의 realm입니다.
  5. ? HostEnsureCanCompileStrings(evalRealm, « », source, direct)를 수행합니다.
  6. inFunc를 false로 둡니다.
  7. inMethod를 false로 둡니다.
  8. inDerivedCtor를 false로 둡니다.
  9. inClassFieldInitializer를 false로 둡니다.
  10. direct가 true이면, 다음을 수행합니다.
    1. thisEnvRecord를 GetThisEnvironment()로 둡니다.
    2. thisEnvRecord가 Function Environment Record이면, 다음을 수행합니다.
      1. func를 thisEnvRecord.[[FunctionObject]]로 둡니다.
      2. inFunc를 true로 설정합니다.
      3. inMethod를 thisEnvRecord.HasSuperBinding()으로 설정합니다.
      4. func.[[ConstructorKind]]가 derived이면 inDerivedCtor를 true로 설정합니다.
      5. classFieldInitializerName을 func.[[ClassFieldInitializerName]]으로 둡니다.
      6. classFieldInitializerName이 empty가 아니면 inClassFieldInitializer를 true로 설정합니다.
  11. 다음 하위 단계를 구현체 정의 순서로 수행하며, 파싱과 오류 검출을 서로 섞어서 수행할 수도 있습니다:
    1. script를 ParseText(source, Script)로 둡니다.
    2. script가 오류의 List이면 SyntaxError 예외를 던집니다.
    3. script Contains ScriptBody가 false이면 undefined를 반환합니다.
    4. body를 script의 ScriptBody로 둡니다.
    5. inFunc가 false이고 body Contains NewTarget이면 SyntaxError 예외를 던집니다.
    6. inMethod가 false이고 body Contains SuperProperty이면 SyntaxError 예외를 던집니다.
    7. inDerivedCtor가 false이고 body Contains SuperCall이면 SyntaxError 예외를 던집니다.
    8. inClassFieldInitializer가 true이고 body의 ContainsArguments가 true이면 SyntaxError 예외를 던집니다.
  12. strictCaller가 true이면 strictEval을 true로 둡니다.
  13. 그렇지 않으면 strictEval을 script의 ScriptIsStrict로 둡니다.
  14. runningContext를 실행 중인 실행 컨텍스트로 둡니다.
  15. 참고: direct가 true이면 runningContext는 직접 eval을 수행한 실행 컨텍스트입니다. direct가 false이면 runningContext는 eval 함수 호출의 실행 컨텍스트입니다.
  16. direct가 true이면, 다음을 수행합니다.
    1. lexicalEnv를 NewDeclarativeEnvironment(runningContext의 LexicalEnvironment)로 둡니다.
    2. variableEnv를 runningContext의 VariableEnvironment로 둡니다.
    3. privateEnv를 runningContext의 PrivateEnvironment로 둡니다.
  17. 그렇지 않으면,
    1. lexicalEnv를 NewDeclarativeEnvironment(evalRealm.[[GlobalEnv]])로 둡니다.
    2. variableEnv를 evalRealm.[[GlobalEnv]]로 둡니다.
    3. privateEnv를 null로 둡니다.
  18. strictEval이 true이면 variableEnv를 lexicalEnv로 설정합니다.
  19. runningContext가 아직 일시 중단되지 않았다면 runningContext를 일시 중단합니다.
  20. evalContext를 새로운 ECMAScript 코드 실행 컨텍스트로 둡니다.
  21. evalContext의 Function을 null로 설정합니다.
  22. evalContext의 Realm을 evalRealm으로 설정합니다.
  23. evalContext의 ScriptOrModule을 runningContext의 ScriptOrModule로 설정합니다.
  24. evalContext의 VariableEnvironment를 variableEnv로 설정합니다.
  25. evalContext의 LexicalEnvironment를 lexicalEnv로 설정합니다.
  26. evalContext의 PrivateEnvironment를 privateEnv로 설정합니다.
  27. evalContext를 실행 컨텍스트 스택에 푸시합니다. 이제 evalContext가 실행 중인 실행 컨텍스트입니다.
  28. result를 Completion(EvalDeclarationInstantiation(body, variableEnv, lexicalEnv, privateEnv, strictEval))으로 둡니다.
  29. result가 정상 완료이면, 다음을 수행합니다.
    1. result를 Completion(body의 Evaluation)으로 설정합니다.
  30. result가 정상 완료이고 result.[[Value]]가 empty이면, 다음을 수행합니다.
    1. result를 NormalCompletion(undefined)으로 설정합니다.
  31. evalContext를 일시 중단하고 실행 컨텍스트 스택에서 제거합니다.
  32. 이제 실행 컨텍스트 스택의 맨 위에 있는 컨텍스트를 실행 중인 실행 컨텍스트로 재개합니다.
  33. ? result를 반환합니다.
참고

호출 컨텍스트의 코드 또는 eval 코드 중 하나라도 엄격 모드 코드이면 eval 코드는 eval을 호출한 호출 컨텍스트의 변수 환경에 변수 또는 함수 바인딩을 인스턴스화할 수 없습니다. 대신 이러한 바인딩은 eval 코드에서만 접근할 수 있는 새로운 VariableEnvironment에 인스턴스화됩니다. let, const 또는 class 선언이 도입한 바인딩은 항상 새로운 LexicalEnvironment에 인스턴스화됩니다.

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, paramStrings, bodyString, direct )

호스트 정의 추상 연산 HostEnsureCanCompileStrings. 인수 calleeRealm (Realm 레코드), paramStrings (리스트 (요소: String)), bodyString (String) 및 direct (Boolean). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호스트 환경이 개발자가 문자열을 ECMAScript 코드로 해석하고 평가할 수 있게 하는 특정 ECMAScript 함수를 차단할 수 있도록 합니다.

paramStrings는 함수 생성자 중 하나를 사용할 때 서로 연결되어 매개변수 목록을 구성하는 문자열을 나타냅니다. bodyString은 함수 본문 또는 eval 호출에 전달된 문자열을 나타냅니다. direct는 평가가 직접 eval인지 여부를 나타냅니다.

HostEnsureCanCompileStrings의 기본 구현은 NormalCompletion(unused)을 반환합니다.

19.2.1.3 EvalDeclarationInstantiation ( body, variableEnv, lexicalEnv, privateEnv, strict )

추상 연산 EvalDeclarationInstantiation. 인수 body (a ScriptBody Parse Node), variableEnv (Environment 레코드), lexicalEnv (Declarative Environment 레코드), privateEnv ((PrivateEnvironment 레코드 또는 null)) 및 strict (Boolean). 반환값: (정상 완료 (값: unused) 또는 throw 완료). 호출되면 다음 단계를 수행한다.

  1. variableNames를 body의 VarDeclaredNames로 둡니다.
  2. variableDecls를 body의 VarScopedDeclarations로 둡니다.
  3. strict가 false이면, 다음을 수행합니다.
    1. variableEnv가 Global Environment Record이면, 다음을 수행합니다.
      1. variableNames의 각 요소 name에 대해 다음을 수행합니다.
        1. HasLexicalDeclaration(variableEnv, name)이 true이면 SyntaxError 예외를 던집니다.
        2. 참고: eval은 전역 렉시컬 선언에 의해 가려지는 전역 var 선언을 생성하지 않습니다.
    2. thisEnv를 lexicalEnv로 둡니다.
    3. 단언: 다음 반복은 종료됩니다.
    4. thisEnv와 variableEnv가 동일한 Environment Record가 아닌 동안 다음을 반복합니다.
      1. thisEnv가 Object Environment Record가 아니면, 다음을 수행합니다.
        1. 참고: with 문의 환경에는 렉시컬 선언이 포함될 수 없으므로 var/let 호이스팅 충돌을 검사할 필요가 없습니다.
        2. variableNames의 각 요소 name에 대해 다음을 수행합니다.
          1. ! thisEnv.HasBinding(name)이 true이면, 다음을 수행합니다.
            1. Normative Optional
              호스트가 웹 브라우저이거나 그 밖의 방식으로 Catch 블록의 VariableStatement을 지원하면, 다음을 수행합니다.
              1. thisEnv가 Catch 절의 Environment Record가 아니면 SyntaxError 예외를 던집니다.
            2. 그렇지 않으면,
              1. SyntaxError 예외를 던집니다.
          2. 참고: 직접 eval은 같은 이름의 렉시컬 선언을 넘어 var 선언을 호이스팅하지 않습니다.
      2. thisEnv를 thisEnv.[[OuterEnv]]로 설정합니다.
  4. privateIdentifiers를 새로운 빈 List로 둡니다.
  5. pointer를 privateEnv로 둡니다.
  6. pointer가 null이 아닌 동안 다음을 반복합니다.
    1. pointer.[[Names]]의 각 Private Name binding에 대해 다음을 수행합니다.
      1. privateIdentifiers에 binding.[[Description]]이 포함되어 있지 않으면 binding.[[Description]]을 privateIdentifiers에 추가합니다.
    2. pointer를 pointer.[[OuterPrivateEnvironment]]로 설정합니다.
  7. 인수 privateIdentifiers를 사용한 body의 AllPrivateIdentifiersValid가 false이면 SyntaxError 예외를 던집니다.
  8. funcsToInitialize를 새로운 빈 List로 둡니다.
  9. declaredFuncNames를 새로운 빈 List로 둡니다.
  10. variableDecls의 각 요소 variableDecl에 대해 List의 역순으로 다음을 수행합니다.
    1. variableDecl이 VariableDeclaration, ForBinding 또는 BindingIdentifier 중 어느 것도 아니면, 다음을 수행합니다.
      1. 단언: variableDecl은 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration 또는 AsyncGeneratorDeclaration 중 하나입니다.
      2. 참고: 같은 이름에 여러 함수 선언이 있으면 마지막 선언이 사용됩니다.
      3. funcName을 variableDecl의 BoundNames의 유일한 요소로 둡니다.
      4. declaredFuncNames에 funcName이 포함되어 있지 않으면, 다음을 수행합니다.
        1. variableEnv가 Global Environment Record이면, 다음을 수행합니다.
          1. funcDefinable을 ? CanDeclareGlobalFunction(variableEnv, funcName)으로 둡니다.
          2. funcDefinable이 false이면 TypeError 예외를 던집니다.
        2. funcName을 declaredFuncNames에 추가합니다.
        3. variableDecl을 funcsToInitialize의 첫 번째 요소로 삽입합니다.
  11. declaredVariableNames를 새로운 빈 List로 둡니다.
  12. variableDecls의 각 요소 variableDecl에 대해 다음을 수행합니다.
    1. variableDecl이 VariableDeclaration, ForBinding 또는 BindingIdentifier 중 하나이면, 다음을 수행합니다.
      1. variableDecl의 BoundNames의 각 String name에 대해 다음을 수행합니다.
        1. declaredFuncNames에 name이 포함되어 있지 않으면, 다음을 수행합니다.
          1. variableEnv가 Global Environment Record이면, 다음을 수행합니다.
            1. variableDefinable을 ? CanDeclareGlobalVar(variableEnv, name)로 둡니다.
            2. variableDefinable이 false이면 TypeError 예외를 던집니다.
          2. declaredVariableNames에 name이 포함되어 있지 않으면, 다음을 수행합니다.
            1. name을 declaredVariableNames에 추가합니다.
  13. Normative Optional
    strict가 false이고 호스트가 웹 브라우저이거나 그 밖의 방식으로 블록 수준 함수 선언의 웹 레거시 호환성 의미론을 지원하면, 다음을 수행합니다.
    1. declaredFuncOrVariableNames를 declaredFuncNames와 declaredVariableNames의 목록 연결로 둡니다.
    2. body Contains x가 true인 어떤 Block, CaseClause 또는 DefaultClause x의 StatementList에 직접 포함된 각 FunctionDeclaration funcDecl에 대해 다음을 수행합니다.
      1. funcName을 funcDecl의 BindingIdentifier의 StringValue로 둡니다.
      2. FunctionDeclaration funcDecl을 funcName을 BindingIdentifier로 갖는 VariableStatement로 바꿔도 body에 조기 오류가 발생하지 않으면, 다음을 수행합니다.
        1. bindingExists를 false로 둡니다.
        2. thisEnv를 lexicalEnv로 설정합니다.
        3. 단언: 다음 반복은 종료됩니다.
        4. thisEnv가 variableEnv가 아닌 동안 다음을 반복합니다.
          1. thisEnv가 Object Environment Record가 아니면, 다음을 수행합니다.
            1. ! thisEnv.HasBinding(funcName)이 true이면, 다음을 수행합니다.
              1. Normative Optional
                호스트가 웹 브라우저이거나 그 밖의 방식으로 Catch 블록의 VariableStatement을 지원하면, 다음을 수행합니다.
                1. thisEnv가 Catch 절의 Environment Record가 아니면 bindingExists를 true로 설정합니다.
              2. 그렇지 않으면,
                1. bindingExists를 true로 설정합니다.
          2. thisEnv를 thisEnv.[[OuterEnv]]로 설정합니다.
        5. bindingExists가 false이고 variableEnv가 Global Environment Record이면, 다음을 수행합니다.
          1. HasLexicalDeclaration(variableEnv, funcName)이 false이면, 다음을 수행합니다.
            1. funcDefinable을 ? CanDeclareGlobalVar(variableEnv, funcName)로 둡니다.
          2. 그렇지 않으면,
            1. funcDefinable을 false로 둡니다.
        6. 그렇지 않으면,
          1. funcDefinable을 true로 둡니다.
        7. bindingExists가 false이고 funcDefinable이 true이면, 다음을 수행합니다.
          1. declaredFuncOrVariableNames에 funcName이 포함되어 있지 않으면, 다음을 수행합니다.
            1. variableEnv가 Global Environment Record이면, 다음을 수행합니다.
              1. ? CreateGlobalVarBinding(variableEnv, funcName, true)를 수행합니다.
            2. 그렇지 않으면,
              1. bindingExists를 ! variableEnv.HasBinding(funcName)으로 설정합니다.
              2. bindingExists가 false이면, 다음을 수행합니다.
                1. ! variableEnv.CreateMutableBinding(funcName, true)를 수행합니다.
                2. ! variableEnv.InitializeBinding(funcName, undefined)를 수행합니다.
            3. funcName을 declaredFuncOrVariableNames에 추가합니다.
          2. FunctionDeclaration funcDecl이 평가될 때 15.2.6에 제공된 FunctionDeclaration Evaluation 알고리즘 대신 다음 단계를 수행합니다:
            1. globalEnv를 실행 중인 실행 컨텍스트의 VariableEnvironment로 둡니다.
            2. blockEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
            3. funcObj를 ! blockEnv.GetBindingValue(funcName, false)로 둡니다.
            4. ? globalEnv.SetMutableBinding(funcName, funcObj, false)를 수행합니다.
            5. unused를 반환합니다.
  14. 참고: variableEnv가 Global Environment Record이고 전역 객체가 Proxy 특수 객체인 경우를 제외하면 이 알고리즘 단계 이후에는 비정상 종료가 발생하지 않습니다.
  15. lexicalDecls를 body의 LexicallyScopedDeclarations로 둡니다.
  16. lexicalDecls의 각 요소 lexicalDecl에 대해 다음을 수행합니다.
    1. 참고: 렉시컬하게 선언된 이름은 여기에서 인스턴스화되기만 하며 초기화되지는 않습니다.
    2. lexicalDecl의 BoundNames의 각 요소 name에 대해 다음을 수행합니다.
      1. lexicalDecl의 IsConstantDeclaration이 true이면, 다음을 수행합니다.
        1. ? lexicalEnv.CreateImmutableBinding(name, true)를 수행합니다.
      2. 그렇지 않으면,
        1. ? lexicalEnv.CreateMutableBinding(name, false)를 수행합니다.
  17. funcsToInitialize의 각 Parse Node funcDecl에 대해 다음을 수행합니다.
    1. funcName을 funcDecl의 BoundNames의 유일한 요소로 둡니다.
    2. funcObj를 인수 lexicalEnv 및 privateEnv를 사용한 funcDecl의 InstantiateFunctionObject로 둡니다.
    3. variableEnv가 Global Environment Record이면, 다음을 수행합니다.
      1. ? CreateGlobalFunctionBinding(variableEnv, funcName, funcObj, true)를 수행합니다.
    4. 그렇지 않으면,
      1. bindingExists를 ! variableEnv.HasBinding(funcName)으로 둡니다.
      2. bindingExists가 false이면, 다음을 수행합니다.
        1. 참고: 다음 호출은 14 단계에 앞선 검증으로 인해 비정상 완료를 반환할 수 없습니다.
        2. ! variableEnv.CreateMutableBinding(funcName, true)를 수행합니다.
        3. ! variableEnv.InitializeBinding(funcName, funcObj)를 수행합니다.
      3. 그렇지 않으면,
        1. ! variableEnv.SetMutableBinding(funcName, funcObj, false)를 수행합니다.
  18. declaredVariableNames의 각 String variableName에 대해 다음을 수행합니다.
    1. variableEnv가 Global Environment Record이면, 다음을 수행합니다.
      1. ? CreateGlobalVarBinding(variableEnv, variableName, true)를 수행합니다.
    2. 그렇지 않으면,
      1. bindingExists를 ! variableEnv.HasBinding(variableName)으로 둡니다.
      2. bindingExists가 false이면, 다음을 수행합니다.
        1. 참고: 다음 호출은 14 단계에 앞선 검증으로 인해 비정상 완료를 반환할 수 없습니다.
        2. ! variableEnv.CreateMutableBinding(variableName, true)를 수행합니다.
        3. ! variableEnv.InitializeBinding(variableName, undefined)를 수행합니다.
  19. unused를 반환합니다.

19.2.2 isFinite ( value )

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

호출되면 다음 단계를 수행합니다:

  1. number를 ? ToNumber(value)로 둡니다.
  2. number가 유한 Number이면 true를 반환합니다.
  3. false를 반환합니다.

19.2.3 isNaN ( value )

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

호출되면 다음 단계를 수행합니다:

  1. number를 ? ToNumber(value)로 둡니다.
  2. number가 NaN이면 true를 반환합니다.
  3. false를 반환합니다.
참고

ECMAScript 코드에서 값 X가 NaN인지 안정적으로 검사하는 방법은 X !== X 형식의 표현식을 사용하는 것입니다. X가 NaN인 경우에만 결과가 true입니다.

19.2.4 parseFloat ( string )

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

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

호출되면 다음 단계를 수행합니다:

  1. inputString을 ? ToString(string)으로 둡니다.
  2. trimmedString을 ! TrimString(inputString, start)으로 둡니다.
  3. trimmed를 StringToCodePoints(trimmedString)로 둡니다.
  4. trimmedPrefix를 StrDecimalLiteral의 구문을 만족하는 trimmed의 가장 긴 접두사로 둡니다. 이는 trimmed 자체일 수도 있습니다. 이러한 접두사가 없으면 NaN을 반환합니다.
  5. parsedNumber를 ParseText(trimmedPrefix, StrDecimalLiteral)로 둡니다.
  6. 단언: parsedNumber는 Parse Node입니다.
  7. parsedNumber의 StringNumericValue를 반환합니다.
참고

이 함수는 string의 앞부분만 Number 값으로 해석할 수 있습니다. 십진수 리터럴 표기의 일부로 해석할 수 없는 코드 단위는 무시하며 이러한 코드 단위가 무시되었다는 어떠한 표시도 제공하지 않습니다.

19.2.5 parseInt ( string, radix )

이 함수는 지정된 radix에 따라 string의 내용을 해석하여 결정되는 정수 Number를 생성합니다. string 앞의 공백은 무시됩니다. radix가 0으로 강제 변환되면(undefined인 경우 등) 숫자 표현이 "0x" 또는 "0X"로 시작하는 경우를 제외하고 10으로 간주하며, 해당 경우에는 16으로 간주합니다. radix가 16이면 숫자 표현은 선택적으로 "0x" 또는 "0X"로 시작할 수 있습니다.

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

호출되면 다음 단계를 수행합니다:

  1. inputString을 ? ToString(string)으로 둡니다.
  2. radixMV를 ℝ(? ToInt32(radix))로 둡니다.
  3. radixMV ≠ 0이고 radixMV가 2부터 36까지의 폐구간에 속하지 않으면 NaN을 반환합니다.
  4. trimmedString을 ! TrimString(inputString, start)으로 둡니다.
  5. trimmedString이 빈 String이면 NaN을 반환합니다.
  6. sign을 1로 둡니다.
  7. trimmedString의 첫 번째 코드 단위가 코드 단위 0x002D (HYPHEN-MINUS)이면, 다음을 수행합니다.
    1. sign을 -1로 설정합니다.
    2. trimmedString을 trimmedString의 인덱스 1부터의 부분 문자열로 설정합니다.
  8. 그렇지 않고 trimmedString의 첫 번째 코드 단위가 코드 단위 0x002B (PLUS SIGN)이면, 다음을 수행합니다.
    1. trimmedString을 trimmedString의 인덱스 1부터의 부분 문자열로 설정합니다.
  9. radixMV = 0 또는 radixMV = 16이면, 다음을 수행합니다.
    1. trimmedString의 길이가 ≥ 2이고 trimmedString의 인덱스 0부터 2까지의 부분 문자열이 "0x" 또는 "0X" 중 하나이면, 다음을 수행합니다.
      1. trimmedString을 trimmedString의 인덱스 2부터의 부분 문자열로 설정합니다.
      2. radixMV를 16으로 설정합니다.
  10. radixMV = 0이면 radixMV를 10으로 설정합니다.
  11. trimmedString에 기수-radixMV 숫자가 아닌 코드 단위가 포함되어 있으면 end를 trimmedString 안에서 그러한 첫 번째 코드 단위의 인덱스로 둡니다. 그렇지 않으면 end를 trimmedString의 길이로 둡니다.
  12. numberString을 trimmedString의 인덱스 0부터 end까지의 부분 문자열로 둡니다.
  13. numberString이 비어 있으면 NaN을 반환합니다.
  14. mathInt를 값 10부터 35까지의 숫자에 문자 A부터 Z 및 a부터 z를 사용하여 기수-radixMV 표기법으로 numberString이 나타내는 정수 값으로 둡니다. (다만 radixMV = 10이고 numberString에 유효 숫자가 20개보다 많으면 구현체의 선택에 따라 20번째 이후의 모든 유효 숫자를 숫자 0으로 바꿀 수 있습니다. 또한 radixMV가 2, 4, 8, 10, 16 또는 32 중 하나가 아니면 mathInt는 기수-radixMV 표기법에서 numberString이 나타내는 정수 값을 표현하는 구현체 근사 정수일 수 있습니다.)
  15. sign = -1이고 mathInt = 0이면 -0𝔽을 반환합니다.
  16. 𝔽(sign × mathInt)을 반환합니다.
참고

이 함수는 string의 앞부분만 정수 값으로 해석할 수 있습니다. 정수 표기의 일부로 해석할 수 없는 코드 단위는 무시하며 이러한 코드 단위가 무시되었다는 어떠한 표시도 제공하지 않습니다.

19.2.6 URI 처리 함수

Uniform Resource Identifier, 즉 URI는 인터넷에서 리소스(예: 웹 페이지 또는 파일)와 이에 접근하기 위한 전송 프로토콜(예: HTTP 또는 FTP)을 식별하는 String입니다. ECMAScript 언어 자체는 이 절에 설명된 URI 인코딩 및 디코딩 함수를 제외하고 URI 사용을 지원하지 않습니다. encodeURI와 decodeURI는 완전한 URI를 처리하기 위한 것입니다. 예약 문자는 특별한 의미(예: 구분자로서)를 갖도록 의도되었다고 가정하므로 인코딩하지 않습니다. encodeURIComponent와 decodeURIComponent는 URI의 개별 구성 요소를 처리하기 위한 것입니다. 예약 문자는 텍스트를 나타낸다고 가정하며 구성 요소가 완전한 URI의 일부가 되었을 때 특별한 의미를 갖지 않도록 인코딩해야 합니다.

참고 1

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

참고 2

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

19.2.6.1 decodeURI ( encodedURI )

이 함수는 encodeURI 함수가 도입할 수 있는 종류의 각 이스케이프 시퀀스 및 UTF-8 인코딩을 해당 코드 포인트의 UTF-16 인코딩으로 바꾼 새로운 URI 버전을 계산합니다. encodeURI가 도입할 수 없었던 이스케이프 시퀀스는 바꾸지 않습니다.

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

호출되면 다음 단계를 수행합니다:

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

19.2.6.2 decodeURIComponent ( encodedURIComponent )

이 함수는 encodeURIComponent 함수가 도입할 수 있는 종류의 각 이스케이프 시퀀스 및 UTF-8 인코딩을 해당 코드 포인트의 UTF-16 인코딩으로 바꾼 새로운 URI 버전을 계산합니다.

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

호출되면 다음 단계를 수행합니다:

  1. componentString을 ? ToString(encodedURIComponent)로 둡니다.
  2. preserveEscapeSet을 빈 String으로 둡니다.
  3. ? Decode(componentString, preserveEscapeSet)를 반환합니다.

19.2.6.3 encodeURI ( uri )

이 함수는 특정 코드 포인트의 각 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 네 개의 이스케이프 시퀀스로 바꾼 UTF-16 인코딩(6.1.4) URI의 새로운 버전을 계산합니다.

이 함수는 %encodeURI% 내재 객체입니다.

호출되면 다음 단계를 수행합니다:

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

19.2.6.4 encodeURIComponent ( uriComponent )

이 함수는 특정 코드 포인트의 각 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 네 개의 이스케이프 시퀀스로 바꾼 UTF-16 인코딩(6.1.4) URI의 새로운 버전을 계산합니다.

이 함수는 %encodeURIComponent% 내재 객체입니다.

호출되면 다음 단계를 수행합니다:

  1. componentString을 ? ToString(uriComponent)로 둡니다.
  2. extraUnescaped를 빈 String으로 둡니다.
  3. ? Encode(componentString, extraUnescaped)를 반환합니다.

19.2.6.5 Encode ( string, extraUnescaped )

추상 연산 Encode. 인수 string (String) 및 extraUnescaped (String). 반환값: (정상 완료 (값: String) 또는 throw 완료). 6.1.4에 설명된 대로 string을 UTF-16으로 인코딩된 코드 포인트의 시퀀스로 해석하여 URI 인코딩 및 이스케이프를 수행합니다. 문자가 RFC 2396에서 예약되지 않은 문자로 식별되거나 extraUnescaped에 나타나면 이스케이프하지 않습니다. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. result를 빈 String으로 둡니다.
  3. alwaysUnescaped를 ASCII 단어 문자와 "-.!~*'()"의 문자열 연결로 둡니다.
  4. unescapedSet을 alwaysUnescaped와 extraUnescaped의 문자열 연결로 둡니다.
  5. k를 0으로 둡니다.
  6. k < length인 동안 다음을 반복합니다.
    1. codeUnit을 string 안의 인덱스 k에 있는 코드 단위로 둡니다.
    2. unescapedSet에 codeUnit이 포함되어 있으면, 다음을 수행합니다.
      1. k를 k + 1로 설정합니다.
      2. result를 result와 codeUnit의 문자열 연결로 설정합니다.
    3. 그렇지 않으면,
      1. codePoint를 CodePointAt(string, k)로 둡니다.
      2. codePoint.[[IsUnpairedSurrogate]]가 true이면 URIError 예외를 던집니다.
      3. k를 k + codePoint.[[CodeUnitCount]]로 설정합니다.
      4. octets를 codePoint.[[CodePoint]]에 UTF-8 변환을 적용하여 얻은 옥텟의 List로 둡니다.
      5. octets의 각 요소 octet에 대해 다음을 수행합니다.
        1. hex를 octet을 대문자 16진수로 형식화한 String 표현으로 둡니다.
        2. result를 result, "%" 및 StringPad(hex, 2, "0", start)의 문자열 연결로 설정합니다.
  7. result를 반환합니다.
참고

퍼센트 인코딩은 개별 옥텟을 나타내는 데 사용되므로 하나의 코드 포인트는 여러 개의 연속된 이스케이프 시퀀스(각 8비트 UTF-8 코드 단위마다 하나씩)로 표현될 수 있습니다.

19.2.6.6 Decode ( string, preserveEscapeSet )

추상 연산 Decode. 인수 string (String) 및 preserveEscapeSet (String). 반환값: (정상 완료 (값: String) 또는 throw 완료). preserveEscapeSet의 Basic Latin 문자에 대응하는 모든 이스케이프 시퀀스를 유지하면서 URI 이스케이프 해제 및 디코딩을 수행합니다. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. result를 빈 String으로 둡니다.
  3. k를 0으로 둡니다.
  4. k < length인 동안 다음을 반복합니다.
    1. codeUnit을 string 안의 인덱스 k에 있는 코드 단위로 둡니다.
    2. segment를 codeUnit으로 둡니다.
    3. codeUnit이 코드 단위 0x0025 (PERCENT SIGN)이면, 다음을 수행합니다.
      1. k + 3 > length이면 URIError 예외를 던집니다.
      2. escape를 string의 인덱스 k부터 k + 3까지의 부분 문자열로 둡니다.
      3. firstOctet을 ParseHexOctet(string, k + 1)로 둡니다.
      4. firstOctet이 정수가 아니면 URIError 예외를 던집니다.
      5. k를 k + 2로 설정합니다.
      6. n을 firstOctet에서 앞쪽의 1 비트 수로 둡니다.
      7. n = 0이면, 다음을 수행합니다.
        1. asciiChar를 숫자 값이 firstOctet인 코드 단위로 둡니다.
        2. preserveEscapeSet에 asciiChar가 포함되어 있으면 segment를 escape로 설정합니다. 그렇지 않으면 segment를 asciiChar로 설정합니다.
      8. 그렇지 않으면,
        1. n = 1 또는 n > 4이면 URIError 예외를 던집니다.
        2. octets를 « firstOctet »으로 둡니다.
        3. j를 1로 둡니다.
        4. j < n인 동안 다음을 반복합니다.
          1. k를 k + 1로 설정합니다.
          2. k + 3 > length이면 URIError 예외를 던집니다.
          3. string 안의 인덱스 k에 있는 코드 단위가 코드 단위 0x0025 (PERCENT SIGN)가 아니면 URIError 예외를 던집니다.
          4. continuationByte를 ParseHexOctet(string, k + 1)로 둡니다.
          5. continuationByte가 정수가 아니면 URIError 예외를 던집니다.
          6. continuationByte를 octets에 추가합니다.
          7. k를 k + 2로 설정합니다.
          8. j를 j + 1로 설정합니다.
        5. 단언: octets의 길이는 n입니다.
        6. octets에 유효한 유니코드 코드 포인트의 UTF-8 인코딩이 포함되어 있지 않으면 URIError 예외를 던집니다.
        7. codePoint를 octets에 UTF-8 변환을 적용하여, 즉 옥텟의 List를 21비트 값으로 변환하여 얻은 코드 포인트로 둡니다.
        8. segment를 UTF16EncodeCodePoint(codePoint)로 설정합니다.
    4. result를 result와 segment의 문자열 연결로 설정합니다.
    5. k를 k + 1로 설정합니다.
  5. result를 반환합니다.
참고

RFC 3629는 유효하지 않은 UTF-8 옥텟 시퀀스의 디코딩을 금지합니다. 예를 들어 유효하지 않은 시퀀스 0xC0 0x80은 코드 단위 0x0000으로 디코딩되어서는 안 됩니다. Decode 알고리즘 구현체는 이러한 유효하지 않은 시퀀스를 발견하면 URIError를 던져야 합니다.

19.2.6.7 ParseHexOctet ( string, position )

추상 연산 ParseHexOctet. 인수 string (String) 및 position (음이 아닌 정수). 반환값: (음이 아닌 정수 또는 a non-empty List of SyntaxError objects). string의 지정된 position에 있는 두 개의 16진수 문자 시퀀스를 부호 없는 8비트 정수로 파싱합니다. 호출되면 다음 단계를 수행한다.

  1. length를 string의 길이로 둡니다.
  2. 단언: position + 2 ≤ length입니다.
  3. hexDigits를 string의 position부터 position + 2까지의 부분 문자열로 둡니다.
  4. parseResult를 ParseText(hexDigits, HexDigits[~Sep])로 둡니다.
  5. parseResult가 Parse Node가 아니면 parseResult를 반환합니다.
  6. n을 parseResult의 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 AsyncDisposableStack ( . . . )

27.4.1를 참조하시기 바랍니다.

19.3.5 BigInt ( . . . )

21.2.1를 참조하시기 바랍니다.

19.3.6 BigInt64Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.7 BigUint64Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.8 Boolean ( . . . )

20.3.1를 참조하시기 바랍니다.

19.3.9 DataView ( . . . )

25.3.2를 참조하시기 바랍니다.

19.3.10 Date ( . . . )

21.4.2를 참조하시기 바랍니다.

19.3.11 DisposableStack ( . . . )

27.3.1를 참조하시기 바랍니다.

19.3.12 Error ( . . . )

20.5.1를 참조하시기 바랍니다.

19.3.13 EvalError ( . . . )

20.5.5.1를 참조하시기 바랍니다.

19.3.14 FinalizationRegistry ( . . . )

26.2.1를 참조하시기 바랍니다.

19.3.15 Float16Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.16 Float32Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.17 Float64Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.18 Function ( . . . )

20.2.1를 참조하시기 바랍니다.

19.3.19 Int8Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.20 Int16Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.21 Int32Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.22 Iterator ( . . . )

27.1.3.1를 참조하시기 바랍니다.

19.3.23 Map ( . . . )

24.1.1를 참조하시기 바랍니다.

19.3.24 Number ( . . . )

21.1.1를 참조하시기 바랍니다.

19.3.25 Object ( . . . )

20.1.1를 참조하시기 바랍니다.

19.3.26 Promise ( . . . )

27.5.3를 참조하시기 바랍니다.

19.3.27 Proxy ( . . . )

28.2.1를 참조하시기 바랍니다.

19.3.28 RangeError ( . . . )

20.5.5.2를 참조하시기 바랍니다.

19.3.29 ReferenceError ( . . . )

20.5.5.3를 참조하시기 바랍니다.

19.3.30 RegExp ( . . . )

22.2.4를 참조하시기 바랍니다.

19.3.31 Set ( . . . )

24.2.2를 참조하시기 바랍니다.

19.3.32 SharedArrayBuffer ( . . . )

25.2.3를 참조하시기 바랍니다.

19.3.33 String ( . . . )

22.1.1를 참조하시기 바랍니다.

19.3.34 SuppressedError ( . . . )

20.5.8.1를 참조하시기 바랍니다.

19.3.35 Symbol ( . . . )

20.4.1를 참조하시기 바랍니다.

19.3.36 SyntaxError ( . . . )

20.5.5.4를 참조하시기 바랍니다.

19.3.37 TypeError ( . . . )

20.5.5.5를 참조하시기 바랍니다.

19.3.38 Uint8Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.39 Uint8ClampedArray ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.40 Uint16Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.41 Uint32Array ( . . . )

23.2.5를 참조하시기 바랍니다.

19.3.42 URIError ( . . . )

20.5.5.6를 참조하시기 바랍니다.

19.3.43 WeakMap ( . . . )

24.3.1를 참조하시기 바랍니다.

19.3.44 WeakRef ( . . . )

26.1.1를 참조하시기 바랍니다.

19.3.45 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를 참조하시기 바랍니다.