6.1 ECMAScript语言类型

ECMAScript语言类型就是指可以直接在由ECMAScript编写的程序中操作使用的值的类型,有以下几种:Undefined,Null,Boolean,String,Symbol,Number,Object。ECMAScript语言值有一一对应的ECMAScript语言类型

6.1.1 Undefined类型

Undefined类型只有一种值,就是undefined,任何变量在没有被赋值之前都有undefined值

6.1.2 Null类型

Null类型只有一种值,就是null

6.1.3 Boolean类型

Boolean 类型表示逻辑实体,有两个值,true 和 false。

6.1.4 String类型

字符串类型是一组有序的由0个或多个16位无符号整型(元素)最多到253 - 1个元素的组成的序列.字符串类型通常被用于表示文本数据,这时String当中的每一个元素都被当作UTF-16编码的值。每个元素被当作一个在这个序列中的占位符。序列中的位置索引都是非负数。第一个元素的索引值是0,第二个元素是1,按此排列。String的length值就是其元素的个数,空字符串的length是0,所以它不包含任何元素。

在ECMAScript中解释运行String值时,其每一个元素都被当作UTF-16编码,然而,ECMAScript没有对String当中的元素作任何编码限制,所以他们可能被错误的解释运行。不解释字符串内容的操作将会把他们当作一组无差别的16位无符号整型。String.prototype.normalize(21.1.3.12)函数能按照指定的规则正规化String值。String.prototype.localeCompare(21.1.3.10)会在函数内把String值正规化。没有其他操作会隐式的正规化String值。只有显示指定规则或者本地语言规定才会发生这样的操作。

注意:这种设计实现的背后原理就是为了能让String的实现即简单又能尽可能的高性能。如果ECMAScript源代码被正规化像C语言那样,String也会被当作是已经正规化了的,只要他们不包含任何Unicode转义序列。 一些操作会把String内容当作UTF-16编码的Unicode代码点,在这种情况下,操作流程如下:

  • 一个字符单元如果是在0到0xD7FF或者0xE000到0xFFFF范围内,会被解释为同样的值
  • 一个两个字符的序列,当第一个字符c1在0xD800到0xDBFF范围中,并且第二个字符c2在0xDC00到0xDFFF中,是一个代理对,并且会被解释执行一个值为(c1-0xD800)× 0x400 + (c2 - 0xDC00) + 0x10000的代码代码单元(10.1.2)
  • 一个字符单元在0xD800到0xDFFF范围中是,但是不是一个代理对,会被解释执行为同样的值

6.1.5 Symbol类型

Symbol类型是一组非String值的集合,可以被当作Object属性的key值
任意一个Symbol值都是独一无二并且是不可变的
任意一个Symbol值都持有一个名叫[[Description]]的关联值,这个值要么是undefined,要么是String值

6.1.5.1 Symbol特性

Symbol特性是Symbol值根据本规范算法规定的内置属性值,他们一般被当作规范扩展的那些点中属性的key值,除非另外规定,symbol特性都共享在8.2中。symbol特性都用@@name的形式标记,name值主要有如下表1如实

特性名 描述 V值和作用
@@hasInstance “Symbol.hasInstance” 一个方法用来识别构造函数对象是否是构造函数的实例,在instance of 操作时调用
@@isConcatSpreadable “Symbol.isConcatSpreadable” 一个布尔值,当为true时意味着它的array元素可以被Array.prototype.concat方法打平
@@iterator “Symbol.iterator” 一个方法,给一个对象返回默认的迭代器,当用for-of时调用
@@match “Symbol.match” 一个正则表达式方法,用来给字符串匹配正则表达式,当用String.prototype.match方法时调用
@@replace “Symbol.replace” 一个正则表达式方法,用来替换匹配了的子字符串, 当用String.prototype.search 方法时调用
@@search “Symbol.search” 一个正则表达式,返回正则表达式比配上的字符串的索引值,当用 String.prototype.search方法时调用
@@species “Symbol.species” 用来构建派生对象的构造函数的函数值属性
@@split “Symbol.split” 一个正则表达式方法,用来根据匹配上正则表达式的索引分割字符串
@@toPrimitive “Symbol.toPrimitive” 一个用来把对象转换为原始值的函数,当用ToPrimitive时调用
@@toStringTag “Symbol.toStringTag” 一个String值,用来创建默认String对象的描述,当用内置方法Object.prototype.toString方法时可访问
@@unscopables “Symbol.unscopables” An object valued property whose own and inherited property names are property names that are excluded from the with environment bindings of the associated object

