内存的概念
- 栈内存 Stack(能够了解为运行内存,如内存条):
所谓栈内存,其实就是在计算机内存中调配进去的一块空间。
用于提供浏览器执行代码的执行环境,以及存储根本类型值。 - 堆内存 Heap(能够了解为存储空间,如硬盘):
用于存储援用类型值。
根本数据类型
根本数据类型有哪些?
JS 的根本数据类型有:数字、字符串、布尔值、null
、undefined
、symbol
(ES6 新增)。也就是除了对象(援用数据类型)外都是根本数据类型。
根本数据类型执行过程:
- 创立一个值(根本类型值间接存在栈内存中);
- 创立一个变量,将其存储到 VO(全局执行上下文中的全局变量对象)中;
- 让 2 中创立的变量和 1 中创立的值关联在一起(赋值操作)。
明确这三个步骤的程序,不可颠倒。
示例:
let a = 12;
let b = a;
b = 123;
console.log(a); // => 12
剖析:
援用数据类型
援用数据类型有哪些?
所有对象都是援用数据类型,包含函数、数组这些非凡的对象。
援用数据类型值存在哪里?
援用数据类型值都存在堆内存中。
因为援用数据类型的构造绝对简单,所以不能间接存储在栈内存中,须要独自开拓空间来存储,这个空间就是“堆内存“。
援用数据类型中对象的执行过程:
-
创立值
- 开拓一个堆内存,每个堆内存都有一个 16 进制地址
- 把对象中的键值对别离存储到对内存中
- 把对内存的地址放在栈内存中,用来供变量的援用
- 创立一个变量(栈内存中)
- 让变量和之前创立堆内存的地址进行关联。
示例:
let a = {name: 'Mirror'};
let b = a;
b.name = '颜同学';
console.log(a); //=> {name: '颜瑟'}
剖析:
总结
因为浏览器对根本数据类型和援用数据类型的存储形式不同,因而呈现了深浅拷贝的问题。
对于援用数据类型,默认的赋值操作是浅拷贝。
- 根本数据类型是按值操作,值存储在栈内存中。
援用数据类型是按堆内存地址操作,值存储在堆内存中。 - 栈内存的作用是:提供浏览器执行代码的执行环境,以及存储根本类型值。
堆内存的作用是:存储援用类型值。