全局对象

2018-06-16 15:26 更新

 唯一的全局对象建立在控制进入任何执行环境之前。

 除非另外指明,全局对象的标准内置属性拥有特性 {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}。

 全局对象没有 [[Construct]] 内部属性 ; 全局对象不可能当做构造器用 new 运算符调用。

 全局对象没有 [[Call]] 内部属性,全局对象不可能当做函数来调用。

 全局对象的 [[Prototype]] 和 [[Class]] 内部属性值是依赖于实现的。

 除了本规范定义的属性之外,全局对象还可以拥有额外的宿主定义的属性。全局对象可包含一个值是全局对象自身的属性;例如,在 HTML 文档对象模型中全局对象的 window 属性是全局对象自身。

全局对象的值属性

NaN

 NaN 的值是 NaN(见 8.5)。这个属性拥有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

Infinity

 Infinity 的值是 +∞(见 8.5)。这个属性拥有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

undefined

 undefined 的值是 undefined(见 8.1)。这个属性拥有特性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

全局对象的函数属性

eval (x)

 当用一个参数 x 调用 eval 函数,采用如下步骤:

  1. 如果 Type(x) 不是 String, 返回 x.
  2. 令 prog 为 ECMAScript 代码,它是将 x 作为一个程序解析的结果。如果解析失败,抛出一个 SyntaxError 异常 ( 见 16 章 )。
  3. 令 evalCtx 为给 eval 代码 prog 建立的新执行环境 (10.4.2)。
  4. 令 result 为解释执行程序 prog 的结果。
  5. 退出执行环境 evalCtx, 恢复到之前的执行环境。
  6. 如果 result.type 是 normal 并且其完结类型值是 V, 则返回 V 值 .
  7. 如果 result.type 是 normal 并且其完结类型值是 empty, 则返回 undefined 值 .
  8. 否则,result.type 必定是 throw。将 result.value 作为异常抛出 .
直接调用 Eval

 一个 eval 函数的直接调用是表示为符合以下两个条件的 CallExpression:

 解释执行 CallExpression 中的 MemberExpression 的结果是个 引用 ,这个引用拥有一个 环境记录项 作为其基值,并且这个引用的名称是 "eval"。

 以这个 引用 作为参数调用 GetValue 抽象操作的结果是 15.1.2.1 定义的标准内置函数。

parseInt (string , radix)

 parseInt 函数根据指定的参数 radix,和 string 参数的内容解释结果来决定,产生一个整数值。string 开头的空白会被忽略。如果 radis 是 undefined 或 0,假定它是 10,除非数字是以字符对 0x 或 0X 开头的,这时假定 radix 是 16。如果 radix 是 16,数字开头的字符对 0x 或 0X 是可选的。

 当调用 parseInt 函数时,采用以下步骤:

  1. 令 inputString 为 ToString(string)。
  2. 令 S 为一个新创建的子字符串,它由 inputString 的第一个非 StrWhiteSpaceChar 字符和它后面跟着的所有字符组成。( 换句话说 , 删掉前面的空白。) 如果 inputString 不包含任何这样的字符 , 则令 S 为空字符串。
  3. 令 sign 为 1。
  4. 如果 S 不是空并且 S 的第一个字符是减号 -, 则令 sign 为−1。
  5. 如果 S 不是空并且 S 的第一个字符加号 + 或减号 -, 则删除 S 的第一个字符。
  6. 令 R = ToInt32(radix).
  7. 令 stripPrefix 为 true.
  8. 如果 R ≠ 0, 则如果 R < 2 或 R > 36, 则返回 NaN。如果 R ≠ 16, 令 stripPrefix 为 false.
  9. 否则 , R = 0令 R = 10.
  10. 如果 stripPrefix 是 true, 则如果 S 长度大于 2 并且 S 的头两个字符是“0x”或“0X”, 则删除 S 的头两个字符并且令 R = 16.
  11. 如果 S 包含任何不是 radix-R 进制的字符,则令 Z 为 S 的这样的字符之前的所有字符组成的子字符串;否则令 Z 为 S。.
  12. 如果 Z 是空 , 返回 NaN.
  13. 令 mathInt 为 Z 的 radix-R 进制表示的数学值,用字母 A-Z 和 a-z 来表示 10 到 35 之间的值。( 但是 , 如果 R 是 10 并且 Z 包含多余 20 位的值 , 可以替换 20 位后的每个数字为 0, 这是实现可选的功能 ; 如果 R 不是 2, 4, 8, 10, 16, 32, 则 mathInt 可以是 Z 的 radix-R 进制表示的依赖于实现的近似值。)
  14. 令 number 为 mathInt 的数值 .
  15. 返回 sign × number.

 parseInt 可以只把 string 的开头部分解释为整数值;它会忽略所有不能解释为整数记法的一部分的字符,并且没有指示会给出任何这些忽略的字符。

