望君烟水阔,挥手泪沾巾。飞鸟没何处,青山空向人。
基本类型和引用类型
- 首先 JavaScript 中的变量分为基本类型和引用类型。基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。
- 基本类型
- 基本类型有 Undefined、Null、Boolean、Number 和 String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
- 基本类型:简单的数据段,存放在栈内存中,占据固定大小的空间。
- 引用类型
引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。
存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。
当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
堆主要用来存放对象的,栈主要是用来执行程序的
堆(heap)和栈(stack)
- 栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放。
- 堆:队列优先,先进先出;由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。
- 栈:先进后出;动态分配的空间 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表。
传值和传址
- 从一个向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。
- 从一个变量复向另一个变量复制基本类型的值,会创建这个值的副本。
- 基本类型与引用类型最大的区别实际就是传值与传址的区别。
- 浅拷贝拷贝地址,深拷贝拷贝值
1 | var a = [1, 2, 3, 4, 5]; |
- 堆和栈的区别可以用如下的比喻
- 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就 走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
- 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。