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
}));
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
进行总结的,如您在阅读的过程中发现问题,请联系作者,最后感谢您的支持!
简书作者 小菜荔枝 转载请联系作者获得授权
网友评论