parseFloat (string)

 parseFloat 函数根据 string 参数的内容解释为十进制字面量的结果来决定,产生一个数值。

 当调用 parseFloat 函数,采用以下步骤:

  1. 令 inputString 为 ToString(string).
  2. 令 trimmedString 为一个新创建的子字符串,它由 inputString 的非 StrWhiteSpaceChar 字符的最左边字符和它右边跟着的所有字符组成。( 换句话说 , 删掉前面的空白。) 如果 inputString 不包含任何这样的字符 , 则令 trimmedString 为空字符串。
  3. 如果 trimmedString 或 trimmedString 的任何前缀都不满足 StrDecimalLiteral ( 见 9.3.1) 的语法 , 返回 NaN。
  4. 令 numberString 为满足 StrDecimalLiteral 语法的 trimmedString 的最长前缀,可能是 numberString 自身。
  5. 返回 numberString 的 MV 的数值。

 parseFloat 可以只把 string 的开头部分解释为数值;它会忽略所有不能解释为数值字面量记法的一部分的字符,并且没有指示会给出任何这些忽略的字符。

isNaN (number)

 如果指定参数为 NaN,则返回 true,否则返回 false。

  1. 如果 ToNumber(number) 是 NaN, 返回 true.
  2. 否则 , 返回 false.

 一个用 ECMAScript 代码来测试值 X 是否是 NaN 的方式是用 X !== X 表达式。当且仅当 X 是 NaN 时结果才是 true。

isFinite (number)

 如果指定参数为 NaN 或 +∞或−∞,则返回 false,否则返回 true。

  1. 如果 ToNumber(number) 是 NaN 或 +∞或−∞, 返回 false.
  2. 否则 , 返回 true.

处理 URI 的函数属性

 统一资源标识符,或叫做 URI,是用来标识互联网上的资源(例如,网页或文件)和怎样访问这些资源的传输协议(例如,HTTP 或 FTP)的字符串。除了 15.1.3.1, 15.1.3.2, 15.1.3.3,15.1.3.4 说明的用来编码和解码 URI 的函数之外 ECMAScript 语言自身不提供任何使用 URL 的支持。

 许多 ECMAScript 实现提供额外的函数,方法来操作网页;这些函数超出了本标准的范围。

 一个 URI 是由组件分隔符分割的组件序列组成。其一般形式是:

 Scheme : First / Second ; Third ? Fourth

 其中斜体的名字代表组件;“:”, “/”, “;”,“?”是当作分隔符的保留字符。encodeURI 和 decodeURI 函数操作的是完整的 URI;这俩函数假定 URI 中的任何保留字符都有特殊意义,所有不会编码它们。encodeURIComponent 和 decodeURIComponent 函数操作的是组成 URI 的个别组件;这俩函数假定任何保留字符都代表普通文本,所以必须编码它们,所以它们出现在组成一个完整 URI 的组件里面时不会解释成保留字符了。

 以下词法文法指定了编码后 URI 的形式。

 语法

