Node.js Utilities

Util

穩定性:2 - Stable

util是用來支持Node.js內部APIs需求的模塊,同時對于開發應用程序與模塊也有很大的幫助,作者在工作中經常使用util模塊進行調試,所以今天研究了下該模塊并寫出自己的一些心得與大家分享。
首先要引用util模塊:

const util = require('util');

util.format(format[,...args])

  • format <String> 類似于printf格式的字符串
  • args 選填參數
  • Returns 根據第一個參數format的形式,返回格式化后的字符串

第一個參數format可包含零個或多個占位符,占位符格式如下:

  • %s - String
  • %d - Number 整型和浮點型都可以
  • %j - JSON 如果對應的參數屬于循環引用(Circular references),則該占位符會被替換為'[Circular]'
  • %% - 表示字符'%',不代表占位符

如果占位符沒有與其對應的參數,則該占位符不會被替換。

util.format('%s:%s', 'foo'); 
    // Returns 'foo:%s'
util.format('%s:%s', 'I say', 'hello');  
    // Returns 'I say:hello'

如果args的個數大于占位符的個數,則多余的參數會被util.inspect()強制轉換成字符串,并且通過空格連接到正常返回的字符串中。

util.format('%s:%s', 'foo', 'bar', 'baz', 1);
    // Returns 'foo:bar baz 1'
    // 1. 如果沒有多余的參數,則正常返回的字符串是'foo:bar'
    // 2. 現在多出兩個參數'baz'和 1,則這兩個參數會被強制轉化成字符串,并且通過空格連接到正常返回的字符串中

如果第一個參數里面沒有占位符,則所有的args參數都會被util.inspect()強制轉換成字符串,并且通過空格連接在一起作為返回值。

util.format(1, 2, 3); // '1 2 3'

下面還有一些例子:

util.format('%%', 'hello');  /* '% hello' */
var obj = {
    str: 'abc',
    no: 1,
    arr: [1,2,3,4,5],
};
util.format('%j', obj);     
JSON.stringify(obj);
/* 以上兩個的結果都是{"string":"abc","no":1,"arr":[1,2,3,4,5]} */

obj.a = obj;    // 循環引用 circular reference
util.format('%j', obj);     // Returns '[Circular]'
JSON.Stringify(obj);        // 報錯TypeError: Converting circular structure to JSON

通過以上代碼我們可知有關JSON格式化util.format()JSON.stringify()得到的結果是一樣的,但對于循環引用(關于循環引用circular reference今后會詳細介紹,在這里就不過多說明了,有興趣的同學請自行百度或者關注我的簡書進行交流),JSON.stringify()會報錯,util.format()會返回'[Circular]'字符串,** 根本原因在于JSON默認不支持循環引用,所以會造成這種情況 **。
最后,擴展一下,JavaScript中的window對象和DOM節點、Nodejs中的global對象也都屬于循環引用,有興趣的同學可以多多了解一下。

util.inspect(object[, options])

返回一個描述object的字符串,調試的時候非常實用。以下是有關options的設置

  • showHidden 如果設置為true,則對象的non-enumerablesymbol屬性也會顯示出來,默認為false
  • depth 當格式化對象的時候,確定遞歸的次數,默認為2,如果想無限遞歸格式化,就設置為null
  • color 如果設置為true,則輸出帶有ANSI顏色的代碼,默認為false。顏色是可以自定義的,詳情請見文檔,這里不作說明
  • customInspect 如果設置為false,則對象自定義的inspect(depth, opts)將會失效(后面會做說明),默認為true
var obj = {    
      str: 'abc',    
      num: 1,
      arr: [1,2,3,4,5],
      undef: undefined,
      object: {
          a:{
              b:{
                  c:'whatever'
              }
          }
      }
};
console.log(util.inspect(obj));
Object.defineProperty(obj, 'spy', {  //定義obj.spy,因為他藏得很深,就叫它spy, ^_^
      value: 'I am spy',
      enumerable: false  // non-enumerable
});
console.log(util.inspect(obj, {
      showHidden: true,
      depth:1,
      colors:true
}));

console輸出結果

第二次輸出結果帶了顏色,并且輸出了兩個non-enumerable屬性[spy][length]length是數組對象的non-enumerable屬性),注意object的輸出不一致,因為第一個輸出depth默認是2,第二個輸出則設置成了1
對象也可以自定義inspect方法

var obj = { foo: 'whatever' };
obj.inspect = function(depth) {
      return { bar: this.foo };
};
console.log(util.inspect(obj));    // { bar: 'whatever' }
console.log(util.inspect(obj, {customInspect: false}));    // 這個時候自定義的inspect方法不會被調用,返回{ foo: 'whatever', inspect: [Function] }

util.debuglog(section)

  • section <String> 標識程序中需要debug的部分
  • Returns <Function> 日志輸出函數,輸出到stderr,跟console.error()類似
var debuglog = util.debuglog('foo');
var bar = 123;
debuglog('hello from foo [%d]', bar);

如果程序是在設置了環境變量NODE_DEBUG=foo的前提下運行的,則會輸出

FOO 3245: hello from foo [123]

3245代表pid,如果沒有設置該環境變量,則不會輸出任何東西,如果有多個NODE_DEBUG的環境變量,請用逗號分隔,如NODE_DEBUG=fs,net,tls

util.deprecate(function, string)

表明一個方法不應該再被使用(怎么會有這個方法,一臉懵逼不是嗎)

var puts = util.deprecate(function() {
      // do something print or anything
}, '請不要用puts,用console.log代替');
util.puts();
util.puts();
puts();
puts();
輸出結果

通過結果我們可知,調用util.puts()的時候node會輸出
(node) util.puts is deprecated. Use console.log instead.
而調用puts()的時候會輸出我們自定義的信息
請不要用puts,用console.log代替
而且大家要注意,這兩種方式我分別調用了2次,但信息默認只會輸出一次的。util.deprecate也可以配合命令行使用,大家可以參考文檔說明,這里就不詳述了。

本文檔是根據nodeJS目前穩定版本的文檔Node.js v4.4.4 Documentation進行總結的,如您在閱讀的過程中發現問題,請聯系作者,最后感謝您的支持!

簡書作者 小菜荔枝 轉載請聯系作者獲得授權

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 內容來自《Node.js開發指南》 核心模塊是 Node.js 的心臟,它由一些精簡而高效的庫組成,為 Node....
    angelwgh閱讀 916評論 0 1
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,396評論 0 6
  • Node.js 常用工具 util 是一個Node.js 核心模塊,提供常用函數的集合,用于彌補核心JavaScr...
    FTOLsXD閱讀 544評論 0 2
  • 我眼前的高樓,只是 水墨畫里寫意的線條 中鋒勾勒出輪廓 下筆凝重,門庭深鎖 只有黑白格子窗內,筆尖輕觸 點綴出豐富...
    城市里的豬閱讀 194評論 0 1