1、谈到栈和堆必要知道JavaScript中的基本类型和引用类型
function show-type(x) {
console.log(typeof(x)); // undefined 值类型
console.log(typeof(10)); // number 值类型
console.log(typeof('abc')); // string 值类型
console.log(typeof(true)); // Boolean 值类型
console.log(typeof(function () { })); //函数 引用类型
console.log(typeof([1, 'a', true])); //数组 引用类型
console.log(typeof ({ a: 10, b: 20 })); //object 或者json 引用类型
console.log(typeof (null)); //null 引用类型
console.log(typeof (new Number(10))); //内置对象 引用类型
}
show-type();
基本类型(值类型):undefined、number、string、布尔类型、null类型
1.占用空间固定,保存在栈中,当每个方法执行的是,会建立自己内存栈区用来储存内部定义的变量,当方法执行完毕之后便销毁该内存栈区,以减少内存占用过多。其储存的是一些基础变量和一些对象的引用变量(例如:var obj1 = {},中的obj1则储存在栈区,而{}储存在堆区。在下图已经展示),而引用变量存储在栈中的是指向堆中的数组或者对象的地址
2.使用typeof检测数据的类型
引用类型:对象、函数、数组
1.占用空间固定,保存在堆中,每一个对象(var obj1 = {})、数组(arr[])等方法执行完后,不会销毁,而是将引用类型会保存在内存堆区,以便调用(因为引用一般比较重要,且引用的次数较多,成本也大),只有当没有任何一个变量引用该对象时,才会利用回收机制来清除该对象
2.使用instanceof检测数据类型
var a=3;
var b=3;
var obj1={title:'前端',content:'哈哈'}
2、上面提到的栈和堆到底是什么呢?!!!
举个小例子:咱们的word文档(数据),会放在u盘中(内存)
然而变量存在电脑中时,会产生内存,且内存会产生两片区域,一个栈区(储存基本类型),一个堆区(储存引用类型)
1. 栈是:用来保存 基本类型(也叫值类型:null、string、number等),栈的数据是可以共享的,比如定义一个变量
存在栈中的数据大小与生存期必须是确定的。可以明确知道每个区块的大小,因此,stack的寻址速度要快于heap。
2.堆:用来保存引用类型(对象、函数、数组)
其用于复杂数据类型(引用类型)分配空间,例如数组对象、object对象;它是运行时动态分配内存的,因此存取速度较慢
注意注意!!敲小黑板!!!
可以通俗的理解:
栈是点击自动洗衣机的按钮(发送至指令)
堆就是自己动手洗