Node.js Utilities

Util

稳定性:2 - Stable

util是用来支持Node.js内部APIs需求的模块,同时对于开发应用程序与模块也有很大的帮助,作者在工作中经常使用util模块进行调试,所以今天研究了下该模块并写出自己的一些心得与大家分享。
首先要引用util模块:

const util = require('util');

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

  • format 类似于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
}));

Node.js Utilities_第1张图片
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 标识程序中需要debug的部分
  • Returns 日志输出函数,输出到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进行总结的,如您在阅读的过程中发现问题,请联系作者,最后感谢您的支持!

作者 小菜荔枝 转载请联系作者获得授权

你可能感兴趣的:(Node.js Utilities)