当前位置: 首页 > news >正文

Node.js——util工具模块

util工具模块

    • 1、util模块概述
    • 2、util模块的使用
      • 2.1、格式化输出字符串
      • 2.2、将对象转换为字符串(调试)
      • 2.3、实现对象间的原型继承
      • 2.4、转换异步函数的风格
      • 2.5、判断是否为指定类型的内置对象
      • 2.6、其它方法

1、util模块概述

util模块是Node.js的内置模块,它提供了常用方法的集合,这主要是为了弥补核心JavaScript功能过于精简的不足,该模块的主要目的是满足Node.js内部API的需求。引用util模块的语法格式如下:

constutil=require('util')

util模块的常用方法和功能:

  • util.format():字符串格式化
  • util.inspect():将任意对象转换为字符串,对象深度查看(调试神器)
  • util.promisify():将 Node.js 回调风格函数​ 转为 Promise
  • util.callbackify():Promise → 回调
  • util.types:精准类型判断
  • util.deprecate():标记废弃方法
  • util.inherits():用于实现原型继承(已不推荐)
  • util.isDeepStrictEqual(a, b):深度严格比较(替代 assert.deepStrictEqual)
  • util.getSystemErrorName(errno):获取系统错误名

2、util模块的使用

2.1、格式化输出字符串

util模块提供了format()方法,用来对字符串进行格式化,其语法格式如下:

util.format(format,[...])

参数format是包含零个或多个占位符的字符串,每个占位符都是以一个%字符开始,并最终被对应的参数转换的字符串值取代。format方法支持的占位符有以下类型。

  • %s:指定字符串。
  • %d:指定数值。
  • %i:转换为整数。
  • %f:转换为小数。
  • %j:转换为JSON字符串。
  • %o:转换为具有通用JavaScript对象格式的字符串表示形式,与util.inspect()类似,它显示了完整的对象以及不可枚举的属性。
  • %O:与%o相似,但没有选项,它不包含不可枚举的属性。
  • %%:输出%。
  • 返回值:格式化后的字符串。
constutil=require("util")classPerson{constructor(name,age){this.name=name;this.age=age;}showName(){returnthis.name;}}letman=newPerson('老张',60);console.log(util.format("%d+%d=%d",50,70,50+70))console.log(util.format("字符串:%s",man.showName()));console.log(util.format("整数:%i",26.01))console.log(util.format("小数:%f","26.01"))console.log(util.format("百分数:%d%%","26"))console.log(util.format("对象格式化为JSON:%j",man))
50+70=120 字符串:老张 整数:26 小数:26.01 百分数:26% 对象格式化为JSON:{"name":"老张","age":60}

2.2、将对象转换为字符串(调试)

util模块提供了一个inspect()方法,用于将任意对象转换为字符串,该方法通常用于调试和错误输出,其语法格式如下:

util.inspect(object[,showHidden[,depth[,colors]]])
  • depth:展开层级(null表示无限)
  • colors:启用颜色
  • showHidden:显示不可枚举属性

其中,参数object是必需的参数,用来指定一个对象;参数showHidden为true时,将会显示更多的关于object对象的隐藏信息;参数depth表示最大递归层数,用于对象比较复杂时指定对象的递归层数;参数colors的值若为true,表示输出格式将会以ANSI颜色编码,通常用于在终端上显示更漂亮的效果。

constutil=require("util")classPerson{constructor(name,age){this.name=name;this.age=age;}showName(){returnthis.name;}}letman=newPerson('老张',60);console.log(util.inspect(man));console.log(util.inspect(man,true));
Person { name: '老张', age: 60 } Person { name: '老张', age: 60 }

2.3、实现对象间的原型继承

util模块提供了一个inherits()方法,用于实现对象间的原型继承,其语法格式如下:

util.inherits(constructor,superConstructor)

参数constructor表示要从原型继承的任何对象,参数superConstructor表示要继承的原型对象。

