Node.js入门教程(二十九):util 模块

发布时间:2026/8/18 16:17:11

Node.js入门教程(二十九):util 模块
一、util 模块概述Node.js 中的util模块是一个核心模块提供了一系列实用工具函数。这些函数主要用于帮助开发者完成常见的编程任务如类型检查、继承实现、调试输出等。util模块的设计初衷是弥补 JavaScript 原生功能的不足为开发者提供更多便利。要使用util模块只需在代码中引入它const util require(util);二、主要功能分类功能分类说明主要方法类型检查精确判断数据类型util.types.*字符串格式化格式化输出util.format(),util.inspect()回调风格转换回调 ↔ Promise 互转util.promisify(),util.callbackify()继承工具原型继承util.inherits()调试工具调试输出util.debuglog(),util.inspect()废弃标记标记过时函数util.deprecate()三、类型检查工具util.types提供了一系列精确的类型检查方法比typeof和instanceof更加可靠。const util require(util); // ArrayBuffer 检查 const arrBuffer new ArrayBuffer(8); console.log(util.types.isArrayBuffer(arrBuffer)); // true console.log(util.types.isArrayBuffer([])); // false // Date 检查 console.log(util.types.isDate(new Date())); // true console.log(util.types.isDate(2023-01-01)); // false常用类型检查方法方法描述util.types.isArrayBuffer(value)检查是否为 ArrayBufferutil.types.isAsyncFunction(value)检查是否为异步函数util.types.isDate(value)检查是否为 Dateutil.types.isMap(value)检查是否为 Maputil.types.isSet(value)检查是否为 Setutil.types.isRegExp(value)检查是否为正则表达式util.types.isPromise(value)检查是否为 Promiseutil.types.isTypedArray(value)检查是否为 TypedArray四、实用工具函数util.format() - 字符串格式化类似于 C 语言中的printf函数用于格式化字符串。const util require(util); const name John; const age 30; console.log(util.format(My name is %s and I am %d years old, name, age)); // 输出: My name is John and I am 30 years old // 支持多种占位符 console.log(util.format(%s - %d - %j, string, 123, { key: value })); // 输出: string - 123 - {key:value}util.inspect() - 对象检查返回对象的字符串表示主要用于调试。可以配置深度、颜色等选项。const util require(util); const obj { name: Alice, details: { age: 25, hobbies: [reading, coding] } }; console.log(util.inspect(obj, { depth: 2, colors: true }));util.inspect 常用选项选项说明depth递归深度null表示无限colors是否使用颜色输出showHidden是否显示不可枚举属性compact是否压缩输出五、回调风格转换util.promisify() - 回调转 Promise将遵循 Node.js 回调风格的函数转换为返回 Promise 的函数。const util require(util); const fs require(fs); // 将回调风格的 fs.readFile 转换为返回 Promise 的函数 const readFile util.promisify(fs.readFile); async function readConfig() { try { const data await readFile(config.json, utf8); console.log(data); } catch (err) { console.error(Error reading file:, err); } } readConfig();util.callbackify() - Promise 转回调与promisify相反将返回 Promise 的函数转换为回调风格的函数。const util require(util); async function asyncFunc() { return Hello World; } const callbackFunc util.callbackify(asyncFunc); callbackFunc((err, result) { if (err) throw err; console.log(result); // Hello World });六、继承工具util.inherits() - 原型继承实现原型继承ES5 风格。注意在 ES6 中建议使用class和extends关键字代替。const util require(util); function Animal(name) { this.name name; } Animal.prototype.speak function() { console.log(this.name makes a noise.); }; function Dog(name) { Animal.call(this, name); } util.inherits(Dog, Animal); Dog.prototype.speak function() { console.log(this.name barks.); }; const d new Dog(Rex); d.speak(); // Rex barks.七、废弃标记util.deprecate() - 标记废弃函数包装函数使其被调用时发出弃用警告。const util require(util); const oldFunction util.deprecate( () { console.log(This function is deprecated); }, oldFunction is deprecated. Use newFunction instead. ); oldFunction(); // 输出: This function is deprecated // (Node.js 会显示弃用警告)八、实际应用场景1. 调试复杂对象当需要打印复杂对象的结构时util.inspect比简单的console.log更强大const util require(util); const complexObj { date: new Date(), regex: /test/g, nested: { array: [1, 2, 3], fn: function() {} } }; console.log(util.inspect(complexObj, { showHidden: true, depth: null, colors: true }));2. 现代化旧代码将回调风格的旧代码转换为 Promise 风格const util require(util); // 旧的回调风格代码 function oldStyleFunc(param, callback) { setTimeout(() { callback(null, Result for ${param}); }, 100); } // 转换为 Promise 风格 const newStyleFunc util.promisify(oldStyleFunc); async function useNewStyle() { const result await newStyleFunc(test); console.log(result); // Result for test } useNewStyle();3. 自定义对象检查可以自定义对象的inspect方法改变util.inspect的输出const util require(util); class CustomObject { constructor(value) { this.value value; } [util.inspect.custom](depth, options) { return CustomObject: ${this.value}; } } const obj new CustomObject(test); console.log(util.inspect(obj)); // CustomObject: test九、方法完整列表方法描述版本util.callbackify(original)Promise 转回调风格函数8.2.0util.debuglog(section)条件调试日志0.11.3util.deprecate(fn, msg[, code])标记废弃函数0.8.0util.format(format[, ...args])格式化字符串0.5.3util.formatWithOptions(inspectOptions, format[, ...args])带选项的格式化10.0.0util.getSystemErrorName(err)获取系统错误名称9.7.0util.inherits(constructor, superConstructor)原型继承0.3.0util.inspect(object[, options])对象字符串表示0.3.0util.isDeepStrictEqual(val1, val2)深度严格相等比较9.0.0util.promisify(original)回调转 Promise8.0.0util.stripVTControlCharacters(str)剥离 ANSI 转义码16.11.0util.parseArgs([config])命令行参数解析18.3.0util.types类型检查工具对象10.0.0十、注意事项注意事项说明性能考虑util.inspect对于大型对象可能有性能影响生产环境需谨慎使用API 稳定性某些 API 可能仍被标记为实验性功能现代替代方案util.inherits在现代 JavaScript 中可用class/extends替代错误处理使用promisify时需正确处理错误避免未捕获的 Promise 拒绝十一、本章小结知识点说明util 模块Node.js 内置实用工具模块类型检查util.types.*提供精确的类型判断字符串格式化util.format()和util.inspect()回调风格转换util.promisify()和util.callbackify()继承工具util.inherits()ES6 后推荐class/extends废弃标记util.deprecate()标记过时函数调试工具util.inspect()可自定义对象输出提示util.promisify是日常开发中最常用的方法它让你能够将大量基于回调的 Node.js 核心模块函数转换为返回 Promise 的函数从而与async/await完美配合。掌握util模块的使用可以让你的 Node.js 开发更加得心应手特别是在调试和代码转换方面。

