<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89</id>
	<title>Node.js：常用工具（util） - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89&amp;action=history"/>
	<updated>2026-04-26T05:58:57Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89&amp;diff=6455&amp;oldid=prev</id>
		<title>2023年3月31日 (五) 13:21 Eijux</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89&amp;diff=6455&amp;oldid=prev"/>
		<updated>2023-03-31T13:21:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-Hans-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2023年3月31日 (五) 21:21的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;第1行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Node.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;js&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Node.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;js教程&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 关于 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 关于 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89&amp;diff=4122&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:Node.js  == 关于 == util 是一个 Node.js 核心模块，提供常用函数的集合，用于弥补核心 JavaScript 的功能过于精简的不…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Node.js%EF%BC%9A%E5%B8%B8%E7%94%A8%E5%B7%A5%E5%85%B7%EF%BC%88util%EF%BC%89&amp;diff=4122&amp;oldid=prev"/>
		<updated>2021-05-30T17:00:47Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:Node.js&quot; title=&quot;分类:Node.js&quot;&gt;category:Node.js&lt;/a&gt;  == 关于 == util 是一个 Node.js 核心模块，提供常用函数的集合，用于弥补核心 JavaScript 的功能过于精简的不…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:Node.js]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
util 是一个 Node.js 核心模块，提供常用函数的集合，用于弥补核心 JavaScript 的功能过于精简的不足。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用方法如下：&lt;br /&gt;
'''&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
const util = require('util');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
== 常用工具 ==&lt;br /&gt;
=== util.callbackify ===&lt;br /&gt;
'''&amp;lt;code&amp;gt;util.callbackify(original)&amp;lt;/code&amp;gt;''' 将 '''async 异步函数'''【？？？】（或者一个返回值为 Promise 的函数）转换成遵循'''异常优先'''的回调风格的函数。&lt;br /&gt;
: 例如将 “(err, value) =&amp;gt; ...” 回调作为最后一个参数。 &lt;br /&gt;
&lt;br /&gt;
在回调函数中：&lt;br /&gt;
# 第一个参数为拒绝的原因（如果 Promise 解决，则为 null），&lt;br /&gt;
# 第二个参数则是解决的值。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
const util = require('util');&lt;br /&gt;
&lt;br /&gt;
async function fn() {&lt;br /&gt;
  return 'hello world';&lt;br /&gt;
}&lt;br /&gt;
const callbackFunction = util.callbackify(fn);&lt;br /&gt;
&lt;br /&gt;
callbackFunction((err, ret) =&amp;gt; {&lt;br /&gt;
  if (err) throw err;&lt;br /&gt;
  console.log(ret);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
以上代码输出结果为：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
hello world&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* original 为 async 异步函数。该函数返回传统回调函数。&lt;br /&gt;
* 回调函数是异步执行的，并且有异常堆栈错误追踪。 如果回调函数抛出一个异常，进程会触发一个 'uncaughtException' 异常，如果没有被捕获，进程将会退出。&lt;br /&gt;
* null 在回调函数中作为一个参数有其特殊的意义，如果回调函数的首个参数为 Promise 拒绝的原因且带有返回值，且值可以转换成布尔值 false，这个值会被封装在 Error 对象里，可以通过属性 reason 获取。【？？？】&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
function fn() {&lt;br /&gt;
  return Promise.reject(null);&lt;br /&gt;
}&lt;br /&gt;
const callbackFunction = util.callbackify(fn);&lt;br /&gt;
&lt;br /&gt;
callbackFunction((err, ret) =&amp;gt; {&lt;br /&gt;
  // 当 Promise 被以 `null` 拒绝时，它被包装为 Error 并且原始值存储在 `reason` 中。&lt;br /&gt;
  err &amp;amp;&amp;amp; err.hasOwnProperty('reason') &amp;amp;&amp;amp; err.reason === null;  // true&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== util.inherits ===&lt;br /&gt;
'''&amp;lt;code&amp;gt;util.inherits(constructor, superConstructor)&amp;lt;/code&amp;gt;''' 是一个'''实现对象间原型继承'''的函数。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
JavaScript 的面向对象特性是【基于原型】的，与常见的基于类的不同。&lt;br /&gt;
&lt;br /&gt;
JavaScript 没有提供对象继承的语言级别特性，而是通过【原型复制】来实现的。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;17&amp;quot;&amp;gt;&lt;br /&gt;
var util = require('util'); &lt;br /&gt;
&lt;br /&gt;
function Base() { &lt;br /&gt;
    this.name = 'base'; &lt;br /&gt;
    this.base = 1991; &lt;br /&gt;
    this.sayHello = function() { &lt;br /&gt;
        console.log('Hello ' + this.name); &lt;br /&gt;
    }; &lt;br /&gt;
} &lt;br /&gt;
Base.prototype.showName = function() { &lt;br /&gt;
    console.log(this.name);&lt;br /&gt;
}; &lt;br /&gt;
&lt;br /&gt;
function Sub() { &lt;br /&gt;
    this.name = 'sub'; &lt;br /&gt;
} &lt;br /&gt;
util.inherits(Sub, Base); &lt;br /&gt;
&lt;br /&gt;
var objBase = new Base(); &lt;br /&gt;
objBase.showName(); &lt;br /&gt;
objBase.sayHello(); &lt;br /&gt;
console.log(objBase); &lt;br /&gt;
&lt;br /&gt;
var objSub = new Sub(); &lt;br /&gt;
objSub.showName(); &lt;br /&gt;
//objSub.sayHello(); &lt;br /&gt;
console.log(objSub); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
运行结果如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
base &lt;br /&gt;
Hello base &lt;br /&gt;
{ name: 'base', base: 1991, sayHello: [Function] } &lt;br /&gt;
sub &lt;br /&gt;
{ name: 'sub' }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
注意：&lt;br /&gt;
* Sub 仅仅继承了Base 在原型中定义的函数，而构造函数内部创造的 base 属性和 sayHello 函数都没有被 Sub 继承。&lt;br /&gt;
* 同时，在原型中定义的属性不会被 console.log 作为对象的属性输出。&lt;br /&gt;
&lt;br /&gt;
如果我们去掉 objSub.sayHello(); 这行的注释，将会看到：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
node.js:201 &lt;br /&gt;
throw e; // process.nextTick error, or 'error' event on first tick &lt;br /&gt;
^ &lt;br /&gt;
TypeError: Object #&amp;amp;lt;Sub&amp;amp;gt; has no method 'sayHello' &lt;br /&gt;
at Object.&amp;amp;lt;anonymous&amp;amp;gt; (/home/byvoid/utilinherits.js:29:8) &lt;br /&gt;
at Module._compile (module.js:441:26) &lt;br /&gt;
at Object..js (module.js:459:10) &lt;br /&gt;
at Module.load (module.js:348:31) &lt;br /&gt;
at Function._load (module.js:308:12) &lt;br /&gt;
at Array.0 (module.js:479:10) &lt;br /&gt;
at EventEmitter._tickCallback (node.js:192:40)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== '''util.inspect''' ===&lt;br /&gt;
'''&amp;lt;code&amp;gt;util.inspect(object,[showHidden],[depth],[colors])&amp;lt;/code&amp;gt;''' 是一个'''将任意对象转换为字符串'''的方法，通常用于调试和错误输出。&lt;br /&gt;
&lt;br /&gt;
参数说明：&lt;br /&gt;
* 它至少接受一个参数 object，即要转换的对象。&lt;br /&gt;
* showHidden 如果为 true，将会输出更多隐藏信息。&lt;br /&gt;
* depth 表示最大递归的层数，如果对象很复杂，你可以指定层数以控制输出信息的多少。&lt;br /&gt;
** 如果不指定 depth，默认会递归 '''2''' 层；&lt;br /&gt;
** 指定为 '''null''' 表示将不限递归层数完整遍历对象。&lt;br /&gt;
* colors 如果为 true，输出格式将会以 ANSI 颜色编码，通常用于在终端显示更漂亮的效果。&lt;br /&gt;
&lt;br /&gt;
特别要指出的是，util.inspect 并不会简单地直接把对象转换为字符串，即使该对象定义了 toString 方法也不会调用。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
var util = require('util'); &lt;br /&gt;
function Person() { &lt;br /&gt;
    this.name = 'byvoid'; &lt;br /&gt;
    this.toString = function() { &lt;br /&gt;
        return this.name; &lt;br /&gt;
    }; &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
var obj = new Person(); &lt;br /&gt;
console.log(util.inspect(obj)); &lt;br /&gt;
console.log(util.inspect(obj, true));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
运行结果是：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Person { name: 'byvoid', toString: [Function] }&lt;br /&gt;
Person {&lt;br /&gt;
  name: 'byvoid',&lt;br /&gt;
  toString: &lt;br /&gt;
   { [Function]&lt;br /&gt;
     [length]: 0,&lt;br /&gt;
     [name]: '',&lt;br /&gt;
     [arguments]: null,&lt;br /&gt;
     [caller]: null,&lt;br /&gt;
     [prototype]: { [constructor]: [Circular] } } }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== util.isArray(object) ===&lt;br /&gt;
如果给定的参数 &amp;quot;object&amp;quot; 是一个数组返回 true，否则返回 false。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
var util = require('util');&lt;br /&gt;
&lt;br /&gt;
util.isArray([])&lt;br /&gt;
  // true&lt;br /&gt;
util.isArray(new Array)&lt;br /&gt;
  // true&lt;br /&gt;
util.isArray({})&lt;br /&gt;
  // false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== util.isRegExp(object) ===&lt;br /&gt;
如果给定的参数 &amp;quot;object&amp;quot; 是一个'''正则表达式'''返回true，否则返回false。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
var util = require('util');&lt;br /&gt;
&lt;br /&gt;
util.isRegExp(/some regexp/)&lt;br /&gt;
  // true&lt;br /&gt;
util.isRegExp(new RegExp('another regexp'))&lt;br /&gt;
  // true&lt;br /&gt;
util.isRegExp({})&lt;br /&gt;
  // false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== util.isDate(object) ===&lt;br /&gt;
如果给定的参数 &amp;quot;object&amp;quot; 是一个日期返回true，否则返回false。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
var util = require('util');&lt;br /&gt;
&lt;br /&gt;
util.isDate(new Date())&lt;br /&gt;
  // true&lt;br /&gt;
util.isDate(Date())&lt;br /&gt;
  // false (without 'new' returns a String)&lt;br /&gt;
util.isDate({})&lt;br /&gt;
  // false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>