varutil=require('util');functionpar(){this.name='老张';this.age=60;this.say=function(){console.log(this.name+"今年"+this.age+"岁");};}par.prototype.showName=function(){console.log("我是"+this.name);};functionch(){this.name='小张';}util.inherits(ch,par);varobjBase=newpar();objBase.showName();objBase.say();console.log(objBase);varobjSub=newch();objSub.showName();console.log(objSub);
我是老张 老张今年60岁 par{name:'老张',age:60,say:[Function(anonymous)]}我是小张 ch{name:'小张'}

通过上面的结果可以看出,ch仅继承了par在原型中定义的函数,而构造函数内部的age属性、say函数都没有被继承,这一点大家使用时要注意。

2.4、转换异步函数的风格

util模块中的callbackify()方法可以将async异步函数(或者一个返回值为Promise的函数)转换成遵循错误优先回调风格的函数,其语法格式如下:

util.callbackify(async_function)

参数async_function表示原始的async异步函数,该方法的返回值是一个以错误优先回调风格返回的Promise函数,基本形式为(err,ret)=>{},第一个参数是错误原因。

例如,定义一个异步函数fn,使用util模块的callbackify()对其进行风格转换,然后执行转换风格后的异步函数,其中传入一个错误优先风格的回调函数function(err,ret)。代码如下:

constutil=require('util');asyncfunctionfn(){return'这是一个函数';}constcallbackFunction=util.callbackify(fn);callbackFunction((err,ret)=>{if(err)throwerr;console.log(ret);});
这是一个函数

2.5、判断是否为指定类型的内置对象

除了上面常用的一些方法,util模块中还提供了一个types类型,通过调用该类型的一些方法,可以为不同类型的内置对象提供类型检查。常用的类型检查方法如下。

  • util.types.isAnyArrayBuffer(value):判断value是否为内置的ArrayBuffer或SharedArrayBuffer实例。
constutil=require('util')console.log(util.types.isAnyArrayBuffer(newArrayBuffer()));console.log(util.types.isAnyArrayBuffer(newSharedArrayBuffer()));
true true
  • util.types.isArrayBufferView(value):判断value是否为ArrayBuffer视图的实例。
constutil=require('util')console.log(util.types.isArrayBufferView(newInt8Array()));//trueconsole.log(util.types.isArrayBufferView(Buffer.from('你好')));//trueconsole.log(util.types.isArrayBufferView(newArrayBuffer()));//false
  • util.types.isArrayBuffer(value):判断value是否为内置的ArrayBuffer实例。
constutil=require('util');console.log(util.types.isArrayBuffer(newArrayBuffer()));//trueconsole.log(util.types.isArrayBuffer(newSharedArrayBuffer()));//false
  • util.types.isAsyncFunction(value):判断value是否为异步函数。
constutil=require('util');console.log(util.types.isAsyncFunction(functionfunc(){}));//falseconsole.log(util.types.isAsyncFunction(asyncfunctionfunc(){}));//true
  • util.types.isBooleanObject(value):判断value是否为布尔类型。
constutil=require('util')console.log(util.types.isBooleanObject(false));//falseconsole.log(util.types.isBooleanObject("false"));//falseconsole.log(util.types.isBooleanObject(newBoolean(false)));//trueconsole.log(util.types.isBooleanObject(newBoolean(true)));//trueconsole.log(util.types.isBooleanObject(Boolean(false)));//false
  • util.types.isBoxedPrimitive(value):判断value是否为原始对象,如new Boolean()、new String()等。
constutil=require('util')console.log(util.types.isBoxedPrimitive(newBoolean(false)));//trueconsole.log(util.types.isBoxedPrimitive(newString("string")));//trueconsole.log(util.types.isBoxedPrimitive("string"));//false
  • util.types.isDate(value):判断value是否为Date的实例。
constutil=require('util');console.log(util.types.isDate(newDate()));//trueconsole.log(util.types.isDate(newDate(2023,6,18)));//true
  • util.types.isNumberObject(value):判断value是否为Number对象。
