引子

话说大家在做框架的时候,除了引用大量的引入第三方类库之外,不免自己要实现一些。例如:判断对象是否是某个类型等。其实node也提供了一部分实用的函数(需要引入“util”模块),下面我们就来一一介绍。

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

此方法与C语言中的prinf类似,第一个参数是一个字符串,后面是可变参数(可以有任意多个参数)

  • %s String 可变参数对应位置是字符串。
var util = require('util');

console.log(util.format('%s%s', '你好!')); // 你好!%s
console.log(util.format('Hello %s', 'World!')); // Hello World!
  • %d Number 可变参数对应位置是数字(整型或浮点型)
var util = require('util');

console.log(util.format('你的幸运数字是%d', 6)); // 你的幸运数字是6
  • %j JSON 可变参数为JSON对象
var util = require('util');

console.log(util.format('这个接口需要的参数为:%j,正确的返回结果为:%j', {type: 'pet'}, {status: 200})); // 这个接口需要的参数为:{"type":"pet"},正确的返回结果为:{"status":200}

需要注意的是,如果第一个参数不是拥有占位符的字符串,那么此方法会把所有参数拼接成一个字符串,并且每个参数之间有空格分开

var util = require('util');

console.log(util.format(1,2,3); // 1 2 3
util.debug(string)

在打印的字符串之前添加“DEBUG:”字样,就如我在Node.js之console一文中提到的一样,util.debug会将输出的信息记录到错误日志文件中去,如果没有指定错误文件,那么就会直接输出到控制台

var util = require('util');

util.debug('这是一条调试信息'); // DEBUG: 这是一条调试信息
util.error([...])

与util.debug一样,日志会记录到错误日志文件中去,但是不带“DEBUG:”,并且可以记录多个参数

var util = require('util');

util.error('error1', 'error2',  'error2'); // error1
                                           // error2
                                           // error2
util.puts([...])、util.print([...])

util.puts与util.print功能一致,会将日志信息记录到正常的日志文件中,两者唯一的区别在于:util.puts会在新行输出每一个参数,而util.print将所有参数输出到一行。

var util = require('util');

uti.puts('arg1', 'arg2', 'arg3'); // error1
                                  // error2
                                  // error2
console.log('======优雅的分割线========='); // ======优雅的分割线=========
uti.print('arg1', 'arg2', 'arg3'); // arg1arg2arg3
util.log(string)

从node源码可以看出util.log在内部内部其实就是调用了console.log方法,只不过在日志前加入了时间点。

function timestamp() {
  var d = new Date();
  var time = [pad(d.getHours()),
              pad(d.getMinutes()),
              pad(d.getSeconds())].join(':');
  return [d.getDate(), months[d.getMonth()], time].join(' ');
}

// log is just a thin wrapper to console.log that prepends a timestamp
exports.log = function() {
  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
};

以上是util模块的node源码:timestamp是产生时间字符串的函数,当我们调用util.log时,timestamp()产生的字符串会被填充到原日志的前面(更多的模块源码,我以后会有专门的博客介绍)。下面我们来看下util.log(string)用法与效果:

var util = require('util');

util.log('我是一条日志!'); // 29 Feb 15:50:34 - 我是一条日志!
util.inspect(object, [options])

这个函数我们在Node.js之console一文中也提到过,功能我就不多做介绍。第一个参数应该没什么异议,第二个参数是可选配置项,通过传入不同的option值,会有不同的效果,下面就来介绍下这个option:

  • showHidden表示是否要返回不可枚举选项,我们在JavaScript之object提到过,object对象的属性可以设置为“不可枚举”,这样我们的for...in结构就不能访问了。这里也是一样,showHidden默认是false,也就是说使用util.inspect时,默认不返回不可枚举属性的:
var util = require('util');

var obj = Object.create({}, {
  'enumerable_prop':{
    value: 'a',
    enumerable: true
  },
  'non_enumerable_prop':{
    value: 'b',
    enumerable: false
  }
});

var strObjShow = util.inspect(obj, {showHidden: true});
var strObjHide = util.inspect(obj, {showHidden: false});

console.log('strObjShow is %s', strObjShow); // strObjShow is { enumerable_prop: 'a', [non_enumerable_prop]: 'b' }
console.log('strObjHide is %s', strObjHide); // strObjHide is { enumerable_prop: 'a' }
  • depth表示深度,我们在Node.js之console介绍过,这里就不再赘述。

  • colors 可以在控制台输出有颜色的对象(并且颜色是可以自定义的)

var util = require('util');

console.log(util.inspect({a:1, b:'123'}, {colors: true})); // { a: 1, b: '123' }

以上代码的实际效果如下:

inspect-colors

  • customInspect如果我们在对象像定义inspect方法,那么util.inspect就会直接调用该对象的inspect方法,如果将customInspect设置为false,则将依旧调用node定义的方法:
var util = require('util');

var obj = {
  name: '张三',
  inspect: function(){
    return 'inspect is called!';
  }
}

console.log(util.inspect(obj)); // inspect is called!
console.log(util.inspect(obj, {customInspect: false})); // { name: '张三', inspect: [Function] }
util.isArray(object)、util.isRegExp(object)、util.isDate(object)、util.isError(object)

这几个方法从英文语义上就可以知道功能了,我就不多述了。(需要提到的是在以前,判断一个对象是否是数组,很长时间没有人给出优雅的解决方法。直到有人利用调用原型上的方法才给出了优雅的解决方案,这就告诉我们,群众的力量是无穷的)。

util.pump(readableStream, writableStream, [callback])

这个方法在v0.10.42时代就被废弃了,就不介绍了。

util.inherits(constructor, superConstructor)

虽然我们可以手动做JavaScript的“继承”,但是node还是给出了实用的工具函数。但是我在这里不做介绍,我会把此方法放到events模块一起介绍。

总结

总的来说,介绍API是比较枯燥的(我也觉得)。大家可以作为知识点学习学习,熟悉熟悉,为以后工作中遇到的问题打打基础。另外之前我在v站上发的帖子很多人回复,非常感谢大家给我的建议,我会坚持写技术博客的。

results matching ""

    No results matching ""