6.1.6 Number类型

准确的说,数值类型拥有 18437736874454810627(即2^64-2^53 +3)个值,表示为IEEE 754-2008标准64位双精度数值,在IEEE二进制浮点数算法中定义的,减去IEEE标准中的 9007199254740990(即2^53-2)个明显的“非数字”值,在 ECMAScript 中,它们被表示为一个单独的特殊值:NaN。(请注意,NaN值由程序表达式 NaN 产生,并假设执行程序不能调整定义的全局变量 NaN)。在某些实现中,外部代码可以识别出非数字值之间的不同,但是这依赖于具体实现,所有的NaN值都是无法互相区分的。

注意:在ArrayBuffer(24.1)的位模式中可能会发现存储的一个数字值不一定会相等于在ECMAScript中使用的值 有两个特殊值,正无穷大和负无穷大,为简洁起见,这些值有时会被用+∞和 -∞表示(这两个无穷大值可以用+Infinity(或者Infinityh)和-Infinity产生)

其他18437736874454810627(即2^64-2^53 +3)个值称为有限值,一半是正值,一半是负值。对于每个正数而言,都有一个与之对应的、相同大小的负数。
注意这里也有一个正零和负零,同样的为了简洁,会用+0和-0表示(注意这两个值也由+0(0)或者-0产生)
这18437736874454810622 (2^64-2^53-2)个有限非零值分为两种:
18428729675200069632 (2^64-2^54)个是格式化的,有如下格式:

  1. s × m × 2^e

这里的s是+1或者-1,m是正整数,小于2^53大于2^52,e是一个从-1074到971的整数

剩下的9007199254740990(2^53-2)个值是非常规的,有如下格式:

  1. s × m × 2^e

这里的s是+1或者-1,m是正整数,小于2^52,e是-1074

注意,所有绝对值不大于2^53的无论是正数还是负数都可以用Number类型来表示(甚至,0有两种表示方法,+0和-0)

一个有限的非零数值用上述的两种格式表示时,m是偶数,那他就有一个偶数标记,否则就有一个奇数标记

本规范中,当x表示一个精确的非零数值(甚至可以是无理数,比如π),”the Number value for x”这句话的意思就是以以下的方式选择一个数值:从所有有限数值集合中(不包括-0,包括2^1024和-2^2014这两个没法表示的值)选择一个最接近x的值。如果有两个是最接近x的值,那就选择有偶数标记的。2^1024和-2^1024都是当作有偶数标识的。最终,如果2^1024是最接近的那个值,用+∞代替,如果是-2^1024,那就用-∞代替,如果是+0,只有x<0时,才会用-0代替。其他选择的值不会发生改变(这个过程是在符合IEEE 754-2008中的“round to nearest, ties to even”模式)。

一些ECMAScript操作符只会处理在-2^31到2^31 - 1 范围内的数值,或者0到2^16-1。这些操作符接受任何类型的Number类型,但是会先把操作数转换到所只会处理的范围,转换操作详见7.1

6.1.7 Object类型

一个Object是一个属性的集合,每个属性都是一个数据属性或者访问器属性

  • 一个数据属性将关联一个ECMAScript language value的key值,和一组Boolean属性
  • 一个访问器属性将关联一个或者两个访问器函数,和一组Boolean属性,访问器函数用来对所关联的属性进行取值和赋值