constutil=require('util');console.log(util.types.isNumberObject(0));//falseconsole.log(util.types.isNumberObject(newNumber()));//trueconsole.log(util.types.isNumberObject(newNumber(0)));//true
  • util.types.isRegExp(value):判断value是否为一个正则表达式。
constutil=require('util');console.log(util.types.isRegExp(/^\w+$/));//trueconsole.log(util.types.isRegExp(newRegExp('abc')));//true
  • util.types.isStringObject(value):判断value是否为一个String对象。
constutil=require('util');console.log(util.types.isStringObject('string'));//falseconsole.log(util.types.isStringObject(newString('string')));//true

2.6、其它方法

Node.js 回调风格函数​ 转为 Promise:

constfs=require('fs');constreadFileAsync=util.promisify(fs.readFile);asyncfunctionrun(){constdata=awaitreadFileAsync('./test.txt','utf8');console.log(data);}run();

标记废弃方法:

functionoldApi(){console.log('old api');}constnewApi=util.deprecate(oldApi,'oldApi is deprecated, use newApi instead');newApi();
http://www.cnnetsun.cn/news/1608623.html

相关文章:

  • Wan2.2-T2V-A5B新手教程:跟着步骤走,轻松玩转文本生成视频
  • ai赋能开发:在快马平台获得比devc++更智能的c++代码编写与调试体验
  • DeepSeek总结的plan_cache_mode 的隐藏行为
  • 在Windows 10上运行Android应用:Windows Subsystem for Android完整指南
  • 别光写控制台!给C++飞机订票系统加个简易图形界面(基于EasyX库)
  • Ostrakon-VL-8B环境部署教程:8-bit Retro UI免配置启动
  • TDOA三维定位实现——基于加权最小二乘法的MATLAB例程
  • 【Altium Designer2025】EDA软件新特性解析:从PCB设计到FPGA开发的全面升级
  • Redis RDB文件全解析指南:从数据提取到存储优化
  • 用C语言手把手实现Clock页面置换算法(附完整代码和避坑指南)
  • 3分钟轻松安装:BetterNCM Installer网易云插件管理器终极指南
  • 程序员副业图谱:从入门到变现,全维度实战指南(2026最新版)
  • 英飞凌TC3xx芯片功能安全开发避坑指南:手把手教你集成safeTpackage(含多核启动时序)
  • Linux桌面自动化引擎:xdotool从入门到专家的全栈实践指南
  • 攻克开源软件中文路径支持难题:5个步骤实现Calibre完美兼容
  • Vision Transformer——打破CNN垄断的视觉革命先锋
  • OrigamiSimulator:让数字折纸创作触手可及的WebGL工具指南
  • 扩散模型之(十八)ControlNet 原理与指南
  • Pixel Aurora Engine基础教程:Streamlit前端交互逻辑与后端diffusers集成
  • TouchGal完整指南:一站式Galgame文化社区的终极解决方案
  • 3步实战:Redoc CLI终极指南,让API文档自动化成为现实
  • ACM LaTeX模板中CCSXML填写的3个常见错误及解决方法(附最新官方指南)
  • HunyuanVideo-Foley 赋能短视频创作:AI自动生成背景音效与BGM
  • 告别玄学调参!手把手教你用TL431+PC817搞定反激电源反馈环路(附动态补偿设计)
  • YY/T0681.15与ASTM D4169 DC13包装运输测试标准俩者区别在于
  • Orange在法国铁路连接质量测试中表现领先
  • 别再手动整理会议纪要了!用FunASR搭个带权限管理的内部转写工具(支持热词定制)
  • 告别Sobel和Canny!用Python实现光照不敏感的相位一致性特征提取(附完整代码)
  • 256K上下文颠覆智能编程:Qwen3-Coder重构全栈开发效率范式
  • 别再到处找教程了!Visual Studio 2022 + GLFW + GLAD 配置 OpenGL 开发环境(Win10 保姆级指南)