Skip to content

数字和字符串

JavaScript 属于“宽松类型”的编程语言,意味着 JavaScript 变量在不同的场合可以解释为不同的类型。以下介绍 JavaScript 数据类型数值、字符串、布尔值,以及处理这些数据类型的内置方法。还会介绍特殊数据类型 null 和 undefined。

1. 数值

1.1 整数

  • 前缀0x表示十六进制数

1.2 浮点数

普通小数表示或科学计数法 35.4e5

1.3 非数值(NaN)

当脚本试图把一些非数值数据当作数值处理,却无法得到数值,其返回值就是 NaN。利用 isNan() 函数能检测非数值:

inNaN(3); //返回 false
isNaN("horse"); //返回 true

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 不能识别它。