uri ::: uriCharactersopt uriCharacters ::: uriCharacter uriCharactersopt uriCharacter ::: uriReserved uriUnescaped uriEscaped uriReserved ::: one of ; / ? : @ & = + $ , uriUnescaped ::: uriAlpha DecimalDigit uriMark uriEscaped ::: % HexDigit HexDigit uriAlpha ::: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z uriMark ::: one of - _ . ! ~ * ' ( )

 以上语法是基于 RFC 2396 的,并且较新的 RFC 3986 引入的更改没有反应在这里。

 当 URI 里包含一个没在上面列出的字符或有时不想让给定的保留字符有特殊意义,那么必须编码这个字符。字符被转换成 UTF-8 编码,首先从 UT F-16 转换成相应的代码点值的替代对。(注:在 [0,127] 范围的代码单元在单字节中具有相同返回值。)然后返回的字节序列转换为一个字符串,每个字节用一个“%xx”形式的转移序列表示。

 描述编码和转义过程的抽象操作 Encode 需要两个字符串参数 string 和 unescapedSet。

  1. 令 strLen 为 string 的字符个数 .
  2. 令 R 为空字符串 .
  3. 令 k 为 0.
  4. 重复如果 k 等于 strLen, 返回 R.令 C 为 string 中位置为 k 的字符 .如果 C 在 unescapedSet 里 , 则令 S 为一个只包含字符 C 的字符串 .令 R 为之前 R 的值和 S 连接得到的一个新字符串值 .否则 , C 不在 unescapedSet 里如果 C 的代码单元值不小于 0xDC00 并且不大于 0xDFFF, 则抛出一个 URIError 异常 .如果 C 的代码单元值小于 0xD800 或大于 0xDBFF, 则令 V 为 C 的代码单元值 .否则 ,k 递增 1.如果 k 等于 strLen, 抛出一个 URIError 异常 .令 kChar 为 string 的 k 位置的字符的代码单元值 .如果 kChar 小于 0xDC00 或大于 0xDFFF, 则抛出一个 URIError 异常 .令 V 为 (((C 的代码单元值 ) – 0xD800) * 0x400 + (kChar – 0xDC00) + 0x10000).令 Octets 为 V 执行 UTF-8 转换的结果字节排列 , 令 L 为这个字节排列的长度 .令 j 为 0.只要 j < L,就重复令 jOctet 为 Octets 的 j 位置的值 .令 S 为一个包含三个字符“%XY”的字符串,这里 XY 是编码 jOctet 值的两个大写 16 进制数字 .令 R 为之前 R 的值和 S 连接得到的一个新字符串值 .j 递增 1.k 递增 1.

 描述反转义和解码过程的抽象操作 Decode 需要两个字符串参数 string 和 reservedSet。

  1. 令 strLen 为 string 的字符个数 .
  2. 令 R 为空字符串 .
  3. 令 k 为 0.
  4. 重复如果 k 等于 strLen, 返回 R.令 C 为 string 的 k 位置的字符 .如果 C 不是‘%’, 则令 S 为只包含字符 C 的字符串 .否则 , C 是‘%’令 start 为 k.如果 k + 2 大于或等于 strLen, 抛出一个 URIError 异常 .如果 string 的 (k+1) 和 (k + 2) 位置的字符没有表示为 16 进制数字,则抛出一个 URIError 异常 .令 B 为 (k + 1) 和 (k + 2) 位置的两个 16 进制数字表示的 8 位值 .k 递增 2.如果 B 的最高有效位是 0, 则令 C 为代码单元值是 B 的字符 .如果 C 不在 reservedSet 里 , 则令 S 为只包含字符 C 的字符串 .否则 , C 在 reservedSet 里令 S 为 string 的从位置 start 到位置 k 的子字符串 .否则 , B 的最高有效位是 1令 n 为满足 (B << n) & 0x80 等于 0 的最小非负数 .如果 n 等于 1 或 n 大于 4, 抛出一个 URIError 异常 .令 Octets 为一个长度为 n 的 8 位整数排列 .将 B 放到 Octets 的 0 位置 .如果 k + (3 * (n – 1)) 大于或等于 strLen, 抛出一个 URIError 异常 .令 j 为 1.重复 , 直到 j < nk 递增 1.如果 string 的 k 位置的字符不是‘%’, 抛出一个 URIError 异常 .如果 string 的 (k +1) 和 (k+2) 位置的字符没有表示为 16 进制数字 , 抛出一个 URIError 异常 .令 B 为 string 的 (k +1) 和 (k+2) 位置的两个 16 进制数字表示的 8 位值 .如果 B 的两个最高有效位不是 10,抛出一个 URIError 异常 .k 递增 2.将 B 放到 Octets 的 j 位置 .j 递增 1.令 V 为给 Octets 执行 UTF-8 转换得到的值,这是从一个字节排列到一个 32 位值的过程。 如果 Octets 不包含有效的 UTF-8 编码的 Unicode 代码点,则抛出一个 URIError 异常 .如果 V 小于 0x10000, 则令 C 为代码单元值是 V 的字符 .如果 C 不在 reservedSet 里 , 则令 S 为只包含字符 C 的字符串 .否则 , C 在 reservedSet 里令 S 为 string 的从位置 start 到位置 k 的子字符串 .否则 , V ≥ 0x10000令 L 为 (((V – 0x10000) & 0x3FF) + 0xDC00).令 H 为 ((((V – 0x10000) >> 10) & 0x3FF) + 0xD800).令 S 为代码单元值是 H 和 L 的两个字符组成的字符串 .
  5. 令 R 为之前的 R 和 S 连接成的新字符串 .
  6. k 递增 1.

 统一资源标识符的语法由 RFC 2396 给出,这里并没有反应更新的替换了 RFC 2396 的 RFC 3986。RFC 3629 给出了实现 UTF-8 的正式描述。

 在 UTF-8 中,用 1 到 6 个字节的序列来编码字符。只有“序列”中高阶位设置为 0 的字节,其余的 7 位才用于编码字符值。在一个 n 个字节的序列中,n>1,初始字节有 n 个设置为 1 的高阶位,其后的位设置为 0。这个字节的其他位包含是用来编码字符的比特。后面跟着的其字节都包含设定为 1 的高阶位,并且都跟着设定为 0 的位,剩下的 6 位都用作编码字符。表 21 指定了 ECMAScript 字符可能的 UTF-8 编码。