属性是通过key值来访问的,一个属性的key值要么是ECMAScript String值,要么是Symbol值。所有的String和Symbol类型值,包括空字符串,都是合法的key。一个String类型的属性名可以作为属性key。
一个整数索引是一个典型的数字字符串(如7.1.16中描述),并且其数值是+0,或者小于2^53-1的正数,一个数组索引是一个大于+0,小于2^32-1的整数索引。
属性键值是用来访问属性及获取其值得。这有两个操作:get、set,分别对应取值和赋值。通过get和set操作可以访问到的属性即包括对象自身的属性,还包括从其他对象继承而来的属性,继承而来的属性也可能是那个父对象的自身属性或者继承属性。对象的每个属性都必须拥有一个唯一的键值来区分不同属性。
从逻辑上来说,所有的对象都是属性的集合,但是有非常多种形态的对象,他们有着不同的访问属性和操作属性的语法。Ordinary objects 是最普通的一种对象形态,有着默认的语法。 exotic object是那种有任何属性语法和默认语法不一样的对象。

6.1.7.1 属性特性

特性是用来定义和解释本规范中的Object属性的状态。数据属性键值关联到如表2中所列的特性

表2 数据属性的特性
特性名 取值范围 描述
[[Value]] 任何ECMAScript 语言类型 默认为undefined,通过get访问器来获取其值
[[Writable]] Boolean 如果为false,不能通过[[Set]]操作来改变[[Value]]
[[Enumerable]] Boolean 如果为true,可以通过for-in枚举,否则就说明这个属性是不可枚举的
[[Configurable]] Boolean 如果为false, 不能删除这个属性或者将其改为访问器属性,不能改变这个属性的特性(除了[[Value]]和把[[Writable]]改为false)

一个访问器属性有如表3所列的特性

表3 访问器属性特性
特性名 取值范围 描述
[[Get]] Object或者Undefined 如果是Object值,那必须是个函数对象。每次调用 get 访问器来获取这个属性的值时,都会以空参数列表调用这个函数的内置属性[[Call]]方法
[[Set]] Object获取Undefined 如果是Object值,那必须是个函数对象。每次调用 set 访问器来给这个属性赋值时,都会以将要赋值的那个值作为唯一参数调用这个函数的内置属性[[Call]]方法。[[Set]] 后操作可能会通过调用 [[Get]] 操作来作为返回值
[[Enumerable]] Boolean 如果为true,可以通过for-in枚举,否则就说明这个属性是不可枚举的
[[Configurable]] Boolean 如果为false, 不能删除该属性,也不能把该属性变成数据属性,也不能改变任何该属性的特性

如果本规范没有明确指出属性特性的初始值,那么其默认值在表4中给出

表4 特性默认值
特性名 默认值
[[Value]] undefined
[[Get]] undefined
[[Set]] undefined
[[Writable]] false
[[Enumerable]] false
[[Configurable]] false

6.1.7.2 Object内置方法和内置属性

在ECMAScript中objects的确切语法,都是通过一种叫内部方法的算法定义的。ECMAScript引擎中的每个对象,都关联着一序列的在运行时定义的内部方法。这些内部方法并不是ECMAScript语言的一部分。在规范中定义它们完全是出于解释的目的。然而每种ECMAScript中的对象实现都必须实现规范中定义这些内部方法,具体实现取决于实现者。
内部方法名是多态的,这意味着不同的对象调用同一个名字的方法会执行不同的算法。对象本身就是调用方法时的”target”。在运行时,如果某个实现去调用对象不支持的方法,就会抛出TypeError异常。
许多内部算法都会用到关联到Object中的内部属性。内部属性不是继承来的,根据规定的内部属性,可以关联到任意一种ECMAScript语言类型或者特定的ECMAScript规范类型。除非显示指定值,内部属性都是在对创建时生成的,并且不允许动态添加给Object。除非特别说明,内部属性的初始值都是undefined。各种算法会根据规定创建内部属性,然而ECMAScript语言没有提供直接创建关联这些属性的对象的途径。
内部属性和内部方法都是用’[[]]‘包裹命名来标示的
表5总结了ECMAScript语言代码会用到的基本的内部方法。每个对象都必须有相应的算法来实现这些方法,然后所有对象并不是总用同一个算法来实现这些方法。
表5以及和表5类似的表中的”Signature”栏是指这个内部方法的调用模式。这个调用模式包括一个用括号包裹的参数列表,如果参数名是ECMAScript中的类型,说明这个类型是这个方法所需要的参数类型。如果内部方法指定了返回值,会以->符号指出返回指的类型。其所用的类型参考第六章。还增加了”any”,指的是任意ECMAScript语言类型。一个内部方法默认返回Completion Record。内部方法可以访问对象本省,并且对象是内部方法的调用目标。

