Node.js——util工具模块

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 回调风格函数 转为 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()方法,用来对字符串进行格式化,其语法格式如下:

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();
相关推荐
笑笑先生3 小时前
从接口搬运工到研发控制平面,BFF 到底在解决什么?
前端·架构·node.js
www_stdio3 小时前
🚀 从 Event Loop 到 AI Agent:我的 Node.js 全栈进阶之路
前端·node.js·nestjs
吴声子夜歌3 小时前
Node.js——fs文件系统模块
node.js
吴声子夜歌4 小时前
Node.js——全局对象和模块
node.js
fxshy4 小时前
前端直连模型 vs 完整 MCP:大模型驱动地图的原理与实践(技术栈Vue + Cesium + Node.js + WebSocket + MCP)
前端·vue.js·node.js·cesium·mcp
2501_921649494 小时前
WebSocket 金融实时行情推送 API 实战解析:低延迟、高可用架构设计与落地
websocket·网络协议·金融·node.js
hljqwb4 小时前
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南
node.js
吴声子夜歌4 小时前
Node.js——事件的监听与触发
node.js
面包爱阜阳4 小时前
使用 GitHub 和 Vercel 部署个人网站
node.js·github