一、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 开发更加得心应手特别是在调试和代码转换方面。