JavaScript内置函数与核心对象方法实用速查表,涵盖Global、Object、Array、String、Math与Promise的高频API、核心机制对比、执行流程图与避坑指南。
JavaScript内置函数与核心对象方法速查表
时间:2026-11-02
浏览:570
文章目录
在日常 JavaScript 开发中,标准库提供的一系列全局内置函数以及挂载在核心对象(Object、Array、String、Math、Promise 等)上的方法是构建业务逻辑的核心构件。快速查清方法的参数语义、返回值类型以及是否原地修改数据,是保障代码严谨与执行高效的前提。本文对这些高频方法按功能归类梳理,并深入剖析易混淆操作的底层机制与选型依据。
一、全局内置函数速查 (Global Functions)
全局函数直接存在于全局执行上下文中,无需通过任何类或对象实例调用。它们主要用于数值类型转换与解析、网络 URI 字符转义及运行环境合法性判断。
1. 数值解析与合法性判断
解析字符串中的数值或检验计算结果是否为有效数值时,最常使用 parseInt、parseFloat 和 Number.isNaN:
parseInt(string, radix):解析一个字符串并返回指定基数的整数。它从左向右读取字符,直到遇到第一个无法识别为当前进制的字符为止;若首个非空字符无法解析则返回NaN。工程中必须显式指定基数radix(通常为10),避免旧环境将其误判为八进制。parseFloat(string):解析字符串并返回浮点数。只解析十进制,支持识别首个小数点和科学计数法表示(如"3.14e2")。isNaN(value)与Number.isNaN(value):前者会先尝试将参数隐式转换为数值再做判断,极易引发误判(如isNaN("hello")返回true);后者为严格检验,仅当参数类型本身为Number且值为NaN时才返回true。
2. URL 编码与解码
处理网络请求与 URL 查询参数时,需要对特殊字符进行转义:
encodeURIComponent(str)/decodeURIComponent(str):对 URI 组件(如 Query 参数的 Key 或 Value)进行全量转义,会转义; , / ? : @ & = + $ #等保留字符。拼接 URL 请求参数时应统一使用该函数。encodeURI(str)/decodeURI(str):面向完整 URL,不会转义合法的协议、主机名与路径分隔符(如http://中的冒号和斜杠),仅转义空格和中文字符等。
eval()。动态解析执行字符串代码存在极高注入漏洞风险,同时破坏 V8 引擎的作用域优化,导致运行性能大幅下滑。处理 JSON 字符串应始终使用 JSON.parse()。
二、核心对象分类与常用方法
JavaScript 将绝大多数工具方法挂载在核心构造函数(静态方法)或其原型链(实例方法)上。厘清方法挂载位置有助于快速建立调用直觉。
1. Object 核心静态方法
Object 上的方法主要用于对象属性的遍历提取、合并克隆以及对象属性描述符的锁定:
// 1. 键值遍历提取
const user = { id: 101, name: "Alice", role: "admin" };
const keys = Object.keys(user); // 示例输出: ["id", "name", "role"]
const values = Object.values(user); // 示例输出: [101, "Alice", "admin"]
const entries = Object.entries(user); // 示例输出: [["id", 101], ["name", "Alice"], ["role", "admin"]]
// 2. 从键值对还原为对象
const restored = Object.fromEntries(entries);
// 3. 对象浅拷贝合并
const target = { a: 1 };
Object.assign(target, { b: 2 }, { c: 3 }); // target 变为 { a: 1, b: 2, c: 3 }
// 4. 安全检测自身自有属性(推荐替代已弃用的 user.hasOwnProperty)
const hasName = Object.hasOwn(user, "name"); // 示例输出: true
// 5. 冻结对象(禁止增删改现有属性)
Object.freeze(user);
2. Array 核心操作方法速查
数组方法是日常逻辑开发中最活跃的部分。按其执行时是否改变原数组,可以清晰分为“原地变异”与“纯函数非变异”两大派系:
| 方法名 | 挂载类型 | 修改原数组 | 核心返回值 | 常见应用场景 |
|---|---|---|---|---|
push() / pop() |
实例方法 | 是 | 新长度 / 弹出项 | 尾部栈操作 (LIFO) |
shift() / unshift() |
实例方法 | 是 | 移出项 / 新长度 | 头部队列操作 |
splice() |
实例方法 | 是 | 包含被删除项的数组 | 指定位置删除、插入或替换元素 |
sort() / reverse() |
实例方法 | 是 | 原数组引用 | 原地排序或倒序排列 |
slice() |
实例方法 | 否 | 截取出的浅拷贝新数组 | 提取切片,安全复制子数组 |
map() |
实例方法 | 否 | 映射后的新数组 | 数据项转换,生成等长新结构 |
filter() |
实例方法 | 否 | 通过测试项组成的新数组 | 条件过滤数据列表 |
reduce() |
实例方法 | 否 | 累加器最终计算值 | 统计求和、分组汇总、多维扁平化 |
find() / findIndex() |
实例方法 | 否 | 匹配元素 / 索引 / -1 | 按特定回调条件查找第一项 |
some() / every() |
实例方法 | 否 | 布尔值 (true / false) | 判定是否有项或全项满足断言 |
flat() / flatMap() |
实例方法 | 否 | 拍平后的新数组 | 多层嵌套展开与映射打平 |
toSorted() / toSpliced() |
实例 (ES2023) | 否 | 操作后的全新数组 | 不可变数据架构下的无副作用操作 |
3. String 文本处理方法
字符串在 JavaScript 中属于基本数据类型(Primitive),所有字符串实例方法执行后均返回全新字符串,永远不会改变原字符串内容:
slice(start, end):提取索引[start, end)之间的字符。支持负数索引(表示从末尾向前倒数),语义明确稳定。split(separator, limit):按指定分隔符将字符串拆分为子串数组。例如"a,b,c".split(",")输出["a", "b", "c"]。replace(target, replacement)与replaceAll():前者在传入字符串字面量时仅替换首个匹配项;若要替换全部出现项,可使用replaceAll()或带全局修饰符g的正则表达式。includes(searchString, position):判断字符串中是否包含子串,返回布尔值。trim() / trimStart() / trimEnd():剔除两端、前导或尾随的空白字符与换行符。padStart(targetLength, padString):在当前字符串头部填充字符直到满足目标长度,常用于生成格式化流水号或日期补零(如"5".padStart(2, "0")返回"05")。
4. Promise 异步并发控制方法
处理多任务异步调用时,Promise 构造函数提供了四个关键静态方法,其行为差异决定了系统的容错能力:
Promise.all(iterable):全员成功才成功,快速失败。只有全部 Promise 均变为 fulfilled 时,才 resolve 结果数组;若任一 Promise reject,则立刻以此错误 reject。Promise.allSettled(iterable):等待全部落定,绝不提前失败。无论每个 Promise 成功还是失败,都会等待所有异步完成,并返回对象数组记录各项状态(status: "fulfilled" | "rejected"),非常适合多项独立请求的上报与展示。Promise.race(iterable):竞速模式。只要有任何一个 Promise 最先敲定(无论 resolve 还是 reject),立即跟随该结果敲定。Promise.any(iterable):首个成功。只要有任一 Promise 成功即 resolve;仅当全部 Promise 均失败时,才抛出AggregateError。
三、核心差异与场景辨析
在实际编码中,很多开发者容易混淆两组功能相近的方法:一组是数值转换中的 parseInt() 与 Number(),另一组是数组操作中的 slice() 与 splice()。理解它们在一致输入条件下的行为差异及其深层原因,对编写健壮代码至关重要。
1. 深度对比:parseInt(str, radix) 与 Number(val)
parseInt(str, radix) 机制与特点
核心定位:字符解析提取器(Parser)。
- 逐位提取:从左侧首个非空白字符开始,只要字符符合进制规范就持续累加;一旦遇到非数字字符立即截断,返回已提取的整数。
- 容错能力:
parseInt("16px", 10)会返回数值16。 - 空值表现:
parseInt("", 10)、parseInt(null, 10)均返回NaN。 - 基数依赖:强烈依赖第二个参数
radix,缺少基数可能导致前导 0 或十六进制字符串产生意外进制推导。
Number(val) 机制与特点
核心定位:强制类型转换器(Type Cast)。
- 全量判定:对输入进行全量严格转换。只要字符串内部存在非有效数字字符(空格除外),直接返回
NaN。 - 零容忍:
Number("16px")直接判定非法返回NaN。 - 类型映射:
Number("")返回0,Number(null)返回0,Number(false)返回0。 - 选型依据:校验表单输入是否为纯粹合法数值时,应优先使用
Number()。
差异为什么重要:如果开发 CSS 样式计算器需要解析 "120px",使用 Number("120px") 会直接失败产生 NaN,此时必须使用 parseInt;但若是检验用户填写的电话号码或交易金额输入框,使用 parseInt 会悄悄放过 "1000元" 导致脏数据写入后端,此时必须依赖 Number() 的严格全量校验。
2. 深度对比:slice() 与 splice()
这两个方法名称仅一字之差,但属于完全不同的操作模型。一个遵循纯函数不可变范式,另一个是原地改写内存数据的变异方法:
关键差异如下:
- 参数定义:
arr.slice(begin, end)表示截取区间的左右索引;而arr.splice(start, deleteCount, ...items)第二个参数表示要删除的项目数量,后续参数为插入项。 - 内存影响:
slice会在内存中分配一个全新的数组对象,原数组数据分毫不动;splice会直接在原数组的内存地址上移除元素并重排后续元素指针,引起原数组内容彻底改变。 - 开发框架影响:
在 React、Vue3 或 Redux 等基于不可变数据(Immutable State)驱动视图更新的现代框架中,直接对组件 State 数组使用
splice会直接篡改原引用,导致框架无法通过浅比较检测到状态变更,进而引发严重的视图不刷新或渲染异常 Bug。此时必须使用slice、展开运算符或 ES2023 的toSpliced()。
四、常见易错陷阱与工程实践注意事项
1. Array.prototype.sort() 的默认字典序陷阱
在没有传递比较函数时,sort() 会将所有元素先隐式转换为字符串,然后按 UTF-16 码元顺序排列。这意味着数值比较时会出现违背常理的结果:
const scores = [10, 5, 40, 25, 1000];
scores.sort();
// 示例输出: [10, 1000, 25, 40, 5](因为字符 "1" 排在 "2" 和 "4" 之前)
// 正确做法:必须显式传入数值比较函数
scores.sort((a, b) => a - b);
// 示例输出: [5, 10, 25, 40, 1000]
2. Object.assign 与展开运算符的浅拷贝局限
Object.assign() 与 { ...obj } 仅复制对象的第一层属性。如果属性值为引用类型(如嵌套子对象或数组),拷贝过来的仅仅是内存地址指针,修改新对象的深层属性依然会影响源对象:
const config = { theme: "dark", meta: { retries: 3 } };
const copy = { ...config };
copy.meta.retries = 5;
// 注意: config.meta.retries 也被同步改成了 5
// 现代原生深拷贝推荐:使用浏览器与 Node.js 均内置的 structuredClone
const deepCopy = structuredClone(config);
deepCopy.meta.retries = 10; // config.meta.retries 依然安全保持为 5
五、核心方法选型与查阅速查总结
面对庞大的 API 集合,高效编码的核心在于建立按“目标输出”倒推“首选方法”的映射心智。以下矩阵提炼了工程中最常见的四类目标场景及首选方法:
熟练掌握上述核心方法与机制差异后,在日常编写业务代码时,可遵循以下简洁心法:
- 提取数据用
map,过滤条件用filter,聚合数值用reduce,保持原数组纯净不破坏; - 截取数组首选
slice,若确需原地改动首选明确的变异语法或在现代运行时使用toSpliced; - 解析数值始终传入
radix;有效性判断统一采用挂载在命名空间下的Number.isNaN与Number.isFinite; - 多异步并发首选
Promise.all处理强依赖链路,首选Promise.allSettled处理弱耦合独立请求容错。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。