JavaScript 基础
让我们来学习JavaScript数据类型的基础知识。
数据类型
JavaScript 有三种原始数据类型——string、number 和 boolean。还有五种引用数据类型——Object、Array、Function、Date 和 RegExp。数组、函数、日期和正则表达式都是特殊类型的对象,但从概念上讲,日期和正则表达式被视为原始数据值,只是以包装对象的形式实现。
以下是 JavaScript 数据类型的示例:
1let string = "Johnson"; // 字符串 2let number = 16; // 数字 3let bool = true; // 布尔值 4 5let object = {firstName:"John", lastName:"Doe"}; // 对象 6let array = ['Jim', 'Shawna']; // 数组 7function func() { return (5 * 19); } // 函数 8let date = new Date(); // 日期 9 10console.log("字符串是: " + string); 11console.log("数字是: " + number); 12console.log("对象是: " + object.firstName + " " + object.lastName); 13console.log("数组是: " + array); 14console.log("函数是: " + func()); 15console.log("日期是: " + date.toUTCString());
字符串数据
字符串是一系列 Unicode 字符。字符串字面量,如 "Hello world!"、'A3F0' 或空字符串 "",用单引号或双引号括起来。两个字符串表达式可以通过 + 操作符连接,并使用三重等号操作符进行相等性比较。
通过在字符串上应用 length 属性,可以获取字符串的字符数量。以下示例有助于理解 length 属性的使用:
1let firstName = "James"; 2let lastName = "Bond"; 3if (firstName + lastName === "JamesBond") { 4 console.log("名字长度为: ", firstName.length); 5} else { 6 console.log("失败"); 7}
数值数据
所有数值数据都以 64 位浮点格式表示,可选地包含指数(例如 3.1e10)。JavaScript 中没有显式的整数与浮点数类型区分。如果一个数值表达式无法计算为有效数字,则其值被设为 NaN(非数字),可通过内置函数 isNaN(expr) 进行检测。
1// 检查 NaN 2function milliseconds(x) { 3 if (isNaN(x)) { 4 return '不是数字!'; 5 } 6 return x * 1000; 7} 8 9console.log(milliseconds('100F')); 10console.log(milliseconds('0.0314E+2'));
内置函数 Number.isInteger 可用于判断一个数是否为整数。若要确保某个数值是整数,或把表示数字的字符串转换为整数,应使用内置函数 parseInt。
类似地,表示小数的字符串可以用 parseFloat 转换为数字。将数字 n 转换为字符串的最佳方法是使用 toString(n)。
1// 检查是否为整数 2function check(x, y) { 3 if (Number.isInteger(y / x)) { 4 return '整数!'; 5 } 6 return '不是整数!'; 7} 8 9console.log(check(5, 10)); 10console.log(check(5, 11)); 11 12let a = parseInt(10.00); // 将浮点数解析为整数 13let b = parseFloat('10'); // 将字符串解析为浮点数 14let c = (15).toString(); // 将数字转换为字符串 15 16console.log("a 的类型是: " + typeof a); 17console.log("b 的类型是: " + typeof b); 18console.log("c 的类型是: " + typeof c);
布尔数据
有两个预定义的布尔数据字面量:true 和 false。布尔运算符符号包括:
!表示逻辑非(NOT),&&表示逻辑与(AND),||表示逻辑或(OR)。
当非布尔值用于条件判断或作为布尔表达式的操作数时,会根据以下规则隐式转换为布尔值:
- 空字符串、数值字面量
0、undefined和null都映射为false。 - 所有其他值都映射为
true。
这种转换也可以通过双否定操作显式完成,例如在等价性测试 !!undefined === false 中,该测试结果为 true。
1function check() { 2 if (!!undefined === false) { 3 return 'true!'; 4 } 5 return 'false!'; 6} 7 8console.log(check());
日期和时间
除了字符串、数字和布尔值外,日历日期和时间也是重要的原始数据类型。它们并非作为原始值实现,而是以 Date 类型的包装对象形式存在。
需要注意的是,Date 对象实际上并不直接表示日期,而是内部以自 1970 年 1 月 1 日 UTC 起的毫秒数来表示具体的时间点。
为了将 Date 对象的内部值转换为人类可读的字符串,有多种方式。最重要的两种方式是:
- 使用 ISO 格式的日期时间字符串(如
2015-01-27); - 使用本地化格式的日期时间字符串(如
"27.1.2015",为简化起见,示例中省略了时间部分)。
当变量 x 是 Date 实例时(即 x instanceof Date),x.toISOString() 返回 ISO 格式的日期时间字符串,而 x.toLocaleDateString() 返回本地化格式的日期字符串。对于任意日期字符串 ds(无论是 ISO 格式还是本地化格式),new Date(ds) 都能创建对应的日期对象。
1let date = new Date(); // 日期 2 3console.log("日期是: " + date); 4console.log("日期是: " + date.toISOString()); 5console.log("日期是: " + date.toLocaleDateString()); 6console.log("日期是: " + date.toUTCString());
typeof 操作符
我们可以使用 typeof 操作符来检测变量 v 是否持有特定类型的值。例如,使用 typeof v === "number" 可以检查 v 是否为 number 类型。JavaScript 中变量、数组元素、函数参数和返回值的类型并未显式声明,通常也不会由 JS 引擎进行类型检查。类型转换(强制类型转换)会自动进行。
变量的值可能为以下几种情况之一:
- 一种数据值,即字符串、数字或布尔值;
- 一个对象引用,指向普通对象、数组、函数、日期或正则表达式;
- 特殊数据值
null,通常用于初始化对象变量; - 特殊数据值
undefined,是所有已声明但未初始化变量的隐式初始值。
以下示例帮助我们理解 typeof 操作符:
1// "string" 2let a = "JavaScript"; 3// "number" 4let num = 25; 5// "undefined" 6let variable; 7// "object" 8let object = { firstName: "John", lastName: "Doe" }; 9 10console.log(typeof a); 11console.log(typeof num); 12console.log(typeof variable); 13console.log(typeof object);
类型转换
我们可以通过以下方式在不同数据类型之间进行显式转换:
类型转换
| 类型 | 转换为字符串 | 字符串转换为类型 |
|---|---|---|
| 布尔值 | String(x) | Boolean(y) |
| 数字(浮点数) | String(x) | parseFloat(y) |
| 整数 | String(x) | parseInt(y) |
| 对象 | x.toString() 或 JSON.stringify(x) | JSON.parse(y) |
| 数组 | x.toString() 或 JSON.stringify(x) | y.split() 或 JSON.parse(y) |
| 函数 | x.toString() | new Function(y) |
| 日期 | x.toISOString() | new Date(y) |
| 正则表达式 | x.toString() | new RegExp(y) |