JavaScript基本数据类型与包装类型详解

作者:半夏时间:2026-10-30 03:50:44浏览:603

本文详细解析JavaScript中的基本数据类型(Undefined、Null、Boolean、Number、String)与引用类型的区别。重点阐述栈内存与堆内存的存储机制,以及基本包装类型(Boolean、Number、String)在访问属性时的自动创建与销毁过程,帮助开发者理解类型转换与对象生存期的核心概念。

前言

JavaScript数据类型分类与存储机制

JavaScript的数据类型主要划分为原始类型(Primitive Types)和引用类型(Reference Types)两大类。

原始类型,也常被称为基本类型或简单类型,因其占用空间固定且数据段简单,通常存储在栈(Stack)内存中,以便通过值访问来提升变量查询效率。JavaScript中的基本数据类型具体包括Undefined、Null、Boolean、Number和String这五种。

引用类型的值大小可能动态变化,因此无法直接存储在栈中,否则会影响变量查询速度。这类数据存储在堆(Heap)内存中,而栈中存储的仅是指向堆内存中对象的指针,这种机制称为按址访问。

需要注意的是,引用类型的值允许添加、修改和删除属性及方法;相比之下,基本类型的值则不允许添加属性和方法。

JavaScript数据类型分类与存储机制

Undefined类型详解

Undefined类型

Undefined类型仅有一个值,即undefined。当一个变量被声明但未进行初始化赋值时,该变量的默认值即为undefined。


var test;//undefined
console.log(test == undefined);//true
var test = undefined;//undefined 

对于尚未声明的变量,唯一允许的操作是使用typeof操作符检测其数据类型。但在严格模式下执行此操作会引发错误。

typeof(test);//undefined

出现场景

1. 变量已声明但未赋值。

2. 访问对象中不存在的属性。

3. 函数没有返回值时的执行结果。

4. 函数调用时未传入对应的参数。

5. 使用void(expression)表达式。

类型转换


  Boolean(undefined):  false
  Number(undefined):  NaN
  String(undefined):  'undefined'

Null类型详解

Null类型

Null类型同样只有一个值,即null。从逻辑角度来看,null表示一个空对象指针。如果定义的变量计划用于保存对象,建议将该变量初始化为null。实际上,undefined值是从null值派生而来的,因此执行undefined == null的结果为true。

需注意,null代表空对象指针,而[]代表空数组,{}代表空对象,这三者在概念和用途上并不相同。


console.log(null == undefined);//true 

出现场景

当对象不存在时。

类型转换

Boolean(null): false Number(null): 0 String(null): 'null'

由于undefined和null都不是构造器类型,因此无法为它们添加自定义属性。

包装类型与生存期

包装类型

包装类型属于特殊的引用类型。每当读取一个基本类型值时,后台会自动创建一个对应的基本包装类型对象,从而允许调用相关方法来操作这些数据。JavaScript中的包装类型包括Boolean、Number和String三种。


var s1 = 'some text';
var s2 = s1.substring(2);
//在上述过程中,实际上发生了三个步骤
var s1 = new String('some text'); //(1)创建String类型的一个实例 
var s2 = s1.substring(2); //(2)在实例上调用指定的方法
s1 = null; //(3)销毁这个实例 

引用类型与基本包装类型的主要区别在于对象的生存期。使用new操作符创建的引用类型实例,在执行流离开当前作用域之前一直保留在内存中。而自动创建的基本包装类型对象,仅存在于一行代码的执行瞬间,执行完毕后立即被销毁。这意味着在运行时无法为基本类型值动态添加属性和方法。


var s1 = 'some text';
s1.color = 'red';
alert(s1.color);//undefined 

创建方式

显式创建包装类型主要有两种方式:

1. 使用Object方式(不建议使用)。


var s = new Object('abc');
var b = new Object(true);
var n = new Object(123); 

2. 使用构造函数方式(不建议使用)。


var s = new String('abc');
var b = new Boolean(true);
var n = new Number(123); 

需注意,使用new调用基本包装类型的构造函数与直接调用同名的转型函数是有区别的。


var value = '25';
var number = Number(value);
console.log(typeof number);//number
var obj = new Number(value);
console.log(typeof obj);//object 

Boolean类型与转换规则

Boolean类型

Boolean类型仅包含两个值:true和false。Boolean包装类型是与布尔值对应的引用类型,在布尔表达式中直接使用Boolean对象容易造成误解。

出现场景

1. 条件语句中导致的系统隐式类型转换。

2. 字面量或变量定义。

类型转换

Number(true): 1 || Number(false) : 0 String(true):'true' || String(false):'false'

Boolean()

Boolean(undefined):false Boolean(null):false

Boolean(非空对象包括空数组[]和空对象{}):true

Boolean(非0): true || Boolean(0和NaN):false

Boolean(非空包括空格字符串):true || Boolean(''):false

需注意,true不一定等于1,false也不一定等于0。

包装类型继承的方法

valueOf():返回基本类型值true或false。

toString()和toLocaleString():返回字符串'true'或'false'。


console.log(typeof true.valueOf(),true.valueOf());//boolean true
console.log(typeof false.valueOf(),false.valueOf());//boolean false
console.log(typeof true.toString(),true.toString());//String 'true'
console.log(typeof false.toString(),false.toString());//String 'false'
console.log(typeof true.toLocaleString(),true.toLocaleString());//String 'true'
console.log(typeof false.toLocaleString(),false.toLocaleString());//String 'false' 

Number与String类型简述

Number类型

JavaScript中只有一种数字类型,它既可以表示32位整数,也可以表示64位浮点数。

关于Number类型的详细信息请参考相关文档。

String类型

String类型是JavaScript中唯一没有固定大小限制的原始类型。

接下来进一步理解JavaScript基本数据类型的包装对象机制。

基本包装对象的工作机制

现象:为什么可以对字符串的操作采用对象的表示法?

例如:


var s    = "this is a String";
      var len   = s.length; 

解析:

JavaScript的三个基本数据类型分别对应String、Number和Boolean三个对象类。JavaScript能够灵活地将一种类型的值转换为另一种类型。当我们在对象环境中使用字符串,即试图访问该字符串的属性或方法时,JavaScript会在内部自动创建一个String包装对象。该String对象暂时替代原始字符串值以完成访问操作。这个内部创建的String对象是瞬时存在的,其作用是确保我们可以正常访问属性和方法。使用完毕后,该String对象会被系统丢弃,而原始值保持不变。

上述机制同样适用于数字和布尔值类型。

使用Object()函数,可以将任何数字、字符串或布尔值转换为其对应的包装对象。

例如:


var number_wrapper  = Object (3);
作者最新文章