
util模塊是 Node.js 的一個(gè)內(nèi)置模塊包含了實(shí)用工具函數(shù)用于支持 JavaScript 編程中的調(diào)試、錯(cuò)誤處理、格式化等功能。util提供常用函數(shù)的集合用于彌補(bǔ)核心 JavaScript 的功能過(guò)于精簡(jiǎn)的不足。util模塊中的功能涵蓋了從對(duì)象檢查、繼承到格式化字符串等多個(gè)方面。導(dǎo)入 util 模塊首先你需要導(dǎo)入 util 模塊const util require(util);常用方法方法描述util.format(format, ...args)字符串格式化支持%s、%d、%j占位符。util.inspect(object[, options])將對(duì)象轉(zhuǎn)換為字符串用于調(diào)試。util.promisify(function)將回調(diào)風(fēng)格的函數(shù)轉(zhuǎn)換為返回 Promise 的函數(shù)。util.callbackify(fn)將返回 Promise 的函數(shù)轉(zhuǎn)換為回調(diào)風(fēng)格函數(shù)。util.inherits(constructor, superConstructor)讓一個(gè)構(gòu)造函數(shù)繼承另一個(gè)構(gòu)造函數(shù)的原型方法。util.deprecate(fn, message)標(biāo)記函數(shù)為廢棄調(diào)用時(shí)會(huì)打印警告消息。util.types包含多種類型檢測(cè)方法的集合例如isAnyArrayBuffer、isBigInt64Array。util.isDeepStrictEqual(val1, val2)判斷兩個(gè)值是否深度相等類似于深度比較。util.getSystemErrorName(err)根據(jù)錯(cuò)誤碼返回系統(tǒng)錯(cuò)誤名稱。util.inspect.custom一個(gè) Symbol可以定義自定義的inspect行為用于調(diào)試。util.types 下的類型檢測(cè)方法util.types 是一個(gè)包含許多類型檢測(cè)方法的集合擴(kuò)展了 JavaScript 的 typeof 和 instanceof。方法描述util.types.isAnyArrayBuffer(value)檢查值是否為ArrayBuffer或SharedArrayBuffer。util.types.isArrayBuffer(value)檢查值是否為ArrayBuffer。util.types.isAsyncFunction(value)檢查值是否為異步函數(shù)。util.types.isBigInt64Array(value)檢查值是否為BigInt64Array。util.types.isBigUint64Array(value)檢查值是否為BigUint64Array。util.types.isBooleanObject(value)檢查值是否為布爾對(duì)象。util.types.isDataView(value)檢查值是否為DataView。util.types.isDate(value)檢查值是否為Date。util.types.isGeneratorFunction(value)檢查值是否為生成器函數(shù)。util.types.isMap(value)檢查值是否為Map。util.types.isSet(value)檢查值是否為Set。util.types.isRegExp(value)檢查值是否為正則表達(dá)式。util.types.isSymbolObject(value)檢查值是否為符號(hào)對(duì)象。應(yīng)用實(shí)例util.format() - 字符串格式化util.format() 用于生成格式化字符串支持占位符如 %s、%d 和 %j分別代表字符串、數(shù)字和 JSON。實(shí)例const util require(util);const name Alice;const age 25;console.log(util.format(Name: %s, Age: %d, name, age)); // 輸出: Name: Alice, Age: 25util.promisify() - 轉(zhuǎn)換回調(diào)函數(shù)為 Promiseutil.promisify() 將傳統(tǒng)回調(diào)風(fēng)格的函數(shù)轉(zhuǎn)換為返回 Promise 的函數(shù)從而可以與 async/await 一起使用。實(shí)例const util require(util);const fs require(fs);// 將回調(diào)風(fēng)格的 fs.readFile 轉(zhuǎn)換為返回 Promise 的函數(shù)const readFileAsync util.promisify(fs.readFile);(async () {try {const data await readFileAsync(example.txt, utf8);console.log(data);} catch (err) {console.error(err);}})();util.callbackify() - 將 Promise 轉(zhuǎn)換為回調(diào)util.callbackify() 將返回 Promise 的函數(shù)轉(zhuǎn)換為回調(diào)風(fēng)格的函數(shù)便于在需要回調(diào)的代碼環(huán)境中使用。util.callbackify(original) 將async異步函數(shù)或者一個(gè)返回值為Promise的函數(shù)轉(zhuǎn)換成遵循異常優(yōu)先的回調(diào)風(fēng)格的函數(shù)例如將(err, value) ...回調(diào)作為最后一個(gè)參數(shù)。 在回調(diào)函數(shù)中第一個(gè)參數(shù)為拒絕的原因如果Promise解決則為null第二個(gè)參數(shù)則是解決的值。實(shí)例const util require(util);async function fn() {return hello world;}const callbackFunction util.callbackify(fn);callbackFunction((err, ret) {if (err) throw err;console.log(ret);});以上代碼輸出結(jié)果為hello world回調(diào)函數(shù)是異步執(zhí)行的并且有異常堆棧錯(cuò)誤追蹤。 如果回調(diào)函數(shù)拋出一個(gè)異常進(jìn)程會(huì)觸發(fā)一個(gè) uncaughtException 異常如果沒(méi)有被捕獲進(jìn)程將會(huì)退出。null 在回調(diào)函數(shù)中作為一個(gè)參數(shù)有其特殊的意義如果回調(diào)函數(shù)的首個(gè)參數(shù)為 Promise 拒絕的原因且?guī)в蟹祷刂登抑悼梢赞D(zhuǎn)換成布爾值 false這個(gè)值會(huì)被封裝在 Error 對(duì)象里可以通過(guò)屬性 reason 獲取。function fn() { return Promise.reject(null); } const callbackFunction util.callbackify(fn); callbackFunction((err, ret) { // 當(dāng) Promise 被以 null 拒絕時(shí)它被包裝為 Error 并且原始值存儲(chǔ)在 reason 中。 err err.hasOwnProperty(reason) err.reason null; // true });original 為 async 異步函數(shù)。該函數(shù)返回傳統(tǒng)回調(diào)函數(shù)。util.deprecate() - 標(biāo)記函數(shù)為廢棄util.deprecate() 用于標(biāo)記不推薦使用的函數(shù)調(diào)用時(shí)會(huì)顯示警告信息。實(shí)例const util require(util);const oldFunction util.deprecate(() {console.log(This function is deprecated);}, oldFunction is deprecated. Use newFunction instead.);oldFunction(); // 調(diào)用時(shí)會(huì)顯示警告util.types - 數(shù)據(jù)類型檢測(cè)util.types 提供了一組方法來(lái)檢測(cè)特定數(shù)據(jù)類型擴(kuò)展了 typeof 和 instanceof 的功能。實(shí)例const util require(util);console.log(util.types.isDate(new Date())); // trueconsole.log(util.types.isMap(new Map())); // trueutil.inheritsutil.inherits(constructor, superConstructor) 是一個(gè)實(shí)現(xiàn)對(duì)象間原型繼承的函數(shù)。JavaScript 的面向?qū)ο筇匦允腔谠偷呐c常見的基于類的不同。JavaScript 沒(méi)有提供對(duì)象繼承的語(yǔ)言級(jí)別特性而是通過(guò)原型復(fù)制來(lái)實(shí)現(xiàn)的。在這里我們只介紹 util.inherits 的用法示例如下var util require(util); function Base() { this.name base; this.base 1991; this.sayHello function() { console.log(Hello this.name); }; } Base.prototype.showName function() { console.log(this.name); }; function Sub() { this.name sub; } util.inherits(Sub, Base); var objBase new Base(); objBase.showName(); objBase.sayHello(); console.log(objBase); var objSub new Sub(); objSub.showName(); //objSub.sayHello(); console.log(objSub);我們定義了一個(gè)基礎(chǔ)對(duì)象 Base 和一個(gè)繼承自 Base 的 SubBase 有三個(gè)在構(gòu)造函數(shù)內(nèi)定義的屬性和一個(gè)原型中定義的函數(shù)通過(guò)util.inherits 實(shí)現(xiàn)繼承。運(yùn)行結(jié)果如下base Hello base { name: base, base: 1991, sayHello: [Function] } sub { name: sub }注意Sub 僅僅繼承了Base 在原型中定義的函數(shù)而構(gòu)造函數(shù)內(nèi)部創(chuàng)造的 base 屬 性和 sayHello 函數(shù)都沒(méi)有被 Sub 繼承。同時(shí)在原型中定義的屬性不會(huì)被 console.log 作 為對(duì)象的屬性輸出。如果我們?nèi)サ?objSub.sayHello(); 這行的注釋將會(huì)看到node.js:201 throw e; // process.nextTick error, or error event on first tick ^ TypeError: Object #lt;Subgt; has no method sayHello at Object.lt;anonymousgt; (/home/byvoid/utilinherits.js:29:8) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)注意在 ES6 出現(xiàn)之前util.inherits 是 Node.js 中實(shí)現(xiàn)繼承的主要方法。但是ES6 之后推薦使用 class 和 extends 語(yǔ)法這樣繼承的代碼更具可讀性。util.inspect() - 打印對(duì)象結(jié)構(gòu)util.inspect(object[, options])將對(duì)象轉(zhuǎn)換為字符串表示形式便于調(diào)試。util.inspect() 將對(duì)象轉(zhuǎn)換為字符串形式常用于調(diào)試以查看對(duì)象的詳細(xì)結(jié)構(gòu)和屬性??梢灾付?options 參數(shù)來(lái)控制輸出格式。實(shí)例const obj { a: 1, b: 2, c: { d: 3 } };console.log(util.inspect(obj, { showHidden: false, depth: null, colors: true }));util.isArray(object)如果給定的參數(shù) object 是一個(gè)數(shù)組返回 true否則返回 false。var util require(util); util.isArray([]) // true util.isArray(new Array) // true util.isArray({}) // falseutil.isRegExp(object)如果給定的參數(shù) object 是一個(gè)正則表達(dá)式返回true否則返回false。var util require(util); util.isRegExp(/some regexp/) // true util.isRegExp(new RegExp(another regexp)) // true util.isRegExp({}) // falseutil.isDate(object)如果給定的參數(shù) object 是一個(gè)日期返回true否則返回false。var util require(util); util.isDate(new Date()) // true util.isDate(Date()) // false (without new returns a String) util.isDate({}) // false