表5 基本内部方法
内部方法 模式 说明
[[GetPrototypeOf]] () → Object / Null 获取对象的继承对象,null说明这个对象没有继承属性
[[SetPrototypeOf]] (Object / Null) → Boolean 把Object作为该对象的继承对象。传null说明没有继承属性,返回true说明操作成功,返回false说明操作失败
[[IsExtensible]] ( ) → Boolean 这个方法决定了是否可以给对象添加属性
[[PreventExtensions]] ( ) → Boolean 控制是否可以给对象添加新属性,false是不能,true为可以
[[GetOwnProperty]] (propertyKey) → Undefined / Property Descriptor 返回名字为propertyKey的属性的 Property Descriptor。如果不存在这个属性,返回undefined
[[HasProperty]] (propertyKey) → Boolean 如果存在这个属性(自有或者继承),返回true,否则返回false
[[Get]] (propertyKey, Receiver) → any 返回名为propertyKey的属性值,如果需要执行代码才能获取这个值,那执行代码时Receiver为this值
[[Set]] (propertyKey, value, Receiver) → Boolean 把propertyKey属性值设为value,如果要执行代码,那Receiver为this值,返回true说明设置成功,返回false说明设置失败
[[Delete]] (propertyKey) → Boolean 移除名为propertyKey的属性,没移除成功返回false,移除成功或者属性不存在返回true
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) → Boolean 创建或者修改名为propertyKey的属性的PropertyDescriptor。成功返回true,失败返回false
[[OwnPropertyKeys]] ()→List of propertyKey 返回对象自身所有属性的列表

表6总结了function特有的内部方法,函数对象有[[Call]]内部方法,构造函数有[[Contruct]]内部方法

表6 Function对象特有的内部方法
内部方法 模式 说明
[[Call]] (any, a List of any) → any 通过函数调用表达式,执行对象关联的代码,参数为this值和一个包含参数的list。对象实现了找个方法,就称这个方法为callable
[[Construct]] (a List of any, Object) → Object 通过new或者super操作创建一个对象,第一个参数是要这个操作需要的参数,第二个参数为new操作符时应用的对象。实现了个方法的对象称为构造函数,函数不一定都是构造函数,那些非构造函数的函数就没有[[Construct]]内部方法

第九章定了这些内部方法的语法,在任何没有实现这些方法的对象上调用这些内部方法,抛出TypeError异常

6.1.7.3 内部方法的不可变性

ECMAScript引擎都必须遵守以下列出的内部方法不可变得地方。在本规范中的普通的ECMAScript对象和exotic对象都具有这些不变性ECMAScript Proxy对象拥有这些不变性意味着运行时检测调用[[ProxyHandler]]对象的结果
任何实现都必须有这些不可变性。违反这些不可变形会导致ECMAScript代码有不可预期的行为以及导致安全问题。无论怎么样,违反这些不可变形一定会导致内存不安全
一个实现不可以让这些不可变性是可选的,应该是强制的
定义:

  • 内部方法的target取决于谁调用这个内部方法
  • target如果[[IsExtensibel]]返回false,或者调用[[PreventExtensions]]返回true,那和target是不可扩展的
  • 不存在的属性是指这个属性不是这个不可扩展对象的自身属性
  • SameValue的所有引用取决于SameValue算法的定义
