-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
重学js —— ECMAScript Specification Types #48
Comments
Open
This was referenced Jan 9, 2020
Open
Open
This was referenced Jan 22, 2020
Open
This was referenced Feb 24, 2020
This was referenced Mar 5, 2020
Open
This was referenced Mar 14, 2020
Open
This was referenced Mar 22, 2020
This was referenced Apr 24, 2020
This was referenced Jun 3, 2020
This was referenced Jun 17, 2020
This was referenced Jun 28, 2020
Open
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ECMAScript Specification Types
本篇主要为了方便阅读规范
规范类型对应于在算法中用于描述ECMAScript语言结构和ECMAScript语言类型语义的元值。包含以下类型:
规范类型值可用于描述ECMAScript表达式求值的中间结果,但此类值不能存储为对象的属性或ECMAScript语言变量的值。
List和Record规范类型
List类型用于解释那些使用 new 表达式、函数调用的 参数列 以及其它需要一个简单的有序值列表的算法。列表类型的值是包含单个值的列表元素的简单 有序序列。序列长度不固定。列表的元素可以使用从0开始索引随机访问。为了便于表示,可以使用 类似数组 的语法来访问列表元素。(应该都知道函数的
arguments
是个类数组对象吧,在规范类型里就是List类型,语言类型里是Object)Record类型用于描述本规范算法中的数据聚合。Record类型值由一个或多个命名字段组成。每个字段值要么是ECMAScript值,要么是由与Record类型关联的名称表示的抽象值。字段名总是用双括号括起来,例如
[[Value]]
。PS:在控制台打印一个
{}
,点开__proto__
属性,不出意外的话,会发现所有属性中都有一个[[Scopes]]
属性。 当然,它依然是Object类型,不过却用了双括号来表示。Set和Relation规范类型
Set类型用来解释内存模型使用的 无序 元素的集合。每个元素不会出现第二次。集合可以是并集、交集或相减的。(PS:注意与Set对象区分)
Relation类型用于解释Sets上的约束。Relation类型的值是其值域中的有序值对集。
Completion Record 规范类型
Completion类型其实是一种Record类型,用于解释值和控制流的运行时传播,例如执行非本地控制传输的语句(break、continue、return和throw)的行为。
undefined
。来自winter的《重学前端 —— try里面放return,finally还会执行吗?》Completion Record 中的
[[Value]]
:包含以下内容:
{ [[Type]]: normal, [[Value]]: argument, [[Target]]: empty }
{ [[Type]]: throw, [[Value]]: argument, [[Target]]: empty }
completionRecord.[[Type]]
是 return 或者 throw,那么completionRecord.[[Value]]
不为空completionRecord.[[Value]]
不为空,返回Completion(completionRecord)
{ [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }
abrupt completion:
Reference规范类型
一个引用可能是一个已解析的名称或属性绑定。一个Reference包含三部分:基础值部分、引用的名称和严格引用标志的布尔值。基础值可能是
undefined
,Object
,Boolean
,String
,Symbol
,Number
或Environment Record。基础值如果是undefined,那么无法将引用解析为绑定(其实就是对象某个属性值为undefined,该属性不绑定任何引用)。引用名是一个string或者symbol值。一个Super Reference表示使用super关键字名称绑定的引用。Super Reference有额外的
thisValue
,并且它的基础值不可能是Environment Record。Property Descriptor规范类型
Property Descriptor类型用来解释对象属性的属性的操作和具体化。(可以结合getOwnPropertyDescriptor来看)。PropertyDescriptor类型值是 Record类型。
属性描述符值可以根据某些字段的存在或使用,进一步被分类为 数据属性描述符 和 访问器属性描述符 以及 通用属性描述符。
任何属性描述符可能会有 [[Enumerable]] 和 [[Configurable]] 字段。属性描述符不能同时是数据描述符和访问器描述符,两者互斥!
Data Blocks
Data Blocks规范类型用于描述字节大小(8位)数字值的不同且可变的序列。一个Data Blocks值由固定数量的字节构成,且每个字节初始值为0。
在规范中,类数组的语法可用于访问Data Block值的各个字节。该表示法将Data Block值表示为从0开始的整数索引字节序列。
可以同时从多个代理引用的驻留在内存中的数据块称为 共享数据块(Shared Data Block)。共享数据块的标识(用于相等性测试共享数据块值)是无地址的:它不依赖于任何过程中块映射到的虚拟地址,而是依赖于该块所代表的内存中的位置集。仅当两个数据块所包含的位置集合相等时,它们才相等。 否则,它们不相等,并且它们包含的位置集的交集为空。
共享数据块的语义由内存模型使用共享数据块事件定义。下面的抽象操作引入共享数据块事件,并充当内存模型的求值语义和事件语义之间的接口。这些事件形成一个候选执行,内存模型在其上充当筛选器。有关完整的语义,请参考内存模型。
共享数据块事件由内存模型中定义的记录建模。
The text was updated successfully, but these errors were encountered: