JavaScript 八种数据类型详解:从基础到引用类型的内存机制

作者:小括号时间:2026-10-24 22:34:17浏览:295

本文系统梳理JavaScript的八种数据类型,涵盖ES5至ES6新增的Symbol与BigInt。详细对比String、Number、Boolean等基本类型与Object引用类型的内存分配差异,深入解析栈与堆存储机制、变量复制及参数传递行为,帮助开发者理解深拷贝与浅拷贝的核心逻辑。

一、开门见山🔥

在ES5标准中,JavaScript仅定义了6种数据类型:Number、String、Boolean、undefined、Object和Null。

  • ES6标准引入了Symbol类型。该类型的对象具有唯一性,即使创建时传入相同的参数值,生成的Symbol也不相等,主要用于解决属性名冲突问题,可作为对象的唯一标记。
  • 在Chrome 67版本中,JavaScript引入了BigInt类型,用于安全地存储和操作超出安全整数范围的大整数。

因此,准确而言,当前JavaScript的数据类型总数为8种。

  • Number
  • String
  • Boolean
  • Null
  • Undefined
  • Object
  • Symbol
  • BigInt

根据存储特性,这些类型可分为基本数据类型和引用数据类型两大类。

基本数据类型包括:String、Number、Boolean、Null、Undefined、Symbol和BigInt。

引用数据类型主要为Object。需要注意的是,Object是一个广义类型,Function(函数)、Array(数组)、Date(日期)等具体对象均归属于Object类别。

二、动态数据类型🔥

JavaScript是一种动态类型语言,这意味着同一个变量可以被赋予不同类型的值。

JavaScript中的变量声明仅需使用“var”关键字(或let/const),无需像其他静态类型语言那样严格指定数据类型(如int、double、char等)。这种设计的优势在于变量可以赋予任意类型的值,且后续可重新赋值为不同类型的值,具有极高的灵活性。

var x = 1;        //number类型
var x = 0.1;     //number类型,JS不区分整数值和浮点数值

//现在x由number变成string
var x = "hello world"; //由双引号内文本构成字符串
var x = 'javascript';   //单引号内文本同样可以构成字符串

//现在x由string变成boolean
var x = true;    //true和false作为布尔值

var x = null; 
var x = undefined;  //null和undefined很相似,是特殊的类型

(1)字符串String

字符串用于存储字符序列,例如文本内容。

字符串可以是引号包裹的任意文本,支持使用单引号或双引号进行定义。

  • 在JavaScript中,使用单引号或双引号定义字符串没有功能上的区别。
  • 需要注意的是,单引号字符串内部不应嵌套单引号,双引号字符串内部也不应嵌套双引号。若必须嵌套,需对内部引号进行转义处理,例如使用 \' 表示单引号,使用 \" 表示双引号。
var str = '孙悟空'; //单引号字符串
var str2 = '猪八戒'; //双引号字符串

其他常用转义字符如下:

  • \n 表示换行符
  • \r 表示回车符
  • \t 表示水平制表符(Tab)
  • \' 表示单引号
  • \" 表示双引号
  • \\ 表示反斜杠
  • \uXXXX 表示由四位十六进制数编码的Unicode字符
  • \xXX 表示由两位十六进制数编码的拉丁字符

字符串拼接操作可通过加号(+)实现。

var str1 = "hello";
var str2 = "world";
var str = str1 + str2
console.log(str); //helloworld

(2)数值Number

JavaScript中只有一种数字类型,无论是整数还是浮点数均使用此类型,数值可以包含小数点,也可以不包含。

var num1=5.02;     //使用小数点来写
var num2=520;      //不使用小数点来写

//极大或极小的数字可以通过科学(指数)计数法来书写
var y=123e5;      // 12300000
var z=123e-5;     // 0.00123

JavaScript支持的数值范围大致为:

  • 5e324 到 1.7976931348623157e+308
  • 如果数值超出上述范围,系统将将其表示为 Infinity(正无穷)或 -Infinity(负无穷)。

特殊数值NaN(Not a Number):

  • NaN属于Number类型,是一个特定的数值。
  • 特点1:NaN与任何数值进行运算,结果均为NaN。
  • 特点2:NaN与任何数值都不相等,包括它自身(NaN !== NaN)。

