首先数据类型一共有8种,这八种数据类型又分为基本数据类型和引用数据类型
基本数据类型:Undefined、Null、Boolean、Number、String、Symbol、BigInt
引用数据类型:Object [数组对象:Array 日期对象:Date 数学对象:Math 函数对象:Function 正则对象:RegExp]
基本数据类型:
【直接存储在栈内存中的,可以直接访问,赋值时是将原始值复制一份到新的变量中】
let num1 = 123; // 值为数字123,存储在栈内存中 let str1 = "hello world"; // 值为字符串"hello world",存储在栈内存中 let bool1 = true; // 值为布尔值true,存储在栈内存中 let null1 = null; // 值为null,表示空对象引用,存储在栈内存中 let undefined1 = undefined; // 值为undefined,表示未定义,存储在栈内存中 let sym1 = Symbol("foo"); // 值为符号,存储在栈内存中
引用数据类型:
【储在堆内存中的,变量中保存的实际上是一个指向堆内存中实际对象的指针。因此,它们的赋值是传递的是指针地址,而不是复制一份值】
let obj1 = { name: "Tom", age: 20 }; // 值为一个对象,存储在堆内存中 let arr1 = [1, 2, 3]; // 值为一个数组,存储在堆内存中 let fn1 = function() {}; // 值为一个函数,存储在堆内存中
原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
注:
引用类型的值是分配在堆内存中的,因此相应的访问时间、访问速度也会受到环境和内存使用情况的影响。
同时,由于引用类型的值是通过指针来访问的,所以相应的访问速度也会比较慢,而且需要更多的内存空间。
可以参考的博客:【说一说JS数据类型有哪些,区别是什么? - 知乎】