相关新闻

房间里没装摄像头,Wi-Fi 凭什么知道“有人进来了“?ESP32 开源 CSI 工具包从零入门室内定位与人体检测

房间里没装摄像头,Wi-Fi 凭什么知道“有人进来了“?ESP32 开源 CSI 工具包从零入门室内定位与人体检测

2026/8/18 16:17:11

房间里没装摄像头,Wi-Fi 凭什么知道"有人进来了"?ESP32 开源 CSI 工具包从零入门室内定位与人体检测 【免费下载链接】esp-csi Applications based on Wi-Fi CSI (Channel state information), such as indoor positioning, human detection …

引导生成揭秘:AnyLanguageModel 如何约束本地模型输出合法 JSON

引导生成揭秘:AnyLanguageModel 如何约束本地模型输出合法 JSON

2026/8/18 16:17:11

引导生成揭秘:AnyLanguageModel 如何约束本地模型输出合法 JSON 【免费下载链接】AnyLanguageModel An API-compatible, drop-in replacement for Apples Foundation Models framework with support for custom language model providers. 项目地址: https://gitc…

Qwen3.8-27B-mxfp8工具调用教程:让多模态模型自动调用函数完成复杂任务

Qwen3.8-27B-mxfp8工具调用教程:让多模态模型自动调用函数完成复杂任务

2026/8/18 16:17:11

Qwen3.8-27B-mxfp8工具调用教程:让多模态模型自动调用函数完成复杂任务 【免费下载链接】Qwen3.8-27B-mxfp8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Qwen3.8-27B-mxfp8 Qwen3.8-27B-mxfp8工具调用教程来了!如果你正在寻找一…

cloudpan189-go分享与转存全攻略:创建、管理、转存分享链接一次搞定

cloudpan189-go分享与转存全攻略:创建、管理、转存分享链接一次搞定

2026/8/18 17:27:14

