数字和字符串
JavaScript 属于“宽松类型”的编程语言,意味着 JavaScript 变量在不同的场合可以解释为不同的类型。以下介绍 JavaScript 数据类型数值、字符串、布尔值,以及处理这些数据类型的内置方法。还会介绍特殊数据类型 null 和 undefined。
1. 数值
1.1 整数
- 前缀0x表示十六进制数
1.2 浮点数
普通小数表示或科学计数法 35.4e5
1.3 非数值(NaN)
当脚本试图把一些非数值数据当作数值处理,却无法得到数值,其返回值就是 NaN。利用 isNan() 函数能检测非数值:
1.4 使用 parseFloat() 和 parseInt()
把字符串强制转换为数值格式的函数。
parseInt() 函数解析字符串并返回一个整数或 NaN。从首字符(如果是数字)解析到非数值字符。
- 可以接受第2个参数 radix 指定以几进制解析数值;
- 直接截断小数,不四舍五入;
- 如果第一个字符就无法转换,返回
NaN(Not a Number)。
parseInt("10"); // 10
parseInt("10.99"); // 10 (直接去掉小数,不四舍五入)
parseInt("100px"); // 100 (读到 p 发现不是数字,停止)
parseInt(" 20 "); // 20 (忽略首尾空格)
parseInt("Code 20"); // NaN (第一个字符 C 就不是数字)
parseFloat() 解析字符串返回浮点数或 NaN。
- 能识别第一个小数点;
- 遇到第二个小数点或非数字字符时停止;
- 没有进制参数(始终按十进制解析)。
parseFloat("10"); // 10
parseFloat("10.55"); // 10.55
parseFloat("10.55.99"); // 10.55 (读到第二个点,停止)
parseFloat("314e-2"); // 3.14 (支持科学计数法)
parseFloat("15.5元"); // 15.5
1.5 无穷大(Infinity)
JavaScript 能表示的最大安全数字大约是 \(1.79 \times 10^{308}\)。如果你计算的结果超过了这个数,返回无穷大(Infinity)。
- 除以 0 也会返回 Infinity。
| 运算 | 代码示例 | 结果 | 解释 |
|---|---|---|---|
| 加减 | Infinity + 1 |
Infinity |
无穷大加任何数还是无穷大 |
| 乘法 | Infinity * 10 |
Infinity |
无穷大乘以正数还是无穷大 |
| 除法 (作被除数) | Infinity / 2 |
Infinity |
无穷大的一半还是无穷大 |
| 除法 (作除数) | 1 / Infinity |
0 |
1 分给无穷多人,每人分到 0 |
- Infinity - Infinity -> NaN |
|||
- Infinity / Infinity -> NaN |
|||
- 0 * Infinity -> NaN |
isFinite() 函数判断一个数值是否是无穷大。它把参数转换为数值,如果结果是 NaN、Infinity 或 -Infinity,返回 false,否则返回 true。
2. 字符串
JavaScript 没有一种特定数据类型表示单个字符,只能创建一个只包含一个字符的字符串。
2.1 转义序列
同 C。
2.2 字符串方法
字符串是不可变的。所有的字符串方法都不会修改原字符串,而是返回一个新的字符串。
2.2.1 查找与检查
用于判断字符串中是否包含某些内容,或找到内容的位置。
| 方法 | 描述 | 返回值 | 示例 |
|---|---|---|---|
includes(str) |
判断是否包含子串 (ES6) | true / false |
"Hello".includes("e") -> true |
indexOf(str) |
查找子串第一次出现的索引 | 索引值 (没找到返 -1) | "Hello".indexOf("l") -> 2 |
startsWith(str) |
判断是否以某串开头 | true / false |
"Hi".startsWith("H") -> true |
endsWith(str) |
判断是否以某串结尾 | true / false |
"img.png".endsWith(".png") -> true |
const email = "[email protected]";
// 推荐:用 includes 做条件判断,语义更清晰
if (email.includes("@")) {
console.log("有效的邮箱格式");
}
// 老派写法:用 indexOf
if (email.indexOf("@") !== -1) { /* ... */ }
2.2.2 截取与提取
-
slice(start, end): 提取从start到end(不含end) 的部分。- 强项:支持负数索引(代表从后往前数)。
const str = "JavaScript";
// 1. 基础用法:从索引 0 到 4 (不含 4)
console.log(str.slice(0, 4)); // "Java"
// 2. 省略第二个参数:从 4 截取到最后
console.log(str.slice(4)); // "Script"
// 3. 获取最后 3 个字符
console.log(str.slice(-3)); // "ipt"
substring()功能类似但不支持负数(负数会变成0),substr()已被废弃,不建议使用。
2.2.3 修改与替换
-
返回的是新字符串。
-
replace(search, replacement): 替换匹配到的第一个子串。 -
replaceAll(search, replacement): 替换匹配到的所有子串 (ES2021 新特性)。 -
trim(): 去除字符串两端的空格(处理用户输入)。 -
toUpperCase()/toLowerCase(): 大小写转换。
const text = " Hello World, Hello JS ";
// 去除空格 + 转小写
console.log(text.trim().toLowerCase()); // "hello world, hello js"
// 替换
console.log(text.replace("Hello", "Hi")); // " Hi World, Hello JS " (只变了第一个)
console.log(text.replaceAll("Hello", "Hi")); // " Hi World, Hi JS " (全变了)
2.2.4 转换
最重要的方法是 split(),它经常和数组方法配合使用。
split(separator): 将字符串按照指定分隔符拆开,变成数组。
const dateStr = "2023-10-25";
// 按横杠分割
const parts = dateStr.split("-");
console.log(parts); // ["2023", "10", "25"] (变成了数组)
// 常见技巧:将单词反转
const word = "hello";
// split拆开 -> reverse反转 -> join合并
const reversed = word.split("").reverse().join("");
console.log(reversed); // "olleh"
2.2.5 现代字符串拼接:模板字符串
虽然这不是一个“方法”,但它是处理字符串的现代标准。使用反引号 `。
- 特点:支持换行、支持直接嵌入变量
${var}。
const name = "Gemini";
const version = 1.5;
// 旧写法
const msg1 = "我是 " + name + ",版本是 " + version;
// 新写法 (推荐)
const msg2 = `我是 ${name},
版本是 ${version}`; // 支持直接换行
总结速查表
| 作用 | 推荐方法 |
|---|---|
| 在哪?/ 有没有? | includes(), indexOf() |
| 切一块 | slice() |
| 变数组 | split() |
| 替换内容 | replaceAll() |
| 清理用户输入 | trim() |
3. 布尔值
两个值 true 或 false 用于保存逻辑操作的结果。
- 注意不要把值包含在引号里,否则会被当作字符串字面量处理;
- 转化为数值,true 为 1,false 为 0。
-
“类假”(undefined null 0 NaN ""...)、“类真”
-
“非”操作符
! -
与 null 不同,undefined 不是关键字,是预定义的全局变量。某变量在语句中使用但没有被赋值时值为 undefined,表示 JavaScript 不能识别它。