Open Amybiubiu opened 3 years ago
看了几篇博客后,发现关于 JS 数据类型说法并不是完全一致的,所以还是自己看下 EMACScript 2020( babel 目前是默认支持 ES 2020 的,ES 2021 三月份发布,我也不知变了啥,不管)。
The ECMAScript language types are Undefined, Null, Boolean, String, Symbol, Number, BigInt, and Object.
The Undefined type has exactly one value, called undefined. Any variable that has not been assigned a value has the value undefined.
The Number type has...the IEEE Standard are represented in ECMAScript as a single special NaN value. (Note that the NaN value is produced by the program expression NaN.) ...
容易搞错的就是 undefined, null 和 NaN 。undefined 和 null 都是一种类型,这种类型只有一个值 undefined/null。NaN 是 number 类型的一个值。
ES 文档目录有两个分类,ES language type 和 ES specification type, language type 下有 Object type。language type 有 promise type, promise type 也是一个 object 类。感觉 object 类穷举比较困难,常见的 object 有 Array, Function, Set, Map 等吧。
既然说到数据类型,便离不开类型检测。
function getType(obj){
let type = typeof obj;
if (type !== "object") { // 先进行typeof判断,如果是基础数据类型,直接返回
return type;
}
// 对于typeof返回结果是object的,再进行如下的判断,正则返回结果
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); // 注意正则中间有个空格
}
和类型转换。强制类型转换(Number()....)和隐式类型转换(各种操作符:> + && )
这部分就单纯还是没什么好讲的,或说不知道怎么讲好。看到掘金上一篇讲 Bable 的文章,大概从开发一个 Bable Plugin 的角度写的吧。编译器(将一种语言生成另外一种的语言的程序)工作的几个阶段:词法分析-》语法分析-》语义分析-》中间代码生成、代码优化-》目标代码生成。到 Babel 中来讲,@Babel/parse 将 js source code 生成了 AST ,然后使用 @Babel/traverse 可以对 AST 进行遍历,traverse 定义了某些节点类型的访问,如 Identifier, callExpression,如果要改写就在遍历的时候修改值,如果要修改一个变量名,会涉及到作用域的问题,处理起来会比较复杂,但是好像提供了一个 path.scope.rename 方法。了解接口的用法只是一小步,而关于如何从无到有做一个出来,首先需要一种数学方法或说一种模型,然后按照这种模型设计数据结构,存储相应的信息,比如变量名、值、节点类型、作用域等等,最后用算法操作数据结构,比如生成、修改的实现。比如语法分析的LR分析法,分析过程需要一个分析表,其中有待规约串、当前符号、输入串、向前搜索符等(记不清了233)。
AST 解析首先要知道这颗树的节点的结构是怎样的,由哪些属性构成,然后遍历这颗树,DFS or BFS ,遍历到了需要的节点后修改属性。(说不出更多的话了)
async function p (){
let res = await fn();
console.log(res);
}
async function fn(){
const p1 = await new Promise((resolve, reject) =>{
setTimeout(()=>{
resolve(1);
}, 0);
resolve(2);
})
console.log(p1);
return new Promise((resolve, reject)=>{
console.log(3);
resolve(4);
})
}
p();
console.log('end');
// end 2 3 4
const p = function (){
return new Promise((resolve, reject)=>{
const p1 = new Promise((resolve, reject) =>{
setTimeout(()=>{
resolve(1);
}, 0);
resolve(2);
})
p1.then((res) => {
console.log(res);
})
console.log(3);
resolve(4);
})
}
p().then((res)=>{
console.log(res);
})
console.log('end');
// 3 end 2 4
TCP 三次握手 -》TLS 握手 -》http请求和响应。不背几天是背不下来2333。
武汉 飞书
setTimeout(() => { console.log(2) }, 0)
console.log(3)
// 3 4 2 1; 我 // 3 4 1 2; 答案