前言
参考《[重学前端](https://time.geekbang.org/column/article/77804)》整理。用一定的词法或语法,表达一定的语义,从而操作运行时。
1. 运行时
1.1 数据结构
1.1.1 类型
JavaScript有7种语言类型:
null,number,undefined,symbol,string,bool,object(口诀:nnussb+o)
- null表示定义了但是为空,此处不应该有值的存在,null是对象
- undefined表示没有赋值,undefined是变量。
- number 0有正负,通过检测 1/x 是 Infinity 还是 -Infinity区分。
0.1+0.2 不能 =0.3:
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); - Symbol
var o = new Object
o[Symbol.iterator] = function() {
var v = 0
return {
next: function() {
return { value: v++, done: v > 10 }
}
}
};
for(var v of o)
console.log(v); // 0 1 2 3 ... 9
- Object 一切有形和无形物体的总称。
为什么给对象添加的方法能用在基本类型上?
因为 . 运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。
类型转换
- StringToNumber:多数情况下,Number 是比 parseInt 和 parseFloat 更好的选择。
- 装箱转换:把基本类型转换为对应的对象。
- 拆箱转换
JavaScript 基于原型
ES6类:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Dog extends Animal {
constructor(name) {
super(name); // call the super class constructor and pass in the name parameter
}
speak() {
console.log(this.name + ' barks.');
}
}
let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.
对象
- 宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。
浏览器 window - 内置对象(Built-in Objects):由 JavaScript 语言提供的对象。
固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
https://www.ecma-international.org/ecma-262/9.0/index.html#sec-well-known-intrinsic-objects
原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。
普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。
1.1.2 实例
应用和机制
1.2 执行过程(算法)
事件循环
时间循环
这一次,彻底弄懂 JavaScript 执行机制
微任务执行
函数执行
语句级的执行
Promises/A+
史上最易读懂的 Promise/A+ 完全实现
使用 Promise
初学者应该看的JavaScript Promise 完整指南
最详细的Promise源码实现,再被面试问到轻松解答
JavaScript Promises: An introduction
2.文法
词法
语法