JavaScript基本数据类型与值类型、引用类型详解

作者:小括号

时间:2026-10-29

浏览:619

本文详细解析JavaScript中的五种基本数据类型(Undefined、Null、Boolean、Number、String)及Object引用类型。深入探讨变量声明机制、typeof检测原理,并通过代码示例阐明值类型与引用类型在内存分配和赋值行为上的核心差异,帮助开发者理解JavaScript的松散类型特性。

文章目录

JavaScript基本数据类型概述

JavaScript包含四种基本数据类型:数值(涵盖整数与实数)、字符串(由双引号或单引号包裹的字符或数值)、布尔型(以True或False表示)以及空值。在JavaScript的基本类型中,数据既可以是常量也可以是变量。鉴于JavaScript采用弱类型机制,变量或常量无需预先声明类型,而是在使用或赋值时动态确定其类型。当然,也可以先声明变量,其类型会在赋值时自动推导。

JavaScript变量与类型检测

JavaScript中的变量机制

如前所述,由于JavaScript采用松散类型系统,变量本质上只是一个占位符。

定义变量的方式如下:

var name;

上述代码定义了一个名为name的变量,该变量可用于存储任意值。未初始化的变量会保存一个特殊值——undefined。也可以对变量进行初始化赋值,


var name =”jwy”; //javascript 中的单引号和双引号没有区别,不过要注意正确嵌套
name=10;

例如,name首先被初始化为字符串“jwy”,随后又被修改为数字值100。虽然这种做法不被建议,但在ECMAScript中是合法的,且在许多实际场景中会被采用。

也可以在一条语句中定义多个变量,许多JavaScript框架均采用此种写法。


var name=”jwy”,author,age=29;

每条语句末尾加分号是良好的编程习惯。但在定义多个变量时,建议换行并缩进,以提高代码可读性。

简单数据类型概述

ECMAScript定义了5种简单数据类型:Undefined、Null、Boolean、Number和String。此外,还有一种复杂数据类型——Object。

typeof操作符的作用