cloudpan189-go分享与转存全攻略:创建、管理、转存分享链接一次搞定 【免费下载链接】cloudpan189-go 天翼云盘命令行客户端(CLI),基于GO语言实现 项目地址: https://gitcode.com/gh_mirrors/cl/cloudpan189-go cloudpan189-go 是一款基于 GO 语言…

如何用Obsidian搭建个人神话知识库?希腊神话读书笔记的完整方法论

如何用Obsidian搭建个人神话知识库?希腊神话读书笔记的完整方法论

2026/8/18 17:27:14

如何用Obsidian搭建个人神话知识库?希腊神话读书笔记的完整方法论 【免费下载链接】graph-note-of-greek-myth 希腊神话读书笔记 项目地址: https://gitcode.com/gh_mirrors/gr/graph-note-of-greek-myth 你是否遇到过这样的困境:读完《伊利亚特》…

从源码构建 Edisyn:Makefile 编译与 jar 打包完整教程

从源码构建 Edisyn:Makefile 编译与 jar 打包完整教程

2026/8/18 17:27:14

从源码构建 Edisyn:Makefile 编译与 jar 打包完整教程 【免费下载链接】edisyn Synthesizer Patch Editor 项目地址: https://gitcode.com/gh_mirrors/ed/edisyn Edisyn 是一款功能强大的合成器音色编辑器(Synthesizer Patch Editor)&…

github-for-jira 安全机制解析:OAuth、JWT 与 Atlassian Connect 如何守护你的代码数据

github-for-jira 安全机制解析:OAuth、JWT 与 Atlassian Connect 如何守护你的代码数据

2026/8/18 17:27:14

github-for-jira 安全机制解析:OAuth、JWT 与 Atlassian Connect 如何守护你的代码数据 【免费下载链接】github-for-jira DEPRECATED (moved to private repository) - Connect your code with your project management in Jira 项目地址: https://gitcode.com/g…

AI安全测试平台CyberStrikeAI实战指南:如何把三天手工渗透压缩到三小时

AI安全测试平台CyberStrikeAI实战指南:如何把三天手工渗透压缩到三小时

2026/8/18 17:27:14

AI安全测试平台CyberStrikeAI实战指南:如何把三天手工渗透压缩到三小时 【免费下载链接】CyberStrikeAI The system of action for AI-native cybersecurity—where intent becomes governed execution, evidence becomes operational memory, and every operation …

EcommerceAPI的GraphQL网关深入:gqlgen代码生成与多服务Schema聚合原理

EcommerceAPI的GraphQL网关深入:gqlgen代码生成与多服务Schema聚合原理

2026/8/18 17:17:14

EcommerceAPI的GraphQL网关深入:gqlgen代码生成与多服务Schema聚合原理 【免费下载链接】EcommerceAPI Modular e-commerce backend with a GraphQL gateway and gRPC microservices for accounts, products, orders, payments, and recommendations. 项目地址: h…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/17 1:28:42

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/18 1:03:22

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/17 8:40:51

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

多智能体大模型辩论中的立场收敛:从伪共识到理性说服的评估方法

多智能体大模型辩论中的立场收敛:从伪共识到理性说服的评估方法

2026/8/18 0:06:29

1. 从一场“假辩论”说起:为什么大模型辩论会走向“伪共识”?最近在折腾多智能体大语言模型(Multi-Agent LLM)的辩论实验,发现一个挺有意思的现象。我让几个基于GPT-4的智能体就一个争议性话题(比如“远程办…

Frida动态代码插桩框架:从原理到实战的移动安全与逆向工程指南

Frida动态代码插桩框架:从原理到实战的移动安全与逆向工程指南

2026/8/18 0:06:29

1. 从“黑盒”到“白盒”:为什么我们需要Frida在移动安全、逆向工程甚至是一些自动化测试的场景里,我们经常会遇到一个让人头疼的问题:面对一个编译好的、没有源代码的应用程序,我们如何知道它在运行时内部发生了什么?…

ECharts饼图中心文字配置指南:从label与title区别到动态交互实现

ECharts饼图中心文字配置指南:从label与title区别到动态交互实现

2026/8/18 0:06:29

1. 从“空心”到“有魂”:为什么要在饼图中间加文字?如果你用过ECharts画饼图,大概率会注意到一个现象:默认生成的饼图中间是空心的。这个设计本身没问题,它清晰地展示了各个扇区的占比关系。但在很多实际的业务场景里…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…