乐趣区

关于javascript:栈内存-堆内存-数据类型间的存储区别

内存的概念

  • 栈内存 Stack(能够了解为运行内存,如内存条):
    所谓栈内存,其实就是在计算机内存中调配进去的一块空间。
    用于提供浏览器执行代码的执行环境,以及存储根本类型值。
  • 堆内存 Heap(能够了解为存储空间,如硬盘):
    用于存储援用类型值。

根本数据类型

根本数据类型有哪些?
JS 的根本数据类型有:数字、字符串、布尔值、nullundefinedsymbol(ES6 新增)。也就是除了对象(援用数据类型)外都是根本数据类型。

根本数据类型执行过程:

  1. 创立一个值(根本类型值间接存在栈内存中);
  2. 创立一个变量,将其存储到 VO(全局执行上下文中的全局变量对象)中;
  3. 让 2 中创立的变量和 1 中创立的值关联在一起(赋值操作)。

明确这三个步骤的程序,不可颠倒。

示例:

let a = 12;
let b = a;
b = 123;
console.log(a); // => 12

剖析:

援用数据类型

援用数据类型有哪些?
所有对象都是援用数据类型,包含函数、数组这些非凡的对象。

援用数据类型值存在哪里?
援用数据类型值都存在堆内存中。
因为援用数据类型的构造绝对简单,所以不能间接存储在栈内存中,须要独自开拓空间来存储,这个空间就是“堆内存“。

援用数据类型中对象的执行过程:

  1. 创立值

    • 开拓一个堆内存,每个堆内存都有一个 16 进制地址
    • 把对象中的键值对别离存储到对内存中
    • 把对内存的地址放在栈内存中,用来供变量的援用
  2. 创立一个变量(栈内存中)
  3. 让变量和之前创立堆内存的地址进行关联。

示例:

let a = {name: 'Mirror'};
let b = a;
b.name = '颜同学';
console.log(a); //=> {name: '颜瑟'}

剖析:

总结

因为浏览器对根本数据类型和援用数据类型的存储形式不同,因而呈现了深浅拷贝的问题。
对于援用数据类型,默认的赋值操作是浅拷贝。

  • 根本数据类型是按值操作,值存储在栈内存中。
    援用数据类型是按堆内存地址操作,值存储在堆内存中。
  • 栈内存的作用是:提供浏览器执行代码的执行环境,以及存储根本类型值。
    堆内存的作用是:存储援用类型值。
退出移动版