Skip to content
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

Open
lizhongzhen11 opened this issue Oct 18, 2019 · 0 comments
Open

重学js —— ECMAScript Specification Types #48

lizhongzhen11 opened this issue Oct 18, 2019 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Oct 18, 2019

ECMAScript Specification Types

本篇主要为了方便阅读规范

规范类型对应于在算法中用于描述ECMAScript语言结构和ECMAScript语言类型语义的元值。包含以下类型:

规范类型值可用于描述ECMAScript表达式求值的中间结果,但此类值不能存储为对象的属性或ECMAScript语言变量的值。

List和Record规范类型

List类型用于解释那些使用 new 表达式、函数调用的 参数列 以及其它需要一个简单的有序值列表的算法。列表类型的值是包含单个值的列表元素的简单 有序序列。序列长度不固定。列表的元素可以使用从0开始索引随机访问。为了便于表示,可以使用 类似数组 的语法来访问列表元素。(应该都知道函数的arguments是个类数组对象吧,在规范类型里就是List类型,语言类型里是Object)

为了阅读规范需要,类似« 1, 2 »这种形式代表有两个元素的List值且每个值都会被初始化为特定的值。« »代表空的List。

Record类型用于描述本规范算法中的数据聚合。Record类型值由一个或多个命名字段组成。每个字段值要么是ECMAScript值,要么是由与Record类型关联的名称表示的抽象值。字段名总是用双括号括起来,例如[[Value]]

 为了便于在本规范中进行注释,可以使用类似于对象字面量的语法来表示记录值。例如, { [[Field1]]: 42, [[Field2]]: false, [[Field3]]: empty }定义了一个具有三个字段的Record类型值,并且每个字段有个特定值。Record类型中字段名顺序并不重要。没有明确列出来的字段视为不存在。
. 可能被用来表示指向一个Record值的某个字段。例如 R 是上一段中显示的record,R.[[Field2]]表示 R的[[Field2]]字段的缩写
应用案例:属性描述符:{ [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }

PS:在控制台打印一个{},点开__proto__属性,不出意外的话,会发现所有属性中都有一个[[Scopes]]属性。 当然,它依然是Object类型,不过却用了双括号来表示。

Set和Relation规范类型

Set类型用来解释内存模型使用的 无序 元素的集合。每个元素不会出现第二次。集合可以是并集、交集或相减的。(PS:注意与Set对象区分)

Relation类型用于解释Sets上的约束。Relation类型的值是其值域中的有序值对集。

例如,事件关联是一组有序的事件对。对于Relation R以及在它的值域中的两个值a和b:a R b是R的成员中有序对(a, b)缩写。
当一个Relation是满足这些条件的最小Relation时,它是关于某些条件的最小Relation。

Completion Record 规范类型

Completion类型其实是一种Record类型,用于解释值和控制流的运行时传播,例如执行非本地控制传输的语句(break、continue、return和throw)的行为。

字段名 说明
[[Type]] normal, break, continue, return, throw中的一个 发生过的completion
[[Value]] 任何ECMAScript语言值或空 产生的值 浏览器打印的数据基本上就是这个,chrome会把empty打印成 undefined。来自winter的《重学前端 —— try里面放return,finally还会执行吗?》
[[Target]] 任何ECMAScript string或空 定向控制转移的目标标签
// 一开始翻译时不大明白这些,继续看 winter的《重学前端 —— try里面放return,finally还会执行吗?》一章才算理解
// 看看下面代码
target:var test; // 不报错
// 这里的 target: 就对应 Completion Record 中的 `[[Target]]`

Completion Record 中的 [[Value]]

包含以下内容:

abrupt completion

所有 [[Type]] 不是 normalcompletion 都属于 abrupt completion

Reference规范类型

注意:Reference类型用于解释一些操作的行为,例如deletetypeof,赋值运算符,super关键字以及其它的语言特征。例如:赋值的左操作数应产生一个引用。

一个引用可能是一个已解析的名称或属性绑定。一个Reference包含三部分:基础值部分、引用的名称和严格引用标志的布尔值。基础值可能是undefinedObjectBooleanStringSymbolNumberEnvironment Record。基础值如果是undefined,那么无法将引用解析为绑定(其实就是对象某个属性值为undefined,该属性不绑定任何引用)。引用名是一个string或者symbol值。

一个Super Reference表示使用super关键字名称绑定的引用。Super Reference有额外的thisValue,并且它的基础值不可能是Environment Record。

Property Descriptor规范类型

Property Descriptor类型用来解释对象属性的属性的操作和具体化。(可以结合getOwnPropertyDescriptor来看)。PropertyDescriptor类型值是 Record类型。

属性描述符值可以根据某些字段的存在或使用,进一步被分类为 数据属性描述符访问器属性描述符 以及 通用属性描述符

  • 数据属性描述符: 包含名为 [[Value]]或[[Writable]] 的任何字段的描述符。
  • 访问器属性描述符:包含名为 [[Get]]或[[Set]] 的任何字段的描述符。
  • 通用属性描述符:一个属性描述符值,既不是数据属性描述符,也不是访问器属性描述符

任何属性描述符可能会有 [[Enumerable]] 和 [[Configurable]] 字段。属性描述符不能同时是数据描述符和访问器描述符,两者互斥!

Data Blocks

Data Blocks规范类型用于描述字节大小(8位)数字值的不同且可变的序列。一个Data Blocks值由固定数量的字节构成,且每个字节初始值为0。

在规范中,类数组的语法可用于访问Data Block值的各个字节。该表示法将Data Block值表示为从0开始的整数索引字节序列。

可以同时从多个代理引用的驻留在内存中的数据块称为 共享数据块(Shared Data Block)。共享数据块的标识(用于相等性测试共享数据块值)是无地址的:它不依赖于任何过程中块映射到的虚拟地址,而是依赖于该块所代表的内存中的位置集。仅当两个数据块所包含的位置集合相等时,它们才相等。 否则,它们不相等,并且它们包含的位置集的交集为空。

共享数据块的语义由内存模型使用共享数据块事件定义。下面的抽象操作引入共享数据块事件,并充当内存模型的求值语义和事件语义之间的接口。这些事件形成一个候选执行,内存模型在其上充当筛选器。有关完整的语义,请参考内存模型

共享数据块事件由内存模型中定义的记录建模。

@lizhongzhen11 lizhongzhen11 added the js基础 Good for newcomers label Oct 18, 2019
@lizhongzhen11 lizhongzhen11 added the 重学js 重学js系列 规范+MDN label Jan 6, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant