util工具模块
1、util模块概述
util模块是Node.js的内置模块,它提供了常用方法的集合,这主要是为了弥补核心JavaScript功能过于精简的不足,该模块的主要目的是满足Node.js内部API的需求。引用util模块的语法格式如下:
js
const util=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()方法,用来对字符串进行格式化,其语法格式如下:
js
util.format(format, [...])
参数format是包含零个或多个占位符的字符串,每个占位符都是以一个%字符开始,并最终被对应的参数转换的字符串值取代。format方法支持的占位符有以下类型。
%s:指定字符串。%d:指定数值。%i:转换为整数。%f:转换为小数。%j:转换为JSON字符串。%o:转换为具有通用JavaScript对象格式的字符串表示形式,与util.inspect()类似,它显示了完整的对象以及不可枚举的属性。%O:与%o相似,但没有选项,它不包含不可枚举的属性。%%:输出%。- 返回值:格式化后的字符串。
js
const util=require("util")
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
showName() {
return this.name;
}
}
let man = new Person('老张', 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()方法,用于将任意对象转换为字符串,该方法通常用于调试和错误输出,其语法格式如下:
js
util.inspect(object[, showHidden[, depth[, colors]]])
- depth:展开层级(null表示无限)
- colors:启用颜色
- showHidden:显示不可枚举属性
其中,参数object是必需的参数,用来指定一个对象;参数showHidden为true时,将会显示更多的关于object对象的隐藏信息;参数depth表示最大递归层数,用于对象比较复杂时指定对象的递归层数;参数colors的值若为true,表示输出格式将会以ANSI颜色编码,通常用于在终端上显示更漂亮的效果。
js
const util=require("util")
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
showName() {
return this.name;
}
}
let man = new Person('老张', 60);
console.log(util.inspect(man));
console.log(util.inspect(man, true));
Person { name: '老张', age: 60 }
Person { name: '老张', age: 60 }
2.3、实现对象间的原型继承
util模块提供了一个inherits()方法,用于实现对象间的原型继承,其语法格式如下:
js
util.inherits(constructor, superConstructor)
参数constructor表示要从原型继承的任何对象,参数superConstructor表示要继承的原型对象。
js
var util = require('util');
function par() {
this.name = '老张';
this.age = 60;
this.say = function () {
console.log(this.name + "今年" + this.age + "岁");
};
}
par.prototype.showName = function () {
console.log("我是" + this.name);
};
function ch() {
this.name = '小张';
}
util.inherits(ch, par);
var objBase = new par();
objBase.showName();
objBase.say();
console.log(objBase);
var objSub = new ch();
objSub.showName();
console.log(objSub);
js
我是老张
老张今年60岁
par { name: '老张', age: 60, say: [Function (anonymous)] }
我是小张
ch { name: '小张' }
通过上面的结果可以看出,ch仅继承了par在原型中定义的函数,而构造函数内部的age属性、say函数都没有被继承,这一点大家使用时要注意。
2.4、转换异步函数的风格
util模块中的callbackify()方法可以将async异步函数(或者一个返回值为Promise的函数)转换成遵循错误优先回调风格的函数,其语法格式如下:
js
util.callbackify(async_function)
参数async_function表示原始的async异步函数,该方法的返回值是一个以错误优先回调风格返回的Promise函数,基本形式为(err,ret)=>{},第一个参数是错误原因。
例如,定义一个异步函数fn,使用util模块的callbackify()对其进行风格转换,然后执行转换风格后的异步函数,其中传入一个错误优先风格的回调函数function(err,ret)。代码如下:
js
const util = require('util');
async function fn() {
return '这是一个函数';
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret)=>{
if (err) throw err;
console.log(ret);
});
这是一个函数
2.5、判断是否为指定类型的内置对象
除了上面常用的一些方法,util模块中还提供了一个types类型,通过调用该类型的一些方法,可以为不同类型的内置对象提供类型检查。常用的类型检查方法如下。
util.types.isAnyArrayBuffer(value):判断value是否为内置的ArrayBuffer或SharedArrayBuffer实例。
js
const util = require('util')
console.log(util.types.isAnyArrayBuffer(new ArrayBuffer()));
console.log(util.types.isAnyArrayBuffer(new SharedArrayBuffer()));
true
true
util.types.isArrayBufferView(value):判断value是否为ArrayBuffer视图的实例。
js
const util = require('util')
console.log(util.types.isArrayBufferView(new Int8Array())); //true
console.log(util.types.isArrayBufferView(Buffer.from('你好'))); //true
console.log(util.types.isArrayBufferView(new ArrayBuffer())); //false
util.types.isArrayBuffer(value):判断value是否为内置的ArrayBuffer实例。
js
const util = require('util');
console.log(util.types.isArrayBuffer(new ArrayBuffer())); //true
console.log(util.types.isArrayBuffer(new SharedArrayBuffer())); //false
util.types.isAsyncFunction(value):判断value是否为异步函数。
js
const util = require('util');
console.log(util.types.isAsyncFunction(function func(){})); //false
console.log(util.types.isAsyncFunction(async function func(){})); //true
util.types.isBooleanObject(value):判断value是否为布尔类型。
js
const util = require('util')
console.log(util.types.isBooleanObject(false)); //false
console.log(util.types.isBooleanObject("false")); //false
console.log(util.types.isBooleanObject(new Boolean(false))); //true
console.log(util.types.isBooleanObject(new Boolean(true))); //true
console.log(util.types.isBooleanObject(Boolean(false))); //false
util.types.isBoxedPrimitive(value):判断value是否为原始对象,如new Boolean()、new String()等。
js
const util = require('util')
console.log(util.types.isBoxedPrimitive(new Boolean(false))); //true
console.log(util.types.isBoxedPrimitive(new String("string"))); //true
console.log(util.types.isBoxedPrimitive("string")); //false
util.types.isDate(value):判断value是否为Date的实例。
js
const util = require('util');
console.log(util.types.isDate(new Date())); //true
console.log(util.types.isDate(new Date(2023,6,18))); //true
util.types.isNumberObject(value):判断value是否为Number对象。
js
const util = require('util');
console.log(util.types.isNumberObject(0)); //false
console.log(util.types.isNumberObject(new Number())); //true
console.log(util.types.isNumberObject(new Number(0))); //true
util.types.isRegExp(value):判断value是否为一个正则表达式。
js
const util = require('util');
console.log(util.types.isRegExp(/^\w+$/)); //true
console.log(util.types.isRegExp(new RegExp('abc'))); //true
util.types.isStringObject(value):判断value是否为一个String对象。
js
const util = require('util');
console.log(util.types.isStringObject('string')); //false
console.log(util.types.isStringObject(new String('string'))); //true
2.6、其它方法
Node.js 回调风格函数 转为 Promise:
js
const fs = require('fs');
const readFileAsync = util.promisify(fs.readFile);
async function run() {
const data = await readFileAsync('./test.txt', 'utf8');
console.log(data);
}
run();
标记废弃方法:
js
function oldApi() {
console.log('old api');
}
const newApi = util.deprecate(oldApi, 'oldApi is deprecated, use newApi instead');
newApi();