# 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()`的已过时的前身