
util模塊是 Node.js 的一個內置模塊包含了實用工具函數用于支持 JavaScript 編程中的調試、錯誤處理、格式化等功能。util提供常用函數的集合用于彌補核心 JavaScript 的功能過于精簡的不足。util模塊中的功能涵蓋了從對象檢查、繼承到格式化字符串等多個方面。導入 util 模塊首先你需要導入 util 模塊const util require(util);常用方法方法描述util.format(format, ...args)字符串格式化支持%s、%d、%j占位符。util.inspect(object[, options])將對象轉換為字符串用于調試。util.promisify(function)將回調風格的函數轉換為返回 Promise 的函數。util.callbackify(fn)將返回 Promise 的函數轉換為回調風格函數。util.inherits(constructor, superConstructor)讓一個構造函數繼承另一個構造函數的原型方法。util.deprecate(fn, message)標記函數為廢棄調用時會打印警告消息。util.types包含多種類型檢測方法的集合例如isAnyArrayBuffer、isBigInt64Array。util.isDeepStrictEqual(val1, val2)判斷兩個值是否深度相等類似于深度比較。util.getSystemErrorName(err)根據錯誤碼返回系統錯誤名稱。util.inspect.custom一個 Symbol可以定義自定義的inspect行為用于調試。util.types 下的類型檢測方法util.types 是一個包含許多類型檢測方法的集合擴展了 JavaScript 的 typeof 和 instanceof。方法描述util.types.isAnyArrayBuffer(value)檢查值是否為ArrayBuffer或SharedArrayBuffer。util.types.isArrayBuffer(value)檢查值是否為ArrayBuffer。util.types.isAsyncFunction(value)檢查值是否為異步函數。util.types.isBigInt64Array(value)檢查值是否為BigInt64Array。util.types.isBigUint64Array(value)檢查值是否為BigUint64Array。util.types.isBooleanObject(value)檢查值是否為布爾對象。util.types.isDataView(value)檢查值是否為DataView。util.types.isDate(value)檢查值是否為Date。util.types.isGeneratorFunction(value)檢查值是否為生成器函數。util.types.isMap(value)檢查值是否為Map。util.types.isSet(value)檢查值是否為Set。util.types.isRegExp(value)檢查值是否為正則表達式。util.types.isSymbolObject(value)檢查值是否為符號對象。應用實例util.format() - 字符串格式化util.format() 用于生成格式化字符串支持占位符如 %s、%d 和 %j分別代表字符串、數字和 JSON。實例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() - 轉換回調函數為 Promiseutil.promisify() 將傳統回調風格的函數轉換為返回 Promise 的函數從而可以與 async/await 一起使用。實例const util require(util);const fs require(fs);// 將回調風格的 fs.readFile 轉換為返回 Promise 的函數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 轉換為回調util.callbackify() 將返回 Promise 的函數轉換為回調風格的函數便于在需要回調的代碼環境中使用。util.callbackify(original) 將async異步函數或者一個返回值為Promise的函數轉換成遵循異常優先的回調風格的函數例如將(err, value) ...回調作為最后一個參數。 在回調函數中第一個參數為拒絕的原因如果Promise解決則為null第二個參數則是解決的值。實例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);});以上代碼輸出結果為hello world回調函數是異步執行的并且有異常堆棧錯誤追蹤。 如果回調函數拋出一個異常進程會觸發一個 uncaughtException 異常如果沒有被捕獲進程將會退出。null 在回調函數中作為一個參數有其特殊的意義如果回調函數的首個參數為 Promise 拒絕的原因且帶有返回值且值可以轉換成布爾值 false這個值會被封裝在 Error 對象里可以通過屬性 reason 獲取。function fn() { return Promise.reject(null); } const callbackFunction util.callbackify(fn); callbackFunction((err, ret) { // 當 Promise 被以 null 拒絕時它被包裝為 Error 并且原始值存儲在 reason 中。 err err.hasOwnProperty(reason) err.reason null; // true });original 為 async 異步函數。該函數返回傳統回調函數。util.deprecate() - 標記函數為廢棄util.deprecate() 用于標記不推薦使用的函數調用時會顯示警告信息。實例const util require(util);const oldFunction util.deprecate(() {console.log(This function is deprecated);}, oldFunction is deprecated. Use newFunction instead.);oldFunction(); // 調用時會顯示警告util.types - 數據類型檢測util.types 提供了一組方法來檢測特定數據類型擴展了 typeof 和 instanceof 的功能。實例const util require(util);console.log(util.types.isDate(new Date())); // trueconsole.log(util.types.isMap(new Map())); // trueutil.inheritsutil.inherits(constructor, superConstructor) 是一個實現對象間原型繼承的函數。JavaScript 的面向對象特性是基于原型的與常見的基于類的不同。JavaScript 沒有提供對象繼承的語言級別特性而是通過原型復制來實現的。在這里我們只介紹 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);我們定義了一個基礎對象 Base 和一個繼承自 Base 的 SubBase 有三個在構造函數內定義的屬性和一個原型中定義的函數通過util.inherits 實現繼承。運行結果如下base Hello base { name: base, base: 1991, sayHello: [Function] } sub { name: sub }注意Sub 僅僅繼承了Base 在原型中定義的函數而構造函數內部創造的 base 屬 性和 sayHello 函數都沒有被 Sub 繼承。同時在原型中定義的屬性不會被 console.log 作 為對象的屬性輸出。如果我們去掉 objSub.sayHello(); 這行的注釋將會看到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 出現之前util.inherits 是 Node.js 中實現繼承的主要方法。但是ES6 之后推薦使用 class 和 extends 語法這樣繼承的代碼更具可讀性。util.inspect() - 打印對象結構util.inspect(object[, options])將對象轉換為字符串表示形式便于調試。util.inspect() 將對象轉換為字符串形式常用于調試以查看對象的詳細結構和屬性。可以指定 options 參數來控制輸出格式。實例const obj { a: 1, b: 2, c: { d: 3 } };console.log(util.inspect(obj, { showHidden: false, depth: null, colors: true }));util.isArray(object)如果給定的參數 object 是一個數組返回 true否則返回 false。var util require(util); util.isArray([]) // true util.isArray(new Array) // true util.isArray({}) // falseutil.isRegExp(object)如果給定的參數 object 是一個正則表達式返回true否則返回false。var util require(util); util.isRegExp(/some regexp/) // true util.isRegExp(new RegExp(another regexp)) // true util.isRegExp({}) // falseutil.isDate(object)如果給定的參數 object 是一個日期返回true否則返回false。var util require(util); util.isDate(new Date()) // true util.isDate(Date()) // false (without new returns a String) util.isDate({}) // false