涉及到的主要是AST相关的内容,AST(Abstract Syntax Tree)中文叫抽象语法树,是用来表示源代码语法的一种树形结构,树上的每个节点都代表源代码的一种结构。AST在我们日常应用中非常广泛,我们的代码高亮,代码检查等都是依靠的AST。
那么ES6转ES5的思路,其实就是在处理AST的过程中进行操作。转化代码的流程一般分为三步
- 将代码通过解释器转化为AST,可以通过 astexplorer 来查看代码对应的AST结构
- 通过一定的规则,去修改AST的结构(常见的比如转jsx,ES6转ES5都是在这一步进行操作)
- 将修改后的AST转化为普通代码
现在一般使用的就是bable转ES6,具体的ES6转ES5在第二步中的逻辑,那就得看bable中转ES6的babel-preset-es2015
对AST进行操作的源码了
第四章:Coercion
值的类型转换(Converting Values)
把值从一个类型转为另一个类型,通常称为类型转换("type casting"),可以是显式的,也可以是隐式的(由值怎么使用的规则强制)。
**注意:虽然不明显,但类型转换的结果总是生成基础类型的值。**包装不是严格意义的类型转换。
抽象值操作(Abstract Value Operations)
在分辨显式隐式转换前,首先了解控制转换的基本规则。ES5规范的第九章定义了一些抽象操作(也叫 "internal-only operation"),关于转换规则。我们关注ToString
,ToNumber
,ToBoolean
, ToPrimitive
4个。
ToString
非字符串转换成字符串,就由ToString
处理。
内置基础类型有规定的转换规则:null
-->"null"
,undefined
-->"undefined"
,true
-->"true"
。数字就是像我们期待那样, 但很小或很大的数字是以指数形式。
对一般对象来说,除非你指定了你自己的,默认的toString()
(位于Object.prototype.toString()
)会返回[[Class]]
(第三章),例如"[object Object]"
。
注意:对象转换为字符串需要经过ToPrimitive
,这会在ToNumber
段细讲,这里跳过。
JSON Stringification
JSON.stringify(..)
看起来和ToString
相关,但注意,这和类型转换不是一回事。
对大多数基础值来说,JSON.stringify(..)
表现与ToString
一致。
JSON-safe的值可以被JSON.stringify(..)
。但什么是JSON-safe的?即可以被JSON有效表示的。不是JSON-safe的很容易列出:undefined
,function
,symbol
,有循环引用的object
等。
JSON.stringify(..)
会自动忽略这些不合法值,如果这些值在数组中,会被替换为null
。
如果你JSON.stringify(..)
一个对象,这个对象有toJSON
方法,toJSON
会自动先调用(可以在此返回JSON-safe的值)。
ToNumber
Input Type | Result |
---|---|
Undefined |
- 共 1 页
- 1
where is dalao?
第 24 题:聊聊 Redux 和 Vuex 的设计思想