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 回调风格函数 转为 Promiseutil.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 trueutil.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()));//falseutil.types.isArrayBuffer(value):判断value是否为内置的ArrayBuffer实例。
constutil=require('util');console.log(util.types.isArrayBuffer(newArrayBuffer()));//trueconsole.log(util.types.isArrayBuffer(newSharedArrayBuffer()));//falseutil.types.isAsyncFunction(value):判断value是否为异步函数。
constutil=require('util');console.log(util.types.isAsyncFunction(functionfunc(){}));//falseconsole.log(util.types.isAsyncFunction(asyncfunctionfunc(){}));//trueutil.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)));//falseutil.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"));//falseutil.types.isDate(value):判断value是否为Date的实例。
constutil=require('util');console.log(util.types.isDate(newDate()));//trueconsole.log(util.types.isDate(newDate(2023,6,18)));//trueutil.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)));//trueutil.types.isRegExp(value):判断value是否为一个正则表达式。
constutil=require('util');console.log(util.types.isRegExp(/^\w+$/));//trueconsole.log(util.types.isRegExp(newRegExp('abc')));//trueutil.types.isStringObject(value):判断value是否为一个String对象。
constutil=require('util');console.log(util.types.isStringObject('string'));//falseconsole.log(util.types.isStringObject(newString('string')));//true2.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();