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 )

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,则 strictCaller 也是 false
  2. 如果 source 不是 String,则返回 source
  3. evalRealm当前 Realm Record
  4. 注:在直接 eval 的情况下,evalRealmeval 调用者以及 eval 函数自身的 realm
  5. 执行 ? HostEnsureCanCompileStrings(evalRealm, « », source, direct)。
  6. inFuncfalse
  7. inMethodfalse
  8. inDerivedCtorfalse
  9. inClassFieldInitializerfalse
  10. 如果 directtrue,则
    1. thisEnvRecordGetThisEnvironment()。
    2. 如果 thisEnvRecordFunction Environment Record,则
      1. functhisEnvRecord.[[FunctionObject]]
      2. inFunc 设置为 true
      3. inMethod 设置为 thisEnvRecord.HasSuperBinding()。
      4. 如果 func.[[ConstructorKind]]derived,则将 inDerivedCtor 设置为 true
      5. classFieldInitializerNamefunc.[[ClassFieldInitializerName]]
      6. 如果 classFieldInitializerName 不是 empty,则将 inClassFieldInitializer 设置为 true
  11. 实现定义的顺序执行以下子步骤,可能会交错执行解析和错误检测:
    1. scriptParseText(source, Script)。
    2. 如果 script 是错误列表,则抛出 SyntaxError 异常。
    3. 如果 script Contains ScriptBodyfalse,则返回 undefined
    4. bodyscriptScriptBody
    5. 如果 inFuncfalsebody Contains NewTarget,则抛出 SyntaxError 异常。
    6. 如果 inMethodfalsebody Contains SuperProperty,则抛出 SyntaxError 异常。
    7. 如果 inDerivedCtorfalsebody Contains SuperCall,则抛出 SyntaxError 异常。
    8. 如果 inClassFieldInitializertruebodyContainsArgumentstrue,则抛出 SyntaxError 异常。
  12. 如果 strictCallertrue,则令 strictEvaltrue
  13. 否则,令 strictEvalscriptScriptIsStrict
  14. runningContext 为运行中的执行上下文。
  15. 注:如果 directtrue,则 runningContext 将是执行直接 eval 的执行上下文。如果 directfalse,则 runningContext 将是 eval 函数调用的执行上下文。
  16. 如果 directtrue,则
    1. lexicalEnvNewDeclarativeEnvironment(runningContext 的 LexicalEnvironment)。
    2. variableEnvrunningContext 的 VariableEnvironment。
    3. privateEnvrunningContext 的 PrivateEnvironment。
  17. 否则,
    1. lexicalEnvNewDeclarativeEnvironment(evalRealm.[[GlobalEnv]])。
    2. variableEnvevalRealm.[[GlobalEnv]]
    3. privateEnvnull
  18. 如果 strictEvaltrue,则将 variableEnv 设置为 lexicalEnv
  19. 如果 runningContext 尚未挂起,则挂起 runningContext
  20. evalContext 为新的 ECMAScript 代码执行上下文
  21. evalContext 的 Function 设置为 null
  22. evalContextRealm 设置为 evalRealm
  23. evalContext 的 ScriptOrModule 设置为 runningContext 的 ScriptOrModule。
  24. evalContext 的 VariableEnvironment 设置为 variableEnv
  25. evalContext 的 LexicalEnvironment 设置为 lexicalEnv
  26. evalContext 的 PrivateEnvironment 设置为 privateEnv
  27. evalContext 压入执行上下文栈;evalContext 现在是运行中的执行上下文。
  28. resultCompletion(EvalDeclarationInstantiation(body, variableEnv, lexicalEnv, privateEnv, strictEval))。
  29. 如果 result 是 normal completion,则
    1. result 设置为 Completion(bodyEvaluation)。
  30. 如果 result 是 normal completion 且 result.[[Value]]empty,则
    1. result 设置为 NormalCompletion(undefined)。
  31. 挂起 evalContext 并将其从执行上下文栈中移除。
  32. 恢复当前位于执行上下文栈顶部的上下文作为运行中的执行上下文。
  33. 返回 ? result
