页面模式偏好

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 语言值) 或 抛出完成)。 调用时执行以下步骤:

  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) 或 抛出完成)。 它允许宿主环境阻止某些允许开发者将字符串解释并求值为 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) 或 抛出完成)。 调用时执行以下步骤:

  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
              如果宿主是 Web 浏览器或以其他方式支持 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. 按 List 的逆序,对 variableDecls 的每个元素 variableDecl,执行
    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,并且宿主是 Web 浏览器或以其他方式支持 块级函数声明的 Web 遗留兼容性语义,则
    1. 令 declaredFuncOrVariableNames 为 declaredFuncNames 和 declaredVariableNames 的列表连接。
    2. 对直接包含在任意 Block、CaseClause 或 DefaultClause x 的 StatementList 中、且 body Contains x 是 true 的每个 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
                如果宿主是 Web 浏览器或以其他方式支持 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 为 trimmed 中满足 StrDecimalLiteral 语法的最长前缀,它可能就是 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 时),则假定其为 10,但如果数字表示以 "0x" 或 "0X" 开头,则假定为 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 为 numberString 以基数 radixMV 表示法所表示的整数值,其中使用字母 A 到 Z 以及 a 到 z 表示值为 10 到 35 的数字。(不过,如果 radixMV = 10 且 numberString 包含超过 20 个有效数字,则由实现选择,第 20 个之后的每个有效数字都可以替换为数字 0;如果 radixMV 不是 2、4、8、10、16 或 32 之一,则 mathInt 可以是表示 numberString 以基数 radixMV 表示法所表示整数值的实现近似整数。)
  15. 如果 sign = -1 且 mathInt = 0,则返回 -0𝔽。
  16. 返回 𝔽(sign × mathInt)。
注

此函数可能只将 string 的开头部分解释为整数值;它会忽略无法解释为整数表示法一部分的任何码元,并且不会指示这些码元已被忽略。

19.2.6 URI 处理函数

统一资源标识符(Uniform Resource Identifier,URI)是用于标识 Internet 上的资源(例如网页或文件)以及访问这些资源所使用的传输协议(例如 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 )

此函数计算 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 )

抽象操作 Encode,接收参数 string (String) 和 extraUnescaped (String);返回值:(正常完成 (值:String) 或 抛出完成)。 它执行 URI 编码和转义,将 string 按照 6.1.4 中的说明解释为 UTF-16 编码码点序列。如果字符在 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 的 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) 或 抛出完成)。 它执行 URI 反转义和解码,同时保留与 preserveEscapeSet 中基本拉丁字符对应的任何转义序列。 调用时执行以下步骤:

  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 不包含 Unicode 码点的有效 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 处的两个十六进制字符序列解析为无符号 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。