基本数据类型(简单类型)

    • 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有)

    变量赋值的三步

    1. 创建变量:声明 declare
    2. 创建值
      • 基本值:直接在栈中创建存储
      • 引用值:由于引用是复杂结构的,因此特殊处理
        • 开辟一个内存空间(堆内存),存储对象中键值对、或函数中代码字符串
        • 将堆内存的引用地址存储到栈中
    3. 让变量和值关联赋值:定义 defined
      • 基本值:让变量直接指向值
      • 引用值:让变量指向引用地址,后续操作的都是引用地址

    声明变量,创建值,赋值定义进行关联
    null空对象指针,不会开辟内存,对内存进行释放

    编译器

    1. 词法解析
    2. AST抽象语法树
    3. 编译出浏览器能执行的代码

    引擎执行

    JS引擎执行代码
    创建一个执行栈,提供执行代码的环境

    • 栈内存=> ECStack => 执行环境栈

    创建EC(执行上下文):
    某个域下的代码执行都有自己的执行上下文
    全局:EC(global)
    函数:EC(…)
    把创建的上下文,压到栈中执行 => 进栈
    执行完后上下文没用,从栈中弹出销毁 => 出栈
    执行完后上下文还有用,把其压倒栈底 => 闭包

    执行时
    创建全局对象 GO(global object)
    浏览器:赋值给window
    node:赋值给global
    创建全局执行上下文,入栈
    创建VO

    执行代码
    如果调用函数,创建函数执行上下文,入栈

    1. 创建VO
    2. 初始化arguments,类数组集合
      1. 箭头函数下没有arguments
    3. 创建形参变量,并赋值实参
      1. 非严格模式下,会建立映射机制
        1. 即形参变量根据自身下标和arguments中的key映射关联
        2. 只要其中一个改变,另一个也会跟着改变
      2. 严格模式下不会
    4. 确定this的值
    5. 执行代码

    每个函数执行都会形成一个全新的执行上下文
    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不是真正的常量,而是指针不可变的变量