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();
相关推荐
网络点点滴12 小时前
简述Node.js运行时核心架构
架构·node.js
小粉粉hhh13 小时前
Node.js(三)——模块化
node.js
晓杰'14 小时前
从0到1实现 Balatro 游戏后端(1):项目规划与牌型判断实现
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
@PHARAOH14 小时前
WHAT - npm和corepack
前端·npm·node.js
MPGWJPMTJT14 小时前
从 Volta 迁移到 mise:Windows 下 Node 版本管理切换记录
前端·node.js
zhangfeng113315 小时前
Remotion 渲染视频脚本 ,自动化编辑视频 Node.js 层面是“单线程 JS”,但在实际渲染时是“高度并行”的。
node.js·自动化·音视频
羽师16 小时前
Node.js和npx关系
node.js
灵魂学者16 小时前
使用 Electron 打包项目构建 .EXE 桌面应用程序(简)
electron·node.js·vue·build·桌面应用程序
右耳朵猫AI16 小时前
Node.js技术周刊 2026年第14周
node.js
gogoing1 天前
Node.js 模块查找策略(require 完整流程)
javascript·node.js