相关检测函数:

  • isNaN() 用于判断数据是否为NaN,若是返回true,否则返回false。
  • isFinite() 用于判断数据是否在有效数值范围内,若在范围内返回true,否则返回false。
//NaN是一个特殊的number,与其他所有值都不相等,包括它自身
console.log(NaN === NaN ); //false

//唯一识别NaN的方法
console.log(isNaN(NaN) );  //true

// 范围:5e324 ~ 1.7976931348623157e+308
var min = 5e324;
var max = 1.7976931348623157e+308;
var a = 1.7976931348623157e+309; 

console.log(min); //Infinity
console.log(max); //1.7976931348623157e+308
console.log(a);   //Infinity
console.log(isFinite(a)); //false(超出范围,不在数值范围内)

(3)布尔Boolean

布尔类型(逻辑类型)仅有两个可能的值:true 或 false。

var x=true;
var y=false;

(4)Null和Undefined

null 表示此处无对象或无值,通常用于表示空引用。

undefined 表示变量已声明但未赋值,即缺少值,原本应有值但未定义。

var x = null;
var y = undefined

(5)Symbol

Symbol函数可接受一个字符串作为参数,为新创建的Symbol提供描述信息。该描述主要用于控制台输出或作为字符串标识时便于区分,不影响Symbol的唯一性。

let name = Symbol();
let name2 = Symbol("bb");
console.log(name);  // Symbol()
console.log(typeof name);  // "symbol"
console.log(name,name2); //Symbol() Symbol(bb)
console.log( name === name2); // false

(6)对象Object

对象由花括号 {} 分隔。在括号内部,对象的属性以键值对的形式(key : value)定义,属性之间由逗号分隔。

//空格和折行无关紧要。声明可横跨多行
var obj = {
    "name":"张三",
    "age":18
}

(注:这里键名也可以不用加引号)

读取对象中属性:

name = obj.name
//或
name = obj['name']

三、基本数据类型与引用数据类型区别🔥

3.1 声明变量时不同的内存分配

  • 基本数据类型由于占据的空间大小固定且较小,通常存储在栈(Stack)内存中,变量直接访问其值。
  • 引用数据类型存储在堆(Heap)内存中,变量访问的其实是一个指针(引用),该指针指向存储对象实际内容的内存地址。

3.2 正是因为内存分配不同,在复制变量时结果也不一样

  • 基本数据类型复制后,两个变量是独立的,因为是将值本身拷贝了一份。
  • 引用数据类型复制时,复制的是指针(引用地址)。两个变量指向堆内存中的同一对象,一旦其中一个变量修改了对象内容,另一个变量访问时也会受到影响。
<script type="text/javascript">
    var x = 3;
    var y = x;
    console.log(x,y); //3 3
    // 基本数据类型复制后2个变量是独立的
    x = 5; //修改一方,另一个不受影响
    console.log(x,y); //5 3 
    
    
    var a = [0,1,2,3];
    var b = a;
    console.log(a, b); //(4) [0, 1, 2, 3] (4) [0, 1, 2, 3]
    a[0] = 9
    console.log(a, b); //(4) [9, 1, 2, 3] (4) [9, 1, 2, 3]
</script>

 

结果:

一、开门见山🔥

从示例中可以明显看出,变量b复制了变量a的引用。当修改a数组的值时,b数组的值也同步改变。这是因为引用数据类型复制的是同一个指针,指针指向的地址相同,一方修改另一方也会受影响。

(此处涉及了JS的深拷贝和浅拷贝概念,这里就不再详细赘述,后面会有单独文章进行讲解)

3.3 参数传递不同

  • 基本数据类型在作为函数参数传递时,是将变量中的值传递给参数。传递后,形参和实参互不影响。
  • 引用数据类型(以函数为例):虽然函数的参数传递机制是按值传递,但传递的值是内存地址(引用)。实参和形参指向堆内存中的同一个对象,因此函数内部对该参数的修改会体现在外部对象上。

数据类型的转换以及检测数据类型的方法会在其他文章单独讲解,为了方便阅读这里就不再详细赘述~

参考链接:

https://www.html.cn/qa/javascript/11619.html

https://www.cnblogs.com/nangezi/p/9049025.html

https://blog.csdn.net/u013592575/article/details/95087953

总结

到此这篇关于JS入门必备之八种数据类型的文章就介绍到这了,更多相关JS 八种数据类型内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

作者最新文章