[[GetPrototypeOf]] ( )
  • 返回值的类型必须是Object或者Null
  • target是不可扩展的,并且[[GetPrototypeOf]]返回了v,那任何时候调用[[GetPrototypeOf]]都返回v的同样值

注意1:对象的原型链是有限的(就是说,开始于某个对象,[[GetPrototypeOf]] 最终会得到null。然而,这个要求不是一个强制的,如果原型链上包括任何不用[[GetPrototypeOf]]的exotic对象。这就会形成一个原型链环,当访问属性时就可能会导致死循环

[[SetPrototypeOf]] (V)
  • 返回值必须是Boolean类型
  • 如果target是不可扩展的,[[SetPrototypeOf]]必须返回false,除非V和target的[[GetPrototypeOf]]值是同样的。
[[IsExtensible]] ( )
  • 返回值必须是Boolean类型
  • 如果 [[IsExtensible]] 返回 false, 所有 [[IsExtensible]] 调用都返回 false.
[[PreventExtensions]] ( )
  • 返回值类型必须是 Boolean.
  • 如果 [[PreventExtensions]] 返回 true, 所有 [[IsExtensible]] 调用必须返回 false 并且认为target是non-extensible.
[[GetOwnProperty]] (P)
  • 返回值必须是Property Descriptor 或者 Undefined.
  • 如果返回值是 Property Descriptor, 那么返回值必须是一个完整的property descriptor (详细见 6.2.4.6).
  • 如果属性 P 描述为数据属性,其 Desc.[[Value]] 和 v 相等并且 Desc.[[Writable]] 和 Desc.[[Configurable]] 都为 false, 那么所有[[GetOwnProperty]] ( P )的调用都将返回和 Desc.[[Value]] 相同的值 .
  • 如果 P 的 非 [[Writable]] 特性都将会变化或者 P 可能消失,那么 P 的 [[Configurable]] 特性必须为 true.
  • 如果 [[Writable]] 可能由 false 改为 true, 那么 [[Configurable]] 特性必须为 true.
  • 如果target是 non-extensible 并且 P不存在, 那么任何[[GetOwnProperty]] (P) 调用都将把 P描述为不存在 ( [[GetOwnProperty]] (P) 必须返回 undefined).

注意2:第三条不可变形可以得到一个结论。如果一个数据属性可能会返回不同的值,那么Desc.[[Writable]] 和 Desc.[[Configurable]] 必须为 true,尽管内部方法没有改变value的机制

[[DefineOwnProperty]] (P, Desc)
  • 返回值的类型必须是 Boolean.
  • 如果 P 是 non-configurable 的属性,[[DefineOwnProperty]] 必须返回false, 除非下面的情况:
    • P 是 non-configurable 但是可写的自身属性,可以改成 non-configurable 和不可写的数据属性.
    • 所有 Desc 的属性值和 P’s 属性值一样.
  • 如果 target 是 non-extensible,那 [[DefineOwnProperty]] (P, Desc)必须返回 false,也就是说 non-extensible 对象不能扩展新属性
[[HasProperty]] ( P )
  • 返回值的类型必须是 Boolean.
  • 如果 P 是non-configurable 或者是访问器,那[[HasProperty]] 必须返回true.
[[Get]] (P, Receiver)
  • 如果 P a non-configurable, non-writable 的数据属性,值为v, 返回v.
  • 如果 P 是 non-configurable 的访问器,并且其 [[Get]] 特性为 undefined, 那么 [[Get]] 操作必须返回 undefined.
[[Set]] ( P, V, Receiver)
  • 返回值的类型必须是 Boolean.
  • 如果 P non-configurable, non-writable 数据属性, 那么除非V和 P的[[Value]]值一样,否则 [[Set]] 必须返回false
  • 如果 P 是一个 non-configurable 访问器,并且其[[Set]]属性是undefined,那么必须返回false.
[[Delete]] ( P )
  • 返回值的类型必须是 Boolean.
  • 如果 P 是 non-configurable 必须返回false.
[[OwnPropertyKeys]] ( )
  • 返回值类型必须是 List.
  • List 中的元素必须是String 或者 Symbol.
  • 至少返回所有non-configurable 的自身属性.
  • 如果对象是 is non-extensible, 返回的 List 必须只能包含自身属性

[[Construct]] ( )

  • 返回值类型必须是 Object.

6.1.7.4 普通的内置对象

这些内置对象都是被规范内的算法明确引用的,并且一般都有明确的领域。除非另有说明一个内置对象对应着一组类似对象,每个对应一个领域。

规范中%name%这样标示的就是内置对象,8.3决定了这些内置对象的描述以及领域。表7列出了这些内置对象

表7 内置对象
内置名称 全局名 ECMAScript 语言关系
%Array% Array Array 构造函数 (22.1.1)
%ArrayBuffer% ArrayBuffer ArrayBuffer 构造函数 (24.1.2)
%ArrayBufferPrototype% ArrayBuffer.prototype %ArrayBuffer% 的 prototype属性的初始值
%ArrayIteratorPrototype% Array 产生器 对象的原型 (22.1.5)
%ArrayPrototype% Array.prototype %Array% 的prototype初始值(22.1.3)
%ArrayProto_values% Array.prototype.values %ArrayPrototype% value 属性的初始值(22.1.3.30)
%Boolean% Boolean Boolean 构造函数 (19.3.1)
%BooleanPrototype% Boolean.prototype %Boolean% 的prototype 属性的初始值 (19.3.3)
%DataView% DataView DataView 构造函数 (24.2.2)
%DataViewPrototype% DataView.prototype %DataView% 的prototype属性的初始值
%Date% Date Date 构造函数 (20.3.2)
%DatePrototype% Date.prototype %Date%.的prototype属性的初始值
%decodeURI% decodeURI decodeURI 函数 (18.2.6.2)
%decodeURIComponent% decodeURIComponent decodeURIComponent 函数 (18.2.6.3)
%encodeURI% encodeURI encodeURI 函数 (18.2.6.4)
%encodeURIComponent% encodeURIComponent encodeURIComponent 函数 (18.2.6.5)
%Error% Error Error 构造函数 (19.5.1)
%ErrorPrototype% Error.prototype %Error% 的prototype属性的初始值
%eval% eval eval 函数 (18.2.1)
%EvalError% EvalError EvalError 构造函数 (19.5.5.1)
%EvalErrorPrototype% EvalError.prototype %EvalError%的prototype属性的初始值
%Float32Array% Float32Array Float32Array 构造函数 (22.2)
%Float32ArrayPrototype% Float32Array.prototype %Float32Array%. 的prototype属性的初始值
%Float64Array% Float64Array Float64Array 构造函数 (22.2)
%Float64ArrayPrototype% Float64Array.prototype %Float64Array% 的prototype属性的初始值
%Function% Function Function 构造函数 (19.2.1)
%FunctionPrototype% Function.prototype %Function% 的prototype属性的初始值
%Generator% %GeneratorFunction% 的prototype属性的初始值
%GeneratorFunction% generator 对象的构造函数(25.2.1)
%GeneratorPrototype% %Generator% 的prototype属性的初始值
%Int8Array% Int8Array Int8Array 构造函数 (22.2)
%Int8ArrayPrototype% Int8Array.prototype %Int8Array% 的prototype属性的初始值
%Int16Array% Int16Array Int16Array 构造函数 (22.2)
%Int16ArrayPrototype% Int16Array.prototype %Int16Array% 的prototype属性的初始值
%Int32Array% Int32Array Int32Array 构造函数 (22.2)
%Int32ArrayPrototype% Int32Array.prototype %Int32Array% 的prototype属性的初始值
%isFinite% isFinite isFinite 函数 (18.2.2)
%isNaN% isNaN isNaN 函数 (18.2.3)
%IteratorPrototype% 所有内置的构造器对象直接继承的对象
%JSON% JSON JSON object (24.3)
%Map% Map Map 构造函数 (23.1.1)
%MapIteratorPrototype% iterator 构造器对象的prototype属性 (23.1.5)
%MapPrototype% Map.prototype %Map% 的prototype属性的初始值
%Math% Math Math object (20.2)
%Number% Number Number 构造函数 (20.1.1)
%NumberPrototype% Number.prototype %Number% 对象的prototype属性
%Object% Object Object 构造函数 (19.1.1)
%ObjectPrototype% Object.prototype %Object%. 的prototype属性的初始值 (19.1.3)
%ObjProto_toString% Object.prototype.toString %ObjectPrototype% 的toString属性的初始值(19.1.3.6)
%ObjProto_valueOf% Object.prototype.valueOf %ObjectPrototype% 的valueOf属性的初始值(19.1.3.7)
%parseFloat% parseFloat parseFloat 函数 (18.2.4)
%parseInt% parseInt parseInt 函数 (18.2.5)
%Promise% Promise Promise 构造函数 (25.4.3)
%PromisePrototype% Promise.prototype %Promise% 的prototype属性的初始值
%Proxy% Proxy Proxy 构造函数 (26.2.1)
%RangeError% RangeError RangeError 构造函数 (19.5.5.2)
%RangeErrorPrototype% RangeError.prototype %RangeError% 的prototype属性的初始值
%ReferenceError% ReferenceError ReferenceError 构造函数 (19.5.5.3)
%ReferenceErrorPrototype% ReferenceError.prototype %ReferenceError% 的 prototype属性的初始值
%Reflect% Reflect Reflect 对象 (26.1)
%RegExp% RegExp RegExp 构造函数 (21.2.3)
%RegExpPrototype% RegExp.prototype %RegExp% 的prototype属性的初始值
%Set% Set Set 构造函数 (23.2.1)
%SetIteratorPrototype% set 构造器对象的prototype对象 (23.2.5)
%SetPrototype% Set.prototype %Set% 的prototype属性的初始值
%String% String String 构造函数 (21.1.1)
%StringIteratorPrototype% String构造器对象的prototype属性 (21.1.5)
%StringPrototype% String.prototype %String% 的prototype属性的初始值
%Symbol% Symbol Symbol 构造函数 (19.4.1)
%SyntaxError% SyntaxError SyntaxError 构造函数 (19.5.5.4)
%SyntaxErrorPrototype% SyntaxError.prototype %SyntaxError% 的prototype属性的初始值
%ThrowTypeError% 一个无条件抛出 %TypeError% 实例的函数对象
%TypedArray% typed Array 构造函数的父类 (22.2.1)
%TypedArrayPrototype% %TypedArray% 的prototype属性的初始值
%TypeError% TypeError TypeError 构造函数 (19.5.5.5)
%TypeErrorPrototype% TypeError.prototype %TypeError% 的prototype属性的初始值
%Uint8Array% Uint8Array Uint8Array 构造函数 (22.2)
%Uint8ArrayPrototype% Uint8Array.prototype %Uint8Array% 的prototype属性的初始值
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArray 构造函数 (22.2)
%Uint8ClampedArrayPrototype% Uint8ClampedArray.prototype %Uint8ClampedArray% 的prototype属性的初始值
%Uint16Array% Uint16Array Uint16Array 构造函数 (22.2)
%Uint16ArrayPrototype% Uint16Array.prototype %Uint16Array% 的prototype属性的初始值
%Uint32Array% Uint32Array Uint32Array 构造函数 (22.2)
%Uint32ArrayPrototype% Uint32Array.prototype %Uint32Array% 的prototype属性的初始值
%URIError% URIError URIError 构造函数 (19.5.5.6)
%URIErrorPrototype% URIError.prototype %URIError% 的prototype属性的初始值
%WeakMap% WeakMap WeakMap 构造函数 (23.3.1)
%WeakMapPrototype% WeakMap.prototype %WeakMap% 的prototype属性的初始值
%WeakSet% WeakSet WeakSet 构造函数 (23.4.1)
%WeakSetPrototype% WeakSet.prototype %WeakSet% 的prototype属性的初始值