前言
在JS语言中有两类数据类型:简单数据类型和复杂数据类型,其主要是由内存的分配机制来辨别的。
内存分配机制
在Javascript中,内存主要分为两部分:栈(stack)和堆(heap)。
栈
栈是一种线性的数据结构,这个我们在前面的文章具体讲过,它遵循先进后出的原则。栈内存主要用于存储简单数据类型和对象的引用地址。栈中的数据访问速度快,因为它们的地址是连续的。
堆
堆是一种非线性数据结构,用于存储对象的实际数据,堆中的数据访问速度较慢,因为它们的地址是不连续的,而且堆内存的大小是在运行时动态分配的,这使得对象的大小和数量可以在程序运行过程中发生变化。
简单(原始)数据类型
简单数据类型一共有7种,他们的特点是一眼就能看出其值:
1. Number
数值类型,在JS中整数和浮点数的类型不会区分开,通通称为数值类型
let a = 1;
let b = 3.14;
2. String
字符串类型,字符串类型可以用''或者""包裹住,引号中可以是数字,字母和标点符号等
let a = 'hello world';
let b = "hi";
3. Boolean
布尔类型,表示真或假的值,True和False
let bool = true;
4. Null
表示一个空值或者不存在的对象(显示回收内存),是一个可以赋给变量的特殊值。
let a = null;// a的值为null
let obj = { data: 'some data' };
obj = null;// 使用完object后,将其设置为null,回收释放内存
5. Undefined
未定义类型,当一个变量或函数被声明后没有赋值时,它的值就是undefined
let a;
console.log(a)// 输出undefined
6. Symbol(es6新增)
代表唯一的值,独一无二,以函数的形式创建,可以给他一个标签,哪怕标签一样,值也不能判断相等
let sym1 = Symbol('key');
let sym2 = Symbol('key');
console.log(sym1 === sym2); // false,即使描述相同,但值不同
7. Bigint
大整数,用于解决Number类型在处理大整数时可能出现的精度问题。
console.log(9007199254740995);
console.log(90071992547409955n);
最后提一嘴,简单数据类型也可称做原始数据类型,即:Primitive。并且也可以说它只有6种数据类型,因为可以将Number和Bigint属性统称为Numeric类型。
复杂数据类型
复杂数据类型只有一种——对象,在栈中存储的是指向对象所在堆内存的地址,堆内存中存储的是对象的值。
JavaScript中提供了一系列内置的对象类型,包括数组(Array)、用于表示日期和正则表达式的 Date(日期)和 RegExp(正则表达式)包括Function(函数)等。它们做为对象可以随意的添加属性和方法,比如函数中有属性,方法可以添加,并且函数可以作为另一个函数的形参进行传递。
let obj = { name: 'Alice' }; // object 类型
let arr = [1, 2, 3]; // array 类型
let func = function() {
console.log('Hello');
}; // function 类型
let date = new Date(); // date 类型
let regex = /abc/; // regexp 类型
在内存中,它们是这样显示的:
小结
理解 JavaScript 中的数据类型对于编写高效和可靠的代码至关重要。今天对于数据类型的介绍我们就到这里,下次我们再讲如何得到用犯法得到确切变量类型。