深挖JavaScript数据类型

5 阅读5分钟

JavaScript总共有几种数据类型?这是大厂面试中必考的一道基础题,面试官非常喜欢借这道题来考察面试者底层能力。面对这个问题,许多大佬会回答有8种,分别是number string boolean null undefined symbol bigint object,但深入了解JS数据类型的人则会说只有7种,因为numberbigint可以统称为numeric

接下来就来详细介绍下简单数据类型和复杂数据类型。

简单数据类型

在JS中总共有两种数据类型,分别是简单数据类型(Primitive Types)和复杂数据类型(Reference Types)。也可以称他们为原始数据类型和引用数据类型。除了Object(数组、函数等)为复杂数据类型,剩下的都是简单数据类型。

String

String字符串用于表示文本数据,使用单引号和双引号来创建,在es6中新增了一种方式,那就是用模版字符串来创建。

let str = 'Hello, World!'; // 单引号
let str2 = "JavaScript"; // 双引号
let str3 = `This is a template string ${str}`; // 模板字符串
Boolean

Boolean布尔类型用来表示逻辑值,只能返回truefalse。用常用来进行条件判断。

let isTrue = true;
let isFalse = false;
Null

Null表示一个空值或不存在的对象,是一个可以赋值个变量的特殊值。可用于有意表示为空值的对象或表示某处应有个值只是现在没有罢了。Null还有一个特别的用处,那就是清空一个变量,显示回收内存。

let emptyValue = null;
Undefined

Undefined表示未初始化或未被定义的变量,当变量被声明却没有赋值时,它的默认值是Undefined。它还表示某个对象属性不存在,函数没有返回值和访问不存在的数组或对象属性等,都会返回Undefined

let a;
console.log(a);//Undefined

let nums = {};
console.log(nums.property);//Undefined

function nums(){};
console.log(nums());//Undefined

let array = [1,2]
console.log(array[3]);//Undefined
Symbol

Symbol是在es6才出现的,用于创建唯一标识符,可以作为对象属性的键来使用。即使两个Symbol看起来一样,它们的值都是唯一的。

let sym1 = Symbol('key');
let sym2 = Symbol('key');
console.log(sym1 === sym2); // 输出: false
Number和Bigint(Numeric)

Number的作用很简单,就是表示整数和浮点数,范围在-2^53 到 2^53之间。Bigint可以表示任意大小的整数,一般在处理超出Number的大整数时使用。而Numeric可以泛指所有表示数字的数据类型,拥有NumberBigint的功能,不需要区分具体的数值类型。

let num = 42; // 整数
let floatNum = 3.14; // 浮点数
let bigIntNum = 9007199254740991n; // 使用 n 后缀
let anotherBigInt = BigInt(9007199254740991); // 使用构造函数

复杂数据类型

复杂数据类型是指对象、数组、函数等可以用来存储和处理更加复杂信息的数据结构。它们通常包含多个值或引用其他数据类型。因本文篇幅有限,这里就以对象为例。

对象

对象是键值对的集合,键必须是字符串或符号,值可以是任何数据类型。对象通过点符号或方括号来访问对象,它可以表示实体,适合用于构建复杂的模型。

let person = {name: "Alice", age: 25, isStudent: true};

简单数据类型和复杂数据类型的区别

  1. 简单数据类型的值是不可变的,即一旦创建无法修改。复杂数据类型的值是多个值得集合,可以通过访问属性进行值的修改。

  2. 简单数据类型的值是直接存储在栈中,复杂数据类型的值是存储在栈中的指针,该指针指向存储元素的堆内存,通过访问指针来调用数值。

  3. 简单数据类型被赋值给另一个变量或作为参数传递时,实际发生的是值的复制。这意味着改变一个变量不会影响到另一个变量,但复杂数据类型被赋值给另一个变量或作为参数传递时,实际上是将引用地址复制给了新的变量。因此,通过任何一个变量修改对象的属性会影响到所有引用该对象的其他变量。

    简单来说,简单数据类型是值的直接引用,不可变且独立;复杂数据类型是对更复杂结构的引用,可变且共享同一份数据。

在给简单数据类型和复杂数据类型赋值时可以发现使用了两种数据类型来存储数据,分别是栈类型和堆类型。在这就简单聊下。

栈(Stack)

栈是一种后进先出(LIFO, Last In First Out)的数据结构。在计算机科学中,栈通常用来保存函数调用的信息,比如函数的参数、局部变量等。栈的分配和释放非常快;空间较小有限;当栈中作用域结束,会将数据清空。

堆(Heap)

堆是一个动态分配的内存区域,用于存放那些需要在程序运行过程中动态创建的对象。与栈不同,堆没有固定的大小限制,可以容纳大量数据。堆上的分配和释放相对较慢;适合存储大型或数量不定的数据;存储的数据需要手动管理其生命周期,或者依赖于垃圾回收器来回收不再使用的内存。

总结

JS的数据类型从整体来说分为两种,细分则可分为七种或八种,这取决于自身对数据类型的理解。深入了解数据类型,将相关知识学扎实,打好基础。这样在面对面试官的刁钻问题也不会慌乱。