标准库
约 3812 字大约 13 分钟
2026-03-18
手写笔记












一、Object 和 Function
1.1 Object对象
静态成员
| 方法 | 说明 |
|---|---|
Object.keys(某对象) | 返回对象所有属性名组成的数组 |
Object.values(某对象) | 返回对象所有属性值组成的数组 |
Object.entries(某对象) | 返回对象所有属性名和属性值组成的二维数组 |
实例成员
| 方法 | 说明 |
|---|---|
toString() | 返回对象的字符串格式,默认 [object Object] |
valueOf() | 返回对象本身(默认情况) |
⚠️ 类型转换规则:JS 自动类型转换时,先调用对象的
valueOf()方法;若结果仍非原始类型,再调用toString()方法;若valueOf()已返回原始类型,则不再调用toString()。
1.2 Function对象
静态成员
- 无(不涉及)
实例成员
| 方法/属性 | 说明 |
|---|---|
length 属性 | 得到函数形参数量 |
apply( this指向, 参数数组 ) | 调用函数,指定 this,参数以数组形式传递 |
call( this指向, 参数1, 参数2... ) | 调用函数,指定 this,参数以列表形式传递 |
bind( this指向, 参数1, 参数2... ) | 返回新函数,新函数 this 固定为指定值,参数同 call |
💡 常用技巧:利用
apply/call将类数组转为真数组:var newArr = Array.prototype.slice.call(arguments);
二、Array构造器
2.1 数组的定义
- Q:什么是数组?
- A:凡是通过
Array构造器创建的对象,都是数组。
2.2 静态成员
| 方法 | 说明 |
|---|---|
Array.from(arrayLike) | 从可迭代/类数组对象创建新的浅拷贝数组实例 |
Array.isArray(value) | 判断值是否为一个数组,返回 boolean |
Array.of(...) | 通过可变数量参数创建新数组,不考虑参数数据类型 |
2.3 实例成员(会修改原数组)
| 方法 | 语法 | 说明 |
|---|---|---|
fill() | arr.fill(value [, start] [, end]) | 用固定值填充数组,从 start 到 end(左闭右开),返回原数组 |
pop() | arr.pop() | 删除数组最后一项,返回被删除元素的值 |
push() | arr.push(value1, value2...) | 将元素添加到数组末尾,返回新数组长度 |
reverse() | arr.reverse() | 将数组颠倒顺序,返回原数组 |
shift() | arr.shift() | 删除数组第一项,返回被删除元素的值 |
sort(compareFn) | arr.sort((a,b) => a-b) | 对数组排序,默认按字符编码排序;传入比较函数可自定义排序 |
splice() | arr.splice(start, deleteCount, item1...) | 删除/替换/插入元素,返回被删除元素组成的数组 |
unshift() | arr.unshift(value1, value2...) | 将元素添加到数组开头,返回新数组长度 |
2.4 实例成员(不修改原数组)
| 方法 | 语法 | 说明 |
|---|---|---|
concat() | arr.concat(value1, value2...) | 合并数组,返回新数组 |
includes() | arr.includes(searchElement [, fromIndex]) | 判断数组是否包含某值,返回 true/false |
join() | arr.join(separator) | 用分隔符将数组元素拼接为字符串,默认逗号 |
slice() | arr.slice(start [, end]) | 提取数组片段(左闭右开),返回新数组 |
indexOf() | arr.indexOf(searchElement [, fromIndex]) | 返回元素首次出现的下标,找不到返回 -1 |
lastIndexOf() | arr.lastIndexOf(searchElement [, fromIndex]) | 返回元素最后出现的下标,找不到返回 -1 |
forEach() | arr.forEach(callbackFn [, thisArg]) | 遍历数组,无返回值 |
every() | arr.every(callbackFn [, thisArg]) | 所有元素都满足条件返回 true,否则 false |
some() | arr.some(callbackFn [, thisArg]) | 至少一个元素满足条件返回 true,否则 false |
filter() | arr.filter(callbackFn [, thisArg]) | 返回满足条件的元素组成的新数组 |
find() | arr.find(callbackFn [, thisArg]) | 返回第一个满足条件的元素,找不到返回 undefined |
findIndex() | arr.findIndex(callbackFn [, thisArg]) | 返回第一个满足条件的元素下标,找不到返回 -1 |
map() | arr.map(callbackFn [, thisArg]) | 对每个元素执行回调,返回新数组 |
reduce() | arr.reduce(callbackFn [, initialValue]) | 累计计算数组元素,返回最终结果 |
三、原始类型包装器
3.1 Number对象
静态成员
| 方法 | 说明 |
|---|---|
Number.isNaN(value) | 判断是否为 NaN,不会将参数转为数字(全局 isNaN 会转) |
Number.isFinite(value) | 判断是否为有限数,不会将参数转为数字 |
Number.isInteger(value) | 判断是否为整数 |
Number.parseFloat(str) | 解析字符串为浮点数 |
Number.parseInt(str [, radix]) | 解析字符串为指定基数的整数 |
⚠️
Number.parseInt与全局parseInt行为一致,都会先将参数转为字符串再解析,忽略前导空格,从第一个数字开始解析。Number.parseInt("12bc") // 12 Number.parseInt("12bc", 16) // 299(按十六进制解析)
实例成员
| 方法 | 说明 |
|---|---|
toFixed(digits) | 按指定小数位数四舍五入,返回字符串 |
toPrecision(precision) | 按指定精度返回数字字符串 |
3.2 Boolean对象
- 无特殊成员,仅用于包装布尔原始类型,实际开发中很少直接使用。
3.3 String对象
静态成员
| 方法 | 说明 |
|---|---|
String.fromCharCode(num1, num2...) | 从 UTF-16 码点创建字符串 |
String.fromCodePoint(num1, num2...) | 从 Unicode 码点创建字符串(支持 >0xFFFF 的码点) |
实例成员
| 方法/属性 | 说明 |
|---|---|
length | 字符串长度 |
charAt(index) | 返回指定位置的字符 |
charCodeAt(index) | 返回指定位置字符的 UTF-16 码点 |
concat(str1, str2...) | 拼接字符串,返回新字符串 |
includes(searchStr [, pos]) | 判断是否包含子串,返回 true/false |
endsWith(searchStr [, pos]) | 判断是否以子串结尾,返回 true/false |
startsWith(searchStr [, pos]) | 判断是否以子串开头,返回 true/false |
indexOf(searchStr [, pos]) | 返回子串首次出现的下标 |
lastIndexOf(searchStr [, pos]) | 返回子串最后出现的下标 |
padStart(targetLen [, padStr]) | 在开头填充字符串至指定长度 |
padEnd(targetLen [, padStr]) | 在结尾填充字符串至指定长度 |
repeat(count) | 重复字符串指定次数,返回新字符串 |
slice(start [, end]) | 提取子串(支持负数) |
substr(start [, length]) | 从 start 提取 length 个字符(已弃用,推荐用 slice) |
substring(start [, end]) | 提取子串(不支持负数) |
toLowerCase() | 转为小写 |
toUpperCase() | 转为大写 |
split(separator [, limit]) | 按分隔符分割为数组 |
search(reg) | 搜索正则匹配的位置 |
match(reg) | 返回正则匹配结果数组 |
replace(reg, replacement) | 替换正则匹配的内容 |
四、Math对象
4.1 Math对象的特点
- Q:Math对象的特点是什么?
- A:
Math不是构造函数,不能使用new Math()创建实例,所有属性和方法都是静态的,直接通过Math.属性名或Math.方法名()调用。
4.2 静态方法
| 方法 | 说明 |
|---|---|
Math.abs(x) | 返回绝对值 |
Math.ceil(x) | 向上取整(返回大于等于 x 的最小整数) |
Math.floor(x) | 向下取整(返回小于等于 x 的最大整数) |
Math.max(...) | 返回参数中的最大值,无参数返回 -Infinity |
Math.min(...) | 返回参数中的最小值,无参数返回 Infinity |
Math.pow(base, exp) | 返回 base 的 exp 次幂 |
Math.random() | 返回 [0, 1) 之间的随机浮点数 |
Math.round(x) | 四舍五入取整 |
示例:生成 [min, max] 之间的随机整数
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}4.3 静态属性
| 属性 | 说明 |
|---|---|
Math.PI | 圆周率 π(约 3.14159) |
五、Date构造器
5.1 核心时间概念
- Q:什么是UTC、GMT和时间戳?
- A:
- UTC:世界协调时,精确到秒,是全球统一的时间标准;
- GMT:格林威治时间,精确到毫秒,与 UTC 误差小于 0.9 秒;
- 时间戳:自 1970-01-01 00:00:00 UTC 起的毫秒数,是跨平台统一的时间表示方式。
5.2 创建日期对象
| 方式 | 说明 |
|---|---|
new Date() | 创建当前时间的日期对象 |
new Date(timestamp) | 传入时间戳创建日期对象 |
new Date(year, month [, day, hour, min, sec, ms]) | 传入年/月/日/时/分/秒/毫秒创建日期对象(月份从 0 开始) |
5.3 实例方法(获取)
| 方法 | 说明 |
|---|---|
getDate() | 获取日期(1-31) |
getDay() | 获取星期(0-6,0 表示周日) |
getFullYear() | 获取年份(4位) |
getHours() | 获取小时(0-23) |
getMinutes() | 获取分钟(0-59) |
getMonth() | 获取月份(0-11) |
getSeconds() | 获取秒(0-59) |
getMilliseconds() | 获取毫秒(0-999) |
getTime() | 获取时间戳 |
5.4 实例方法(设置)
| 方法 | 说明 |
|---|---|
setDate() | 设置日期 |
setFullYear() | 设置年份 |
setHours() | 设置小时 |
setMinutes() | 设置分钟 |
setMonth() | 设置月份 |
setSeconds() | 设置秒 |
setMilliseconds() | 设置毫秒 |
setTime() | 设置时间戳 |
5.5 实例方法(转字符串)
| 方法 | 说明 |
|---|---|
toDateString() | 日期部分转字符串 |
toISOString() | 转 ISO 格式字符串 |
toLocaleDateString() | 本地日期字符串 |
toLocaleString() | 本地完整日期时间字符串 |
toLocaleTimeString() | 本地时间字符串 |
5.6 应用示例:友好日期字符串格式化
function getDateString(date) {
var year = date.getFullYear().toString().padStart(4, "0");
var month = (date.getMonth() + 1).toString().padStart(2, "0");
var day = date.getDate().toString().padStart(2, "0");
var hours = date.getHours().toString().padStart(2, "0");
var minutes = date.getMinutes().toString().padStart(2, "0");
var seconds = date.getSeconds().toString().padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}六、正则表达式(RegExp)
6.1 正则表达式的定义与创建
Q:JS中的正则表达式是什么?
A:正则表达式在 JS 中是一个对象,用于匹配字符串的特定模式,通过
RegExp构造函数创建。创建正则对象的两种方式:
- 字面量模式:
var reg = /pattern/flags(推荐,语法简洁) - 构造函数模式:
var reg = new RegExp("pattern", "flags")(适合动态生成正则)
- 字面量模式:
6.2 基础语法
1. 字面量匹配
直接书写字符,实现精确匹配,如 /abc/ 匹配字符串中的 "abc"。
2. 特殊字符
| 字符 | 含义 |
|---|---|
. | 匹配除换行符 \n 外的任意字符 |
^ | 匹配输入字符串的开始位置(在字符集 [] 中表示“非”) |
$ | 匹配输入字符串的结束位置 |
3. 转义符
| 转义符 | 含义 |
|---|---|
\n | 匹配换行符 |
\r | 匹配回车符 |
\t | 匹配制表符 |
\s | 匹配任意空白字符 |
\S | 匹配任意非空白字符 |
\b | 匹配一个单词边界 |
\B | 匹配非单词边界 |
\d | 匹配一个数字字符(等价 [0-9]) |
\D | 匹配一个非数字字符(等价 [^0-9]) |
\w | 匹配字母、数字、下划线(等价 [a-zA-Z0-9_]) |
\W | 匹配非字母、数字、下划线(等价 [^a-zA-Z0-9_]) |
\u | 匹配一个 Unicode 字符(如 \u4e00 匹配中文) |
4. 字符集 []
- 匹配方括号内的任意一个字符,如
[abc]匹配a/b/c; [^abc]匹配除a/b/c外的任意字符。
5. 量词
| 量词 | 含义 |
|---|---|
* | 零次或多次(等价 {0,}) |
+ | 一次或多次(等价 {1,}) |
? | 零次或一次(等价 {0,1}) |
{n} | 匹配 n 次 |
{n,} | 匹配 >=n 次 |
{n,m} | 匹配 >=n 且 <=m 次 |
6.3 正则对象实例成员
属性(只读)
| 属性 | 说明 |
|---|---|
global | 是否使用了 g(全局匹配)标志 |
ignoreCase | 是否使用了 i(忽略大小写)标志 |
multiline | 是否使用了 m(多行匹配)标志 |
source | 返回正则表达式的模式字符串(不包含斜杠和标志) |
方法
| 方法 | 说明 |
|---|---|
test(str) | 检查字符串是否匹配正则,返回 true/false |
exec(str) | 在字符串中执行搜索匹配,返回结果数组或 null |
⚠️ 匹配模式:正则默认是贪婪模式(尽可能多匹配),在量词后加
?可切换为非贪婪模式(尽可能少匹配)。
6.4 字符串中的正则方法
| 方法 | 说明 |
|---|---|
split(reg) | 按正则匹配结果分割字符串为数组 |
replace(reg, newStr/func) | 替换匹配的内容,返回新字符串 |
search(reg) | 搜索匹配的位置,返回首次匹配的索引,找不到返回 -1 |
match(reg) | 返回所有匹配结果组成的数组,无匹配返回 null |
示例:千分位格式化
var s = "3343535656";
var reg = /\B(?=(\d{3})+$)/g; // 匹配非单词边界,后面是3的倍数位
s = s.replace(reg, ",");
// 结果:"3,343,535,656"6.5 进阶特性
- 捕获组:用小括号
()包裹的部分叫捕获组,匹配结果中会单独列出,编号从1开始,可嵌套; - 反向引用:在正则中使用
\数字引用之前的捕获组(如\1引用第一个捕获组); - 正向断言(预查):检查某字符后面是否满足某个规则,不改变匹配结果,不生成捕获组:
- 正向肯定预查:
(?=pattern) - 正向否定预查:
(?!pattern)
- 正向肯定预查:
- 负向断言(预查):检查某字符后面是否不满足某个规则,不改变匹配结果,不生成捕获组:
- 负向肯定预查:
(?<=pattern) - 负向否定预查:
(?<!pattern)
- 负向肯定预查:
七、错误处理
7.1 JS中的错误分类
- 语法错误:代码语法不符合规范,会导致整个脚本块无法运行;
- 运行错误:代码语法正确,但运行时出错,会导致当前脚本块后续代码无法执行;
- 逻辑错误:代码可正常运行,但运行结果不符合预期(需通过调试发现)。
7.2 错误调试方法
- 控制台打印:使用
console.log()/console.dir()等打印中间值; - 断点调试:在浏览器 DevTools 或 IDE 中设置断点,逐行执行代码查看变量变化。
7.3 抛出错误
- 错误在 JS 中本质是一个对象,通过
throw关键字主动抛出:throw new Error("错误描述信息"); - 常用错误对象构造函数:
Error(通用错误)、TypeError(类型错误)、RangeError(范围错误)等。
7.4 捕获错误(try...catch...finally)
try {
// 可能出错的代码块1
} catch (err) {
// 捕获到错误时执行的代码块2
// err 是抛出的错误对象,包含错误信息
} finally {
// 无论是否出错,最终都会执行的代码块3(可选)
}- 执行逻辑:
- 先执行
try中的代码; - 如果发生错误,立即停止
try代码执行,进入catch块; - 无论
try/catch是否执行完毕,最后都会执行finally块; finally常用来释放资源、清理操作(如关闭文件/连接)。
- 先执行
八、核心总结
- Object与Function:Object提供对象属性遍历方法,Function提供
apply/call/bind改变this指向,是JS面向对象的基础。 - Array构造器:包含丰富的静态和实例方法,需区分修改原数组和不修改原数组的方法,避免意外数据变更。
- 原始类型包装器:JS为原始类型提供包装对象,使其能调用方法,其中Number和String的方法最常用。
- Math对象:静态对象,提供数学计算和随机数生成功能,是开发中最常用的工具对象之一。
- Date构造器:用于处理日期和时间,注意月份从0开始计数,时间戳是跨平台时间交互的标准。
- 正则表达式:强大的字符串匹配工具,支持字面量和构造函数两种创建方式,掌握基础语法和常用方法可大幅提升字符串处理效率。
- 错误处理:通过
try...catch...finally捕获和处理运行错误,避免程序崩溃,提升代码健壮性。
