在计算机中,不同的数据占用的存储空间是不同的。变量的数据类型决定了如何将变量的值存储到计算机的内存中,所有变量都具有数据类型。JavaScript是一种弱类型语言,声明变量时不需要指明数据类型,变量的数据类型由所赋的值的类型决定。
JavaScript把数据类型分为基本数据类型和复杂数据类型(复杂数据类型也称为引用数据类型)两类。基本数据类型包含了number(数字)类型、string(字符串)类型、boolean(布尔)类型、undefined(未定义)类型、null(空)类型;复杂数据类型就是对象类型,包含了对象、数组、函数。数据类型划分示意图,如图2-2所示。
图2-2 数据类型分类
本小节介绍基本数据类型,后续章节将分别介绍复杂数据类型。
1. number(数字)类型
数字类型用于存储数字。数字可分为整型和浮点型,整型用于表示整数,浮点型用于表示小数。示例如下:
var age = 21; // 整数 var salary = 2000.3; // 小数
数字类型有Infinity、-Infinity和NaN(Not a Number)三个特殊值,分别代表正无穷大、负无穷大和非数字。JavaScript提供了isFinite()和isNaN()函数,用于判断当前变量是否为有限数值和非数字(这些函数介绍详见函数章节)。示例如下:
var age = 21; // 整数 var salary = 2000.3; // 小数 console.log(3/0);// 输出:Infinity console.log(-3/0); // 输出:-Infinity var age; // 声明变量age,没有初始化默认值是undefined console.log(age+3); // 输出:NaN
2. string(字符串)类型
字符串类型是一个连续的字符序列,可以是计算机能够表示的任何字符序列。JavaScript通过使用单引号或者双引号表示字符串。由于HTML标签里面的属性使用的是双引号,本书推荐使用单引号表示字符串。示例如下:
var strMsg = "爱我中华"; // 使用双引号表示字符串 var strMsg2 = '爱我中华'; // 使用单引号表示字符串 var strMsg3 = 爱我中华; // 错误,缺少引号
需要注意的是,JavaScript可以用单引号嵌套双引号,或者用双引号嵌套单引号。示例如下:
// 用单引号嵌套双引号 var strMsg4 = '从政府工作报告看稳就业的"组合拳" '; // 用双引号嵌套单引号 var strMsg5 = " '祝融'探火,'羲和'逐日,'天和'遨游星辰"; // 错误。单双引号需搭配 var strMsg6 = '对高校毕业生'要加强就业创业政策支持和不断线服务'';
JavaScript的反斜杠(\)有着特殊的用途,通过它和一些字符的组合使用,可以在字符串中包括一些无法直接键入的字符,或改变某个字符的原义。反斜杠(\)称为转义字符,例如\n表示的是换行符,可实现换行功能。JavaScript常用的转义字符如表2-3所示。
表2-3 常用的转义字符
转义字符的应用,示例如下:
var strMsg = " 把\"国之大者\"作为\"责之重者\",把\"民之关切\"作为\"行之所向\" "; alert(strMsg);
上述代码在Chrome浏览器中的运行结果,如图2-3所示。
图2-3 转义字符的使用
从图2-3可知,输出字符串中的双引号,除了可以使用单引号嵌套双引号方法外,还可以在双引号里面使用转义字符。
3. boolean(布尔)类型
布尔类型表示真或假、是或否,只有true和false两个值,true表示“真”,false表示“假”,区分大小写。示例如下:
var foo = true;// 正确 var bar = false; // 正确 var foo = TRUE; // 错误。TRUE没有定义 var bar = FALSE; // 错误。FALSE 没有定义
提示: 布尔类型在程序中通常用于流程控制语句中判断条件是否成立,例如if-else语句。
4. undefined(未定义)类型
如果var关键字声明一个变量,但没有对其赋值,此变量的数据类型是undefined 。 示例如下:
var age; // 声明变量 age ,没有初始化,默认值是 undefined
5. null(空)类型
空类型用于定义空的或不存在的引用。示例如下:
var obj = null; // 声明变量obj,初始值是null
JavaScript使用运算符typeof来检测变量或值的数据类型,返回值是代表数据类型的字符串。typeof返回值如表2-4所示。
表2-4 typeof返回值
(续表)
typeof检测null时,结果是object对象类型,这是JavaScript留下的历史遗留问题。JavaScript进行数据底层存储的时候用二进制存储,它的前三位代表存储的数据类型,而000是代表object类型,也就是引用类型的数据。由于null全是0,所以它符合object类型的存储格式,因此typeof检测的时候输出object。
不同类型的数据在一起参与运算时,有时需要进行数据类型转换。JavaScript数据类型转换可以分为自动类型转换和强制类型转换两种。
1. 自动类型转换
自动类型转换并不会改变操作数本身的类型,改变的仅仅是这些操作数如何被求值以及表达式本身的类型。
(1)其他类型转布尔型
其他类型转换为布尔型时,会被看作false的数据,如表2-5所示。其他数据会被视为true。
表2-5 其他类型转布尔型
其中,浮点型0.0后面无论添加多少个0,值均为false;空字符串的值为false,但包含一个空格的非空字符串的值为true。
(2)其他类型转数字型
布尔型和数字型进行算术运算时,true会自动转换为1参与运算,false会自动转换为0参与运算。示例如下:
var foo = true; console.log(foo+3); // 输出:4 console.log(true*3); // 输出:3
undefined参与算术运算时结果为NaN。示例如下:
var age; // 声明变量age,没有初始化,默认值是undefined console.log(age+3); // 输出:NaN
null参与算术运算时转换为0。示例如下:
var obj = null; // 声明变量obj,初始值是null console.log(obj+3); // 输出:3
如果运算符为-、*、/、%中的任意一个,JavaScript会自动将字符串转换为数字,对无法转换的则转换为NaN。示例如下:
console.log("15"-5); // 输出:10 console.log("2"*5); // 输出:10 console.log("15"-"a"); // 输出:NaN
(3)其他类型转字符串型
如果表达式中存在字符串类型和其他类型数据,而运算符使用加号“+”,JavaScript会自动将其他类型转换为字符串,并将两个字符串拼接在一起。示例如下:
console.log("20"+2); // 输出:202 var age = 100; // 输出:2021年是中国共产党成立100周年 console.log('2021年是中国共产党成立'+age+'周年'); var variable = undefined; console.log(variable + '你好'); // 输出:undefined你好
2. 强制类型转换
强制类型转换可以把一种数据类型强制转为另一种数据类型,JavaScript中强制类型转换主要通过调用Number()、parseFloat()和parseInt()等函数来实现,具体内容详见函数章节。