UTF-8编码
字符编码值表示第1十六进制位第2六进制位第3十六进制位第4十六进制位
0x0000 - 0x007F00000000 0zzzzzzz0zzzzzzz
0x0080 - 0x07FF00000yyy yyzzzzzz110yyyyy10zzzzzz
0x0800 - 0xD7FFxxxxyyyy yyzzzzzz1110xxxx10yyyyyy10zzzzzz
0xD800 - 0xDBFF 后跟 0xDC00 - 0xDFFF110110vv vvwwwwxx后跟110111yy yyzzzzzz11110uuu10uuwwww10xxyyyy10zzzzzz
0xD800 - 0xDBFF 后无 0xDC00 - 0xDFFF导致URIError
0xDC00 - 0xDFFF导致URIError
0xE000 - 0xFFFFxxxxyyyy yyzzzzzz1110xxxx10yyyyyy10zzzzzz

 在这里

 uuuuu = vvvv + 1

 来访问附加的作为代理项的 0x10000,在 Unicode 标准 3.7 章节。

 0xD800-0xDFFF 范围的代码单元值用来编码代理对;如上将 UTF-16 代理对转换组合成一个 UTF-32 表示,并编码 UTF-8 值的 21 位结果。解码重建代理对。

 RFC 3629 禁止对无效 UTF-8 字节序列的解码。例如,无效序列 C0 80 不能解码成字符 U+0000。当 Decode 算法的实现遇到这样的无效序列必须抛出一个 URIError 异常。

