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-enumerable
和symbol
屬性也會顯示出來,默認為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
}));
第二次輸出結果帶了顏色,并且輸出了兩個
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
進行總結的,如您在閱讀的過程中發現問題,請聯系作者,最后感謝您的支持!
簡書作者 小菜荔枝 轉載請聯系作者獲得授權