由于JavaScript变量是松散类型的,因此提供了一种检测当前变量数据类型的方法,即typeof关键字。在前述ECMAScript的5种简单数据类型中(注意,这5种代表数据类型本身,类似于C#中的int或string类型),通过typeof关键字对这5种数据类型进行检测,会返回以下字符串形式的值:

“undefined” ---------- 如果值未定义,返回Undefined

“boolean” ---------- 如果值是布尔值,返回Boolean

“string” ---------- 如果值是字符串,返回String

“number” ---------- 如果值是数值类型,返回Number

“object” ---------- 如果值是对象或null,返回Object

“function” ---------- 如果值是函数,返回Function

严格来说,函数在ECMAScript中属于对象,每个函数都是Function类的实例。既然函数是对象,它便属于引用类型,因此函数名仅是一个变量名。在许多场合,可以将函数名作为参数传入其他函数进行调用,这类似于C#中的委托。后续章节将详细讲解函数,因为JavaScript中的许多功能都依赖函数实现。

Undefined与Null类型解析

Undefined类型详解

前文提到5种类型是数据类型,因此它们都有对应的值。Undefined类型的值是undefined(注意u为小写)。如果声明了变量但未初始化,该变量的值即为undefined。通常建议尽量给变量初始化,但在早期JavaScript版本中并未规定undefined这个值。因此,为了兼容旧版浏览器,某些框架会给window对象添加undefined属性,如下所示:


window['undefined'] = window['undefined']; 
//或者
window.undefined = window.undefined; 

简单来说,就是给window对象的undefined属性赋值为undefined。在较老的浏览器中,对象并没有undefined这个属性,因此如果使用涉及undefined的操作可能会导致异常。采用这种方式可以兼容旧浏览器。虽然初看难以理解,但在旧版本浏览器中,由于没有window.undefined这个对象,会返回undefined值,从而确保兼容性。

然而,包含undefined值的变量与未声明的变量是不同的,例如:


var name;
alert(name);//undefined
alert(age);// 错误:age is not defined

未声明过的变量只能执行一项操作,即使用typeof操作符检测其数据类型,其他操作均不可执行。

无论变量是否声明但未初始化,还是未声明,执行typeof都会返回undefined的值。这两种变量都不能执行真正的操作。

Null类型详解

Null类型的值是null,它表示一个空对象指针,不指向任何对象。如果一个变量的值是null,那么该变量很可能是一个垃圾收集的对象。使用typeof检测null值时会返回“object”,


var person = null;
alert(typeof person);//”object”

建议:如果变量用于保存对象,则初始化为null。这样可以检测该变量是否已经保存了一个对象的引用。

注意:undefined值派生自null,因此对它们执行相等测试会返回true,例如:


alert(null == undefind);//true

尽管它们相等,但用途完全不同。在任何情况下,都没有必要将变量的值显式设置为undefined,但这条规则不适用于null。

Boolean与Number类型详解

Boolean类型详解

该类型只有两个值:true和false。虽然只有两个值,但JavaScript中所有类型的值都有与这两个值等价的值。要将一个值转换为对应的Boolean值,可以调用转型函数Boolean()(实际上Boolean、Object、String、Number、Function等都是函数,即构造函数,也可以理解为一个类,用类型调用toString()方法会返回如下内容:

"function Function() { [native code] }",Function会相应地改为各自调用的函数)。

实际上,在if语句判断中,会对内部条件自动执行Boolean转换。

Number类型详解

数值类型包含许多值,最基本的是十进制,例如:

var num=510;

除了十进制,整数还可以通过八进制或十六进制表示。其中八进制字面值第一位必须是0,后跟八进制数字序列。如果字面值中的数值超出范围,前导零将被忽略,后面的数值将被当作十进制数解析。

var num1=070;//八进制的56 var num2 =079;//无效的八进制—解析为79 var num3 =08;// 无效的八进制—解析为8

十六进制前面必须是0x,后跟十六进制数字(0~F),不分大小写。例如:


var num1 = 0xA;
var num2 = 0x1f;

虽然可以表示为八进制和十六进制,但在计算时会被转换成十进制值。

除了整数,还有浮点数值。当然,没有像其他强类型语言中的float之类的关键字。


var num1 = 1.1;
var num2 =0.1;
var num3 = .1;//有效,但不推荐

在保存整数时,内存分配大小只有浮点数的1/2。因此,当浮点数可以转换为整数时,JavaScript会自动将其转换为整数。

除了这些较小的数值,还有一些极大或极小的数值,可以用科学计数法表示,

var num=123.456e10;

浮点数值的最高精度是17位小数,但是计算时其精确度远远不如整数。例如 ,0.1+0.2不等于0.3,而是0.3000000000000004,所以在做判断时,千万不要用浮点数相加判断等于预想中的某个值。

在JavaScript中,数值最小的是Number.MIN_VALUE,可以想象Number是一个类,而MIN_VALUE是一个静态变量,储存最小值。同样,最大的是Number.MAX_VALUE。

如果计算中超出了这个最大值和最小值范围,则将被自动转换成Infinity值。如果是负数,就是-Infinity;如果是正数,就是Infinity。Infinity的意思是无穷,也就是正负无穷,与数学中的概念相同。但是Infinity无法参与计算。可以使用原生函数isFinite()来确定是否有穷:只有位于数值范围内才会返回true。

在JavaScript中,数值除了普通的整数、浮点数、最大值、最小值、无穷之外,还有一个特殊的值,即NaN。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。例如,在C#中任何数值除以0都会报错并抛出异常,但在JavaScript中,任何数值除以0会返回NaN,因此不会影响代码的执行。

NaN的特点:

1、任何涉及NaN的操作(如:NaN/0)都会返回NaN。

2、NaN与任何值都不相等,包括NaN本身。例如:


alert(NaN == NaN);//false

因此,JavaScript中有一个isNaN()函数,该函数接收一个参数(任意类型),它会帮我们确定这个参数是否“不是数值”。它会先尝试将该值转换为数值。如果不能被转换为数值的值在调用这个函数之后会返回true,即isNaN(非数值)。

至于数值转换,这个内容在JavaScript中展开又是一篇文章,有时间再整理。

String类型与Object类型

String类型详解

字符串可以由单引号或双引号表示,在JavaScript中这两种引号是等价的,例如:


var name = ‘jwy';
var author = “jwy”;

但需要注意正确嵌套。

字符串可以直接用字面量赋值。任何字符串的长度都可以通过访问其length属性获得。

在JavaScript中的字符串是不可变的,这与C#中相同(估计是为了提高性能)。字符串一旦创建,其值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新字符串的字符串填充该变量。


var name=”jwy”;
name = “jwy”+” study javascript”;

这里一开始name是保存字符串“jwy”的,第二行代码则将“jwy”+” study javascript”; 值重新赋给name。它先创建一个能容纳这个长度的新字符串,然后填充,最后销毁原来的字符串。

几乎每个值都有自己的toString()方法,在后面的文章会解释这个方法从哪里来,它会返回相应值的字符串表现。


var age=11;
var ageToString =age.toString();//”11”

数值、布尔值、对象和字符串值都有toString(),但是null和undefined值没有这个方法。

一般来说,调用toString()方法不必传递参数。但是,在调用数值的toString方法时,可以传递一个参数,用来指定要输出的数值的基数(看是要输出十进制、二进制、八进制还是十六进制表示)。

由于null和undefined没有toString方法,在不知道是否是这两者的情况下调用会报错,因此还有一条路可选,就是使用转型函数String(),它可以接收任何类型的值转为字符串。处理规则如下:

1、如果这个值有toString则直接调用,并返回结果

2、如果是null,则返回“null”

3、如果是undefined,则返回“undefined”

Object类型详解

Object类型是JavaScript引用类型的鼻祖(与在C#和Java中相同)。在创建Object类型的实例后,可以为其添加属性和方法,


var o = new Object;//有效,不推荐
var o =new Object();

在JavaScript中,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。

每个实例都有如下的属性和方法,如下:

1、constructor,保存着用于创建当前对象的函数。上面构造函数就是Object();

2、hasOwnProperty,用于检查给定的属性是否在当前对象实例中。是则返回true,不是在实例中而是在原型中,则返回false;

3、isPrototypeOf,用于检查传入的对象是否是另一个对象的原型

4、propertyIsEnumerable,用于检查给定的属性是否能够使用for…in语句来枚举,

5、toString,返回对象的字符串表示

6、valueOf,返回对象的字符串、数值或布尔值表示,通常与toString方法返回值相同

以上就是Object所具有的属性和方法,所有对象都会因为继承关系而继承这些属性和方法。

总结

Undefined、Null、Boolean、Number、String是JavaScript中的基本数据类型,而Object属于引用类型。用typeof检测其他类型会返回相应的字符串,但是检测null或对象时,会返回“object”。如果掌握了这些,以后就不会看到这些会点摸不着头脑了。顺带提一句:

Boolean、Number、String这三个是JavaScript中的基本包装类型,也就是这三个其实是一个构造函数,它们是Function的实例,属于引用类型。至于这里的String与文章说的String是同名,是因为上文说的String是指字符串,这里的String指的是String这个构造函数。上面那么写,是为了更好地理解,因为JavaScript是松散类型的。我们可以看下String实例化的例子:


var name = String("jwy");
alert(typeof name);//"object"
var author = "Tom";
alert(typeof name);//"string"

至于author这个会有length、substring等等这些方法,其实是String这里的方法,string只是String的一个实例,类似于C#中的String和string,只不过这里特殊一点。

注意,typeof 变量 如果值是“string”的话,也就是这个变量是字符串。在JavaScript中,字符串是基本类型,而在C#或Java中,字符串是引用类型。但是JavaScript中的String是引用类型,因为它是JavaScript中定义好的基本包装类型。在C#中,String跟string其实是一样的。这个东西有点绕,如果有错,请大家指出来,一起交流交流。

值类型与引用类型的区别

JavaScript中的值类型和引用类型

一、拥抱JavaScript

曾经名不经传的JavaScript随着AJAX的流行而身价倍增。现在JavaScript不再仅仅是WEB开发中一个可有可无的辅助工具,甚至有了专门属于它的职位“JavaScript工程师”。哪怕你仅仅是一名WEB后台开发程序员,你也必须了解JavaScript,至少在一些相关招聘职位要求上你可以看到“熟悉JavaScript优先”的字眼。甚至我还要告诉你,你将可以用JavaScript开发桌面软件,这得益于Adobe AIR的另外一种开发模式,即用HTML+CSS+JavaScript开发AIR。

二、值类型和引用类型话题

随着部分有大型面向对象语言基础朋友的介入,他们试着用JavaScript去模拟面向对象的各种特征。尽管有些模拟显得较为牵强,但也让我们见识到了JavaScript的强大与灵活性。本文暂不探讨JavaScript面向对象编程技术。就讲讲JavaScript中的两种变量类型:即值类型和引用类型,这通常又会让你联想到“堆栈”,另外还有“引用地址”或“指针”相关概念。有过Java或C#编程经验的人相信对这两种类型不陌生。下面就举例讲一下这两种类型在JavaScript中的体现、用法及注意事项。

三、JavaScript值类型和引用类型有哪些

(1)值类型:数值、布尔值、null、undefined。

(2)引用类型:对象、数组、函数。

四、如何理解值类型和引用类型及举例

我们可以用“连锁店”和“连锁店钥匙”来理解,不知道以下比喻合不合适,^-^。

(1)值类型理解:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关、各自运营。

值类型例子


function chainStore()
{
  var store1='Nike China';
  var store2=store1;
  store1='Nike U.S.A.';
  alert(store2); //Nike China
}
chainStore();
//把一个值类型(也可以叫基本类型)store2传递给另一个变量(赋值)时,其实是分配了一块新的内存空间,因此改变store1的值对store2没有任何影响,因为它不像引用类型,变量的交换其实是交换了指像同一个内容的地址。

(2)引用类型理解:变量的交换等于把现有一间店的钥匙(变量引用地址)复制一把给了另外一个老板,此时两个老板同时管理一间店,两个老板的行为都有可能对一间店的运营造成影响。

引用类型例子


function chainStore()
{
  var store1=['Nike China'];
  var store2=store1;
  alert(store2[0]); //Nike China
  store1[0]='Nike U.S.A.';
  alert(store2[0]); //Nike U.S.A.
}
chainStore();
//在上面的代码中,store2只进行了一次赋值,理论上它的值已定,但后面通过改写store1的值,发现store2的值也发生了改变,这正是引用类型的特征,也是我们要注意的地方。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章