decodeURI (encodedURI)

 decodeURI 函数计算出一个新版 URI,将 URI 中可能是 encodeURI 函数引入的每个转义序列和 UTF-8 编码组替换为代表它们的字符。不是 encodeURI 导入的转义序列不会被替换。

 当以一个参数 encodedURI 调用 decodeURI 函数,采用如下步骤:

  1. 令 uriString 为 ToString(encodedURI).
  2. 令 reservedURISet 为一个字符串,包含 uriReserved 的每个有效字符加上 "#" 的实例。
  3. 返回调用 Decode(uriString, reservedURISet) 的结果。

 "#" 字符不会从转义序列中解码,即使它不是 URI 保留字符。

decodeURIComponent (encodedURIComponent)

 decodeURIComponent 函数计算出一个新版 URI,将 URI 中可能是 encodeURIComponent 函数引入的每个转义序列和 UTF-8 编码组替换为代表它们的字符。

 当以一个参数 encodedURIComponent 调用 decodeURIComponent 函数,采用如下步骤:

  1. 令 componentString 为 ToString(encodedURIComponent).
  2. 令 reservedURIComponentSet 为一个空字符串。
  3. 返回调用 Decode(componentString, reservedURIComponentSet) 的结果。

encodeURI (uri)

 encodeURI 函数计算出一个新版 URI,将 URI 中某些字符的每个实例替换为代表这些字符 UTF-8 编码的一个,两个或三个转义序列。

 当以一个参数 uri 调用 encodeURI 函数,采用如下步骤:

  1. 令 uriString 为 ToString(uri).
  2. 令 unescapedURISet 为一个字符串,包含 uriReserved 和 uriUnescaped 的每个有效字符加上 "#" 的实例。
  3. 返回调用 Encode(uriString, unescapedURISet) 的结果。

 字符 "#" 不会被编码为一个转义序列,即使它不是 URI 保留字符或非转义字符。

encodeURIComponent (uriComponent)

 encodeURIComponent 函数计算出一个新版 URI,将 URI 中某些字符的每个实例替换为代表这些字符 UTF-8 编码的一个,两个或三个转义序列。

 当以一个参数 uriComponent 调用 encodeURIComponent 函数,采用如下步骤:

  1. 令 componentString 为 ToString(uriComponent).
  2. 令 unescapedURIComponentSet 为一个字符串,包含 uriUnescaped 的每个有效字符的实例。
  3. 返回调用 Encode(componentString, unescapedURIComponentSet) 的结果。

全局对象的构造器属性

Object ( . . . )

 见 15.2.1 和 15.2.2.

Function ( . . . )

 见 15.3.1 和 15.3.2

Array ( . . . )

 见 15.4.1 和 15.4.2.

String ( . . . )

 见 15.5.1 和 15.5.2.

Boolean ( . . . )

 见 15.6.1 和 15.6.2.

Number ( . . . )

 见 15.7.1 和 15.7.2.

Date ( . . . )

 见 15.9.2.

RegExp ( . . . )

 见 15.10.3 和 15.10.4.

Error ( . . . )

 见 15.11.1 和 15.11.2.

EvalError ( . . . )

 见 15.11.6.1.

RangeError ( . . . )

 见 15.11.6.2.

ReferenceError ( . . . )

 见 15.11.6.3.

SyntaxError ( . . . )

 见 15.11.6.4.

TypeError ( . . . )

 见 15.11.6.5.

URIError ( . . . )

 见 15.11.6.6.

全局对象的其他属性

Math

 见 15.8.

JSON

 见 15.12.


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号