基本数据类型(简单类型)
- Undefined
- Null
- Boolean
- Number
- String
- Symbol(ES6新增)
引用数据类型(复杂类型)
- 对象:引用类型可统称为对象,但是根据功能有所区分
- Object:普通对象
- Array:数组对象
- Set
- Map
- WeakSet
- WeakMap
typeof操作符
https://www.jianshu.com/p/bccab9159e4e
https://www.colabug.com/2020/0202/6929402/amp/
堆(heap)/栈(stack)内存
栈内存作用:执行代码,存储基本类型的值
堆内存作用:存储引用类型的值,所有的堆内存都有一个可被后续查找的16进制地址(JS中没有相关API,C有)
变量赋值的三步
- 创建变量:声明 declare
- 创建值
- 基本值:直接在栈中创建存储
- 引用值:由于引用是复杂结构的,因此特殊处理
- 开辟一个内存空间(堆内存),存储对象中键值对、或函数中代码字符串
- 将堆内存的引用地址存储到栈中
- 让变量和值关联赋值:定义 defined
- 基本值:让变量直接指向值
- 引用值:让变量指向引用地址,后续操作的都是引用地址
声明变量,创建值,赋值定义进行关联
null空对象指针,不会开辟内存,对内存进行释放
编译器
- 词法解析
- AST抽象语法树
- 编译出浏览器能执行的代码
引擎执行
JS引擎执行代码
创建一个执行栈,提供执行代码的环境
- 栈内存=> ECStack => 执行环境栈
创建EC(执行上下文):
某个域下的代码执行都有自己的执行上下文
全局:EC(global)
函数:EC(…)
把创建的上下文,压到栈中执行 => 进栈
执行完后上下文没用,从栈中弹出销毁 => 出栈
执行完后上下文还有用,把其压倒栈底 => 闭包
执行时
创建全局对象 GO(global object)
浏览器:赋值给window
node:赋值给global
创建全局执行上下文,入栈
创建VO
执行代码
如果调用函数,创建函数执行上下文,入栈
- 创建VO
- 初始化arguments,类数组集合
- 箭头函数下没有arguments
- 创建形参变量,并赋值实参
- 非严格模式下,会建立映射机制
- 即形参变量根据自身下标和arguments中的key映射关联
- 只要其中一个改变,另一个也会跟着改变
- 严格模式下不会
- 非严格模式下,会建立映射机制
- 确定this的值
- 执行代码
每个函数执行都会形成一个全新的执行上下文
https://www.cnblogs.com/onepixel/p/5090799.html
https://www.jianshu.com/p/edb2be5866eb
https://blog.csdn.net/Ancecis/article/details/104382441
https://www.v2ex.com/t/438395
执行上下文
VO(变量对象):存储当前上下文中声明的变量
- AO(活动对象):函数上下文中的VO
- GO(全局对象):全局上下文中的VO
const不是真正的常量,而是指针不可变的变量