Note

如果调用 eval 的调用上下文代码或 eval 代码任一者是严格模式代码,则 eval 代码不能在调用上下文的变量环境中实例化变量或函数绑定。相反,此类绑定会在一个仅对 eval 代码可访问的新 VariableEnvironment 中实例化。由 letconstclass 声明引入的绑定总是在新的 LexicalEnvironment 中实例化。

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, paramStrings, bodyString, direct )

The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (a Realm Record), paramStrings (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 函数。

paramStrings 表示在使用某个函数构造器时,会被连接在一起以构建参数列表的字符串。bodyString 表示函数体,或传给 eval 调用的字符串。 direct 表示该求值是否为直接 eval。

HostEnsureCanCompileStrings 的默认实现是返回 NormalCompletion(unused)。

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

The abstract operation EvalDeclarationInstantiation takes arguments body (a ScriptBody Parse Node), variableEnv (an Environment Record), lexicalEnv (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. variableNamesbodyVarDeclaredNames
  2. variableDeclsbodyVarScopedDeclarations
  3. 如果 strictfalse,则
    1. 如果 variableEnv 是一个 Global Environment Record,则
      1. variableNames 的每个元素 name,执行:
        1. 如果 HasLexicalDeclaration(variableEnv, name) 为 true,则抛出一个 SyntaxError 异常。
        2. 注:eval 不会创建会被全局词法声明遮蔽的全局 var 声明。
    2. thisEnvlexicalEnv
    3. 断言:以下循环将会终止。
    4. 重复,直到 thisEnvvariableEnv 是同一个 Environment Record
      1. 如果 thisEnv 不是 Object Environment Record,则
        1. 注:with 语句的环境不能包含任何词法声明,因此不需要检查 var/let 提升冲突。
        2. variableNames 的每个元素 name,执行:
          1. 如果 ! thisEnv.HasBinding(name) 为 true,则
            1. 如果宿主是 Web 浏览器,或以其他方式支持 Catch 块中的 VariableStatement,则
              1. 如果 thisEnv 不是 Catch 子句的 Environment Record,则抛出一个 SyntaxError 异常。
            2. 否则,
              1. 抛出一个 SyntaxError 异常。
          2. 注:直接 eval 不会把 var 声明提升到同名词法声明之上。
      2. thisEnv 设为 thisEnv.[[OuterEnv]]
  4. privateIdentifiers 为一个新的空 List
  5. pointerprivateEnv
  6. 重复,直到 pointernull
    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 不是 VariableDeclarationForBindingBindingIdentifier 中的任一者,则
      1. 断言:variableDeclFunctionDeclarationGeneratorDeclarationAsyncFunctionDeclarationAsyncGeneratorDeclaration
      2. 注:如果同一名称有多个函数声明,则使用最后一个声明。
      3. funcNamevariableDeclBoundNames 的唯一元素。
      4. 如果 declaredFuncNames包含 funcName,则
        1. 如果 variableEnv 是一个 Global Environment Record,则
          1. funcDefinable 为 ? CanDeclareGlobalFunction(variableEnv, funcName)。
          2. 如果 funcDefinablefalse,则抛出一个 TypeError 异常。
        2. funcName 追加到 declaredFuncNames
        3. variableDecl 作为 funcsToInitialize 的第一个元素插入。
  11. declaredVariableNames 为一个新的空 List
  12. variableDecls 的每个元素 variableDecl,执行:
    1. 如果 variableDeclVariableDeclarationForBindingBindingIdentifier 中的任一者,则
      1. variableDeclBoundNames 的每个 String name,执行:
        1. 如果 declaredFuncNames包含 name,则
          1. 如果 variableEnv 是一个 Global Environment Record,则
            1. variableDefinable 为 ? CanDeclareGlobalVar(variableEnv, name)。
            2. 如果 variableDefinablefalse,则抛出一个 TypeError 异常。
          2. 如果 declaredVariableNames包含 name,则
            1. name 追加到 declaredVariableNames
  13. 如果 strictfalse,且宿主是 Web 浏览器,或以其他方式支持 块级函数声明的 Web 遗留兼容性语义,则
    1. declaredFuncOrVariableNamesdeclaredFuncNamesdeclaredVariableNames列表连接
    2. 对每个 FunctionDeclaration funcDecl,其直接包含在任何 BlockCaseClauseDefaultClause xStatementList 中,且 body Contains xtrue,执行:
      1. funcNamefuncDeclBindingIdentifierStringValue
      2. 如果将 FunctionDeclaration funcDecl 替换为以 funcName 作为 BindingIdentifierVariableStatement 不会为 body 产生任何早期错误,则
        1. bindingExistsfalse
        2. thisEnv 设为 lexicalEnv
        3. 断言:以下循环将会终止。
        4. 重复,直到 thisEnvvariableEnv
          1. 如果 thisEnv 不是 Object Environment Record,则
            1. 如果 ! thisEnv.HasBinding(funcName) 为 true,则
              1. 如果宿主是 Web 浏览器,或以其他方式支持 Catch 块中的 VariableStatement,则
                1. 如果 thisEnv 不是 Catch 子句的 Environment Record,则将 bindingExists 设为 true
              2. 否则,
                1. bindingExists 设为 true
          2. thisEnv 设为 thisEnv.[[OuterEnv]]
        5. 如果 bindingExistsfalsevariableEnv 是一个 Global Environment Record,则
          1. 如果 HasLexicalDeclaration(variableEnv, funcName) 为 false,则
            1. funcDefinable 为 ? CanDeclareGlobalVar(variableEnv, funcName)。
          2. 否则,
            1. funcDefinablefalse
        6. 否则,
          1. funcDefinabletrue
        7. 如果 bindingExistsfalsefuncDefinabletrue,则
          1. 如果 declaredFuncOrVariableNames包含 funcName,则
            1. 如果 variableEnv 是一个 Global Environment Record,则
              1. 执行 ? CreateGlobalVarBinding(variableEnv, funcName, true)。
            2. 否则,
              1. bindingExists 设为 ! variableEnv.HasBinding(funcName)。
              2. 如果 bindingExistsfalse,则
                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. 注:除非 variableEnvGlobal Environment Record全局对象Proxy 异质对象,否则在此算法步骤之后不会发生异常终止。
  15. lexicalDeclsbodyLexicallyScopedDeclarations
  16. lexicalDecls 的每个元素 lexicalDecl,执行:
    1. 注:词法声明的名称仅在此处实例化,但不初始化。
    2. lexicalDeclBoundNames 的每个元素 name,执行:
      1. 如果 lexicalDeclIsConstantDeclarationtrue,则
        1. 执行 ? lexicalEnv.CreateImmutableBinding(name, true)。
      2. 否则,
        1. 执行 ? lexicalEnv.CreateMutableBinding(name, false)。
  17. funcsToInitialize 的每个 Parse Node funcDecl,执行:
    1. funcNamefuncDeclBoundNames 的唯一元素。
    2. funcObj 为使用参数 lexicalEnvprivateEnvfuncDecl 执行 InstantiateFunctionObject 的结果。
    3. 如果 variableEnv 是一个 Global Environment Record,则
      1. 执行 ? CreateGlobalFunctionBinding(variableEnv, funcName, funcObj, true)。
    4. 否则,
      1. bindingExists 为 ! variableEnv.HasBinding(funcName)。
      2. 如果 bindingExistsfalse,则
        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. 如果 bindingExistsfalse,则
        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有限的,则返回 true
  3. 返回 false

19.2.3 isNaN ( value )

此函数是 %isNaN% 内在对象。

它在被调用时执行以下步骤:

  1. number 为 ? ToNumber(value)。
  2. 如果 numberNaN,则返回 true
  3. 返回 false
Note

ECMAScript 代码测试值 X 是否为 NaN 的一种可靠方式,是形如 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. trimmedPrefixtrimmed 中满足 StrDecimalLiteral 语法的最长前缀,它可以是 trimmed 自身。如果不存在这样的前缀,则返回 NaN
  5. parsedNumberParseText(trimmedPrefix, StrDecimalLiteral)。
  6. 断言:parsedNumberParse Node
  7. 返回 parsedNumberStringNumericValue
Note

此函数可能只把 string 的前导部分解释为 Number 值;它会忽略任何不能解释为十进制字面量记号一部分的码元,并且不会给出任何此类码元已被忽略的指示。

19.2.5 parseInt ( string, radix )

此函数根据指定的 radix 解释 string 的内容,产生一个整数 Number。string 中的前导空白会被忽略。如果 radix 强制转换为 0(例如当其为 undefined 时),则假定它为 10,除非数字表示以 "0x""0X" 开头,在这种情况下假定它为 16。如果 radix 为 16,则数字表示可以选择以 "0x""0X" 开头。

它是 %parseInt% 内在对象。

它在被调用时执行以下步骤:

  1. inputString 为 ? ToString(string)。
  2. trimmedString 为 ! TrimString(inputString, start)。
  3. sign 为 1。
  4. 如果 trimmedString 不为空且 trimmedString 的第一个码元是码元 0x002D(HYPHEN-MINUS),则将 sign 设置为 -1。
  5. 如果 trimmedString 不为空且 trimmedString 的第一个码元是码元 0x002B(PLUS SIGN)或码元 0x002D(HYPHEN-MINUS),则将 trimmedString 设置为 trimmedString 从索引 1 开始的子字符串
  6. radixMV(? ToInt32(radix))。
  7. stripPrefixtrue
  8. 如果 radixMV ≠ 0,则
    1. 如果 radixMV < 2 或 radixMV > 36,则返回 NaN
    2. 如果 radixMV ≠ 16,则将 stripPrefix 设置为 false
  9. 否则,
    1. radixMV 设置为 10。
  10. 如果 stripPrefixtrue,则
    1. 如果 trimmedString 的长度 ≥ 2 且 trimmedString 的前两个码元是 "0x""0X",则
      1. trimmedString 设置为 trimmedString 从索引 2 开始的子字符串
      2. radixMV 设置为 16。
  11. 如果 trimmedString 包含不是 radix-radixMV 数字的码元,则令 endtrimmedString 中第一个此类码元的索引;否则令 endtrimmedString 的长度。
  12. numberStringtrimmedString 从 0 到 end子字符串
  13. 如果 numberString 为空,则返回 NaN
  14. mathIntnumberString 以 radix-radixMV 记号表示的整数值,使用字母 AZ 以及 az 表示值为 10 到 35 的数字。(但是,如果 radixMV = 10 且 numberString 包含超过 20 个有效数字,则实现可以选择把第 20 个之后的每个有效数字替换为 0 数字;并且如果 radixMV 不是 2、4、8、10、16 或 32 之一,则 mathInt 可以是表示 numberString 以 radix-radixMV 记号所表示整数值的实现近似整数。)
  15. 如果 mathInt = 0,则
    1. 如果 sign = -1,则返回 -0𝔽
    2. 返回 +0𝔽
  16. 返回 𝔽(sign × mathInt)。
Note

此函数可能只把 string 的前导部分解释为整数值;它会忽略任何不能解释为整数记号一部分的码元,并且不会给出任何此类码元已被忽略的指示。

19.2.6 URI 处理函数

统一资源标识符(Uniform Resource Identifiers,URI)是标识资源(例如网页或文件)以及在 Internet 上访问这些资源所用传输协议(例如 HTTP 或 FTP)的 String。除了本节所述用于编码和解码 URI 的函数外,ECMAScript 语言自身不提供任何使用 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 编码。不会替换不可能由 encodeURI 引入的转义序列。

它是 %decodeURI% 内在对象。

它在被调用时执行以下步骤:

  1. uriString 为 ? ToString(encodedURI)。
  2. preserveEscapeSet";/?:@&=+$,#"
  3. 返回 ? Decode(uriString, preserveEscapeSet)。

19.2.6.2 decodeURIComponent ( encodedURIComponent )

此函数计算 URI 的新版本,其中每个可能由 encodeURIComponent 函数引入的转义序列和 UTF-8 编码都会被替换为其所表示码点的 UTF-16 编码。

它是 %decodeURIComponent% 内在对象。

它在被调用时执行以下步骤:

  1. componentString 为 ? ToString(encodedURIComponent)。
  2. preserveEscapeSet 为空 String。
  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 为空 String。
  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. 它执行 URI 编码和转义,将 string 解释为 6.1.4 中所述的 UTF-16 编码码点序列。如果某个字符在 RFC 2396 中被标识为非保留字符,或出现在 extraUnescaped 中,则不会被转义。 It performs the following steps when called:

  1. lengthstring 的长度。
  2. result 为空 String。
  3. alwaysUnescapedASCII 单词字符"-.!~*'()"字符串连接
  4. unescapedSetalwaysUnescapedextraUnescaped字符串连接
  5. k 为 0。
  6. 重复,只要 k < length
    1. codeUnitstring 中索引 k 处的码元。
    2. 如果 unescapedSet 包含 codeUnit,则
      1. k 设置为 k + 1。
      2. result 设置为 resultcodeUnit字符串连接
    3. 否则,
      1. codePointCodePointAt(string, k)。
      2. 如果 codePoint.[[IsUnpairedSurrogate]]true,则抛出 URIError 异常。
      3. k 设置为 k + codePoint.[[CodeUnitCount]]
      4. octets 为对 codePoint.[[CodePoint]] 应用 UTF-8 转换所得的八位字节 List
      5. octets 的每个元素 octet,执行:
        1. hexoctet 的 String 表示,格式化为大写十六进制数。
        2. result 设置为 result"%"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. 它执行 URI 反转义和解码,并保留与 preserveEscapeSet 中的基本拉丁字符对应的任何转义序列。 It performs the following steps when called:

  1. lengthstring 的长度。
  2. result 为空 String。
  3. k 为 0。
  4. 重复,只要 k < length
    1. codeUnitstring 中索引 k 处的码元。
    2. segmentcodeUnit
    3. 如果 codeUnit 是码元 0x0025(PERCENT SIGN),则
      1. 如果 k + 3 > length,则抛出 URIError 异常。
      2. escapestringkk + 3 的子字符串
      3. firstOctetParseHexOctet(string, k + 1)。
      4. 如果 firstOctet 不是整数,则抛出 URIError 异常。
      5. k 设置为 k + 2。
      6. nfirstOctet 中前导 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. continuationByteParseHexOctet(string, k + 1)。
          5. 如果 continuationByte 不是整数,则抛出 URIError 异常。
          6. continuationByte 追加到 octets
          7. k 设置为 k + 2。
          8. j 设置为 j + 1。
        5. 断言:octets 的长度是 n
        6. 如果 octets包含某个 Unicode 码点的有效 UTF-8 编码,则抛出 URIError 异常。
        7. codePoint 为对 octets 应用 UTF-8 转换所得的码点,即从八位字节 List 到 21 位值。
        8. segment 设置为 UTF16EncodeCodePoint(codePoint)。
    4. result 设置为 resultsegment字符串连接
    5. k 设置为 k + 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. 它把 string 中指定 position 处的两个十六进制字符序列解析为无符号 8 位整数。 It performs the following steps when called:

  1. lengthstring 的长度。
  2. 断言:position + 2 ≤ length
  3. hexDigitsstringpositionposition + 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 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