1.12 堆栈内存和数据类型区别

let a = 12;
let b = a;
    b = 13;
console.log(a); //=> 12
let n = {
    name : 'xiaoli'
};
let m = n;
    m.name = 'xiaoxiao';
console.log(n.name); //=> xiaoxiao

解析:

    1. 在浏览器中打开页面,浏览器引擎会渲染相关的代码(包含JS代码),换句话说,会把代码自上而下执行
    1. 浏览器想要执行代码,会提供一个供代码执行的环境,把环境叫做:ECStack(Execution Context Stack 执行环境栈) => 栈内存Stack
      栈内存作用:供代码自上而下执行
      EC(global):全局执行上下文
      VO(global):全局的变量对象(存储定义的变量和值)
    1. 最开始执行的是全局代码,会形成一个全局执行上下文(EC(global)),在堆栈内存中执行全局的代码
    1. 在全局的执行上下文中,有全局的变量对象VO(global),可以把定义的变量和对应的值存储在这里面

  • 基本数据类型(值类型):值类型由于结构相对简单,直接把创建的值存储到"栈内存"中即可,所以栈内存有两个作用:1.供代码执行 2.存储基本类型值
    let a = 12; 任何创建一个变量并赋值的过程,都会经历三个步骤:
    1. 创建一个值12(基本类型值,直接存储在栈内存中即可)
    1. 创建一个变量a,把其存储到VO(global)中
    1. 让创建的变量a和创建的值12关联在一起->=赋值的操作
      let b = a; //当前a的值已经存在,所以只需创建一个变量b,把其存储在VO(global)中,让变量b与变量a的值关联 =》 此时b = 12
      b = 13;//当前变量b已经存在,只需创建一个值13(基本类型值,直接存储在栈内存中),让变量b与创建的值13关联在一起,由于一个变量只能关联一个值,故此时b不在与值12关联,=》 b = 13;

  • 引用数据类型(对象函数):引用数据类型的结构相对复杂(一个综合体,包含很多值),需要单独开辟空间来存储-> "堆内存";引用数据类型值都存储在单独开辟的"堆内存"中!
    堆内存只有一个作用:存储引用数据类型值
    let n = {name : 'xiaoli'};
    1. 创建值:开辟堆内存(heap),每一个堆内存都有一个16进制的地址;把对象中的键值对分别存储到堆内存中;把堆内存的地址放到栈内存中,用来供变量引用
    1. 创建一个变量n
    1. 让变量n和之前的创建堆内存的地址进行关联
      let m = n; //当前n的值已经存在,n指向一个16进制地址,创建变量m,并关联n的值, 此时n与m指向同一个地址
      m.name = 'xiaoxiao'; //m当前指向一个16进制地址找到对应的堆内存,把堆内存中存储的name属性值进行修改,此时n.name也是被改后的'xiaoxiao'
      console.log(n.name);//=》 n与m指向同一个堆内存,上面m修改了堆内存中name属性的值,所以name属性值此时为'xiaoxiao'

你可能感兴趣的:(1.12 堆栈内存和数据类型区别)