# utils
~~~
穩定度: 4 - 凍結
~~~
如果你想使用模塊 `'util'`中已定義的方法. 只需 `require('util')` 即可使用.
`util`模塊設計的主要目的是為了滿足Node內部API的需求 。這個模塊中的很多方法在你編寫Node程序的時候都是很有幫助的。如果你覺得提供的這些方法滿足不了你的需求,那么我們鼓勵你編寫自己的實用工具方法。我們 不希望`util`模塊中添加任何對于Node的內部功能非必要的擴展。
### util.debuglog(section)
- `section` {String} 被調試的程序節點部分
- 返回值: {Function} 日志處理函數
這個方法是在存在`NODE_DEBUG`環境變量的基礎上,創建一個有條件寫到stderr里的函數。如果“節點”的名字出現在這個環境變量里,那么就返回一個功能類似于`console.error()`的函數.如果不是,那么返回一個空函數.
例如:
var bar = 123; debuglog('hello from foo [%d]', bar); ```
如果這個程序以`NODE_DEBUG=foo` 的環境運行,那么它將會輸出:
~~~
FOO 3245: hello from foo [123]
~~~
`3245`是進程的ID, 如果程序不以剛才那樣設置的環境變量運行,那么將不會輸出任何東西。
多個`NODE_DEBUG`環境變量,你可以用逗號進行分割。例如,`NODE_DEBUG= fs, net, tls`。
### util.format(format, [...])
根據第一個參數,返回一個格式化字符串,類似`printf`的格式化輸出。
第一個參數是一個字符串,包含零個或多個*占位符*。 每一個占位符被替換為與其對應的轉換后的值。 支持的占位符有:
- `%s` - 字符串.
- `%d` - 數字 (整型和浮點型).
- `%j` - JSON. 如果這個參數包含循環對象的引用,將會被替換成字符串 `'[Circular]'`。
- `%%` - 單獨一個百分號(`'%'`)。不會消耗一個參數。
如果占位符沒有相對應的參數,占位符將不會被替換。
~~~
util.format('%s:%s', 'foo'); // 'foo:%s'
~~~
如果有多個參數占位符,額外的參數將會調用`util.inspect()`轉換為字符串。這些字符串被連接在一起,并且以空格分隔。
~~~
util.format('%s:%s', 'foo', 'bar', 'baz'); // 'foo:bar baz'
~~~
如果第一個參數是一個非格式化字符串,那么`util.format()`將會把所有的參數轉成字符串,以空格隔開,拼接在一塊,并返回該字符串。`util.inspect()`會把每個參數都轉成一個字符串。
~~~
util.format(1, 2, 3); // '1 2 3'
~~~
### util.log(string)
在控制臺進行輸出,并帶有時間戳。
~~~
示例:require('util').log('Timestamped message.');
~~~
### util.inspect(object, [options])
返回一個對象的字符串表現形式, 在代碼調試的時候非常有用.
可以通過加入一些可選選項,來改變對象的格式化輸出形式:
- `showHidden` - 如果設為 `true`,那么該對象的不可枚舉的屬性將會被顯示出來。默認為`false`.
- `depth` - 告訴 `inspect` 格式化對象的時候遞歸多少次。這個選項在格式化復雜對象的時候比較有用。 默認為 `2`。如果想無窮遞歸下去,則賦值為`null`即可。
- `colors` - 如果設為`true`,將會以`ANSI`顏色代碼風格進行輸出. 默認是`false`。顏色是可定制的,請看下面:
- `customInspect` - 如果設為 `false`,那么定義在被檢查對象上的`inspect(depth, opts)` 方法將不會被調用。 默認為`true`。
示例:檢查`util`對象上的所有屬性
~~~
console.log(util.inspect(util, { showHidden: true, depth: null }));
~~~
當被調用的時候,參數值可以提供自己的自定義`inspect(depth, opts)`方法。該方法會接收當前的遞歸檢查深度,以及傳入`util.inspect()`的其他參數。
### 自定義 `util.inspect` 顏色
`util.inspect`彩色輸出(如果啟用的話) ,可以通過`util.inspect.styles` 和 `util.inspect.colors` 來全局定義。
`util.inspect.styles`是通過`util.inspect.colors`分配給每個風格顏色的一個映射。 高亮風格和它們的默認值: *`number` (黃色)*`boolean` (黃色) *`string` (綠色)*`date` (洋紅色) *`regexp` (紅色)*`null` (粗體) *`undefined` (灰色)*`special` - 在這個時候的唯一方法 (青綠色) * `name` (無風格)
預定義的顏色代碼: `white`, `grey`, `black`, `blue`, `cyan`, `green`, `magenta`, `red` 和 `yellow`。 還有 `bold`, `italic`, `underline` 和 `inverse` 代碼。
### 自定義對象的`inspect()`方法
對象可以定義自己的 `inspect(depth)`方法;當使用`util.inspect()`檢查該對象的時候,將會執行對象自定義的檢查方法。
~~~
util.inspect(obj);
// "{nate}"
~~~
您也可以返回完全不同的另一個對象,而且返回的字符串將被根據返回的對象格式化。它和`JSON.stringify()`工作原理類似:
~~~
util.inspect(obj);
// "{ bar: 'baz' }"
~~~
### util.isArray(object)
如果給定的對象是`數組`類型,就返回`true`,否則返回`false`
~~~
util.isArray([])
// true
util.isArray(new Array)
// true
util.isArray({})
// false
~~~
### util.isRegExp(object)
如果給定的對象是`RegExp`類型,就返回`true`,否則返回`false`。
~~~
util.isRegExp(/some regexp/)
// true
util.isRegExp(new RegExp('another regexp'))
// true
util.isRegExp({})
// false
~~~
### util.isDate(object)
如果給定的對象是`Date`類型,就返回`true`,否則返回`false`。
~~~
util.isDate(new Date())
// true
util.isDate(Date())
// false (沒有關鍵字 'new' 返回一個字符串)
util.isDate({})
// false
~~~
### util.isError(object)
如果給定的對象是`Error`類型,就返回`true`,否則返回`false`。
~~~
util.isError(new Error())
// true
util.isError(new TypeError())
// true
util.isError({ name: 'Error', message: 'an error occurred' })
// false
~~~
### util.inherits(constructor, superConstructor)
通過[構造函數](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor),繼承原型對象上的方法。構造函數的`原型`將被設置為一個新的 從`超類`創建的對象。
你可以很方便的通過 `constructor.super_`來訪問到`superConstructor`
~~~
stream.on("data", function(data) {
console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // 輸出結果:Received data: "It works!"
~~~
### util.debug(string)
~~~
穩定度: 0 - 已過時: 請使用 console.error() 代替
~~~
`console.error`的已過時的前身
### util.error([...])
~~~
穩定度: 0 - 已過時: 請使用 console.error() 代替
~~~
`console.error`的已過時的前身
### util.puts([...])
穩定度: 0 - 已過時: 請使用 console.log() 代替
`console.log`的已過時的前身
### util.print([...])
穩定度: 0 - 已過時: 請使用 console.log() 代替
`console.log`的已過時的前身
### util.pump(readableStream, writableStream, [callback])
穩定度: 0 - 已過時: 請使用readableStream.pipe(writableStream)代替
`stream.pipe()`的已過時的前身