Util
源码: lib/util.js
node:util 模块支持 Node.js 内部 API 的需求。 许多实用工具也对应用程序和模块开发人员有用。 要访问它:
const util = require('node:util');util.callbackify(original)
新增于: v8.2.0
original<Function> 一个async函数- 返回: <Function> 一个回调风格的函数
接受一个 async 函数(或返回 Promise 的函数)并返回一个遵循错误优先回调风格的函数,即以 (err, value) => ... 回调作为最后一个参数。 在回调中,第一个参数将是拒绝原因(如果 Promise 已解决,则为 null),第二个参数将是已解决的值。
const util = require('node:util');
async function fn() {
return 'hello world';
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});会打印:
hello world回调是异步执行的,并且将具有有限的堆栈跟踪。 如果回调抛出,进程将发出一个 'uncaughtException' 事件,如果未处理,则将退出。
由于 null 作为回调的第一个参数具有特殊含义,如果包装的函数以假值作为原因拒绝 Promise,则该值将包装在 Error 中,原始值存储在名为 reason 的字段中。
function fn() {
return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
// 当 Promise 被 `null` 拒绝时,它会被一个 Error 包装,并且
// 原始值存储在 `reason` 中。
err && Object.hasOwn(err, 'reason') && err.reason === null; // true
});util.debuglog(section[, callback])
Added in: v0.11.3
section<string> 一个字符串,标识正在为其创建debuglog函数的应用程序部分。callback<Function> 一个回调函数,在首次调用日志记录函数时被调用,并传入一个经过优化的日志记录函数作为函数参数。- 返回: <Function> 日志记录函数
util.debuglog() 方法用于创建一个函数,该函数根据 NODE_DEBUG 环境变量的存在有条件地将调试消息写入 stderr。如果 section 名称出现在该环境变量的值中,则返回的函数操作类似于 console.error()。 否则,返回的函数不执行任何操作。
const util = require('node:util');
const debuglog = util.debuglog('foo');
debuglog('来自 foo 的问候 [%d]', 123);如果此程序在环境中以 NODE_DEBUG=foo 运行,则它将输出如下内容:
FOO 3245: 来自 foo 的问候 [123]其中 3245 是进程 id。 如果没有设置该环境变量运行它,则不会打印任何内容。
section 也支持通配符:
const util = require('node:util');
const debuglog = util.debuglog('foo-bar');
debuglog('嗨,这里是 foo-bar [%d]', 2333);如果在环境中以 NODE_DEBUG=foo* 运行它,它将输出如下内容:
FOO-BAR 3257: 嗨,这里是 foo-bar [2333]可以在 NODE_DEBUG 环境变量中指定多个逗号分隔的 section 名称:NODE_DEBUG=fs,net,tls。
可选的 callback 参数可用于将日志记录函数替换为另一个没有初始化或不必要包装的函数。
const util = require('node:util');
let debuglog = util.debuglog('internals', (debug) => {
// 替换为优化掉
// 测试 section 是否启用的日志记录函数
debuglog = debug;
});debuglog().enabled
新增于: v14.9.0
util.debuglog().enabled getter 用于创建一个测试,该测试可以基于 NODE_DEBUG 环境变量的存在情况在条件语句中使用。 如果 section 名称出现在该环境变量的值中,则返回的值将为 true。 如果不是,则返回的值将为 false。
const util = require('node:util');
const enabled = util.debuglog('foo').enabled;
if (enabled) {
console.log('hello from foo [%d]', 123);
}如果此程序在环境中以 NODE_DEBUG=foo 运行,则它将输出如下内容:
hello from foo [123]util.debug(section)
新增于: v14.9.0
util.debuglog 的别名。 允许在使用 util.debuglog().enabled 时提高可读性,不暗示日志记录。
util.deprecate(fn, msg[, code])
[历史记录]
| 版本 | 变更 |
|---|---|
| v10.0.0 | 对于每个代码,弃用警告只发出一次。 |
| v0.8.0 | 新增于: v0.8.0 |
fn<Function> 即将被弃用的函数。msg<string> 当调用弃用的函数时显示的警告消息。code<string> 弃用代码。 有关代码列表,请参见已弃用的 API 列表。- 返回: <Function> 包装后的弃用函数,用于发出警告。
util.deprecate() 方法包装 fn(可以是函数或类),使其被标记为已弃用。
const util = require('node:util');
exports.obsoleteFunction = util.deprecate(() => {
// 在这里做一些事情。
}, 'obsoleteFunction() 已弃用。 请使用 newShinyFunction() 代替。');当调用时,util.deprecate() 将返回一个函数,该函数将使用 'warning' 事件发出 DeprecationWarning。 警告将被发出并在第一次调用返回的函数时打印到 stderr。 在发出警告后,将调用包装后的函数而不发出警告。
如果在多次调用 util.deprecate() 时提供了相同的可选 code,则对于该 code,警告只会发出一次。
const util = require('node:util');
const fn1 = util.deprecate(someFunction, someMessage, 'DEP0001');
const fn2 = util.deprecate(someOtherFunction, someOtherMessage, 'DEP0001');
fn1(); // 发出带有代码 DEP0001 的弃用警告
fn2(); // 不发出弃用警告,因为它具有相同的代码如果使用了 --no-deprecation 或 --no-warnings 命令行标志,或者如果 process.noDeprecation 属性在第一次弃用警告 之前 设置为 true,则 util.deprecate() 方法不执行任何操作。
如果设置了 --trace-deprecation 或 --trace-warnings 命令行标志,或者 process.traceDeprecation 属性设置为 true,则在第一次调用已弃用的函数时,会将警告和堆栈跟踪打印到 stderr。
如果设置了 --throw-deprecation 命令行标志,或者 process.throwDeprecation 属性设置为 true,则在调用已弃用的函数时将抛出异常。
--throw-deprecation 命令行标志和 process.throwDeprecation 属性优先于 --trace-deprecation 和 process.traceDeprecation。
util.format(format[, ...args])
[历史记录]
| 版本 | 变更 |
|---|---|
| v12.11.0 | 现在会忽略 %c 说明符。 |
| v12.0.0 | format 参数现在只有在实际包含格式说明符时才被视为格式。 |
| v12.0.0 | 如果 format 参数不是格式字符串,则输出字符串的格式不再依赖于第一个参数的类型。 此更改删除了先前存在的字符串引号,这些引号在第一个参数不是字符串时输出。 |
| v11.4.0 | %d、%f 和 %i 说明符现在正确支持 Symbol。 |
| v11.4.0 | %o 说明符的 depth 再次具有默认深度 4。 |
| v11.0.0 | %o 说明符的 depth 选项现在将回退到默认深度。 |
| v10.12.0 | %d 和 %i 说明符现在支持 BigInt。 |
| v8.4.0 | 现在支持 %o 和 %O 说明符。 |
| v0.5.3 | 添加于: v0.5.3 |
format<string> 一个类似printf的格式字符串。
util.format() 方法返回一个格式化的字符串,使用第一个参数作为类似 printf 的格式字符串,该字符串可以包含零个或多个格式说明符。 每个说明符都会被替换为来自相应参数的转换值。 支持的说明符有:
%s:String将用于转换除BigInt、Object和-0之外的所有值。BigInt值将用n表示,并且没有用户定义的toString函数的Object将使用带有选项{ depth: 0, colors: false, compact: 3 }的util.inspect()进行检查。%d:Number将用于转换除BigInt和Symbol之外的所有值。%i:parseInt(value, 10)用于除BigInt和Symbol之外的所有值。%f:parseFloat(value)用于除Symbol之外的所有值。%j: JSON。 如果参数包含循环引用,则替换为字符串'[Circular]'。%o:Object。 具有通用 JavaScript 对象格式的对象字符串表示形式。 类似于带有选项{ showHidden: true, showProxy: true }的util.inspect()。 这将显示完整的对象,包括不可枚举的属性和代理。%O:Object。 具有通用 JavaScript 对象格式的对象字符串表示形式。 类似于没有选项的util.inspect()。 这将显示完整的对象,不包括不可枚举的属性和代理。%c:CSS。 此说明符将被忽略,并将跳过传入的任何 CSS。%%: 单个百分号 ('%')。 这不会消耗参数。- 返回: <string> 格式化的字符串
如果说明符没有相应的参数,则不会替换它:
util.format('%s:%s', 'foo');
// 返回: 'foo:%s'如果值的类型不是 string,则格式字符串中不包含的值将使用 util.inspect() 进行格式化。
如果传递给 util.format() 方法的参数多于说明符的数量,则多余的参数会连接到返回的字符串,并用空格分隔:
util.format('%s:%s', 'foo', 'bar', 'baz');
// 返回: 'foo:bar baz'如果第一个参数不包含有效的格式说明符,则 util.format() 返回一个字符串,该字符串是由所有参数连接在一起并以空格分隔而成的:
util.format(1, 2, 3);
// 返回: '1 2 3'如果只将一个参数传递给 util.format(),则它会按原样返回,而无需任何格式化:
util.format('%% %s');
// 返回: '%% %s'util.format() 是一个同步方法,旨在用作调试工具。 一些输入值可能具有显着的性能开销,从而可能阻塞事件循环。 请谨慎使用此函数,切勿在热代码路径中使用。
util.formatWithOptions(inspectOptions, format[, ...args])
自 v10.0.0 起加入
此函数与 util.format() 相同,不同之处在于它接受一个 inspectOptions 参数,该参数指定传递给 util.inspect() 的选项。
util.formatWithOptions({ colors: true }, '参见对象 %O', { foo: 42 });
// 返回 '参见对象 { foo: 42 }',其中 `42` 在打印到终端时被着色为数字。util.getCallSites(frameCountOrOptions, [options])
[历史]
| 版本 | 变更 |
|---|---|
| v23.3.0 | API 从 util.getCallSite 重命名为 util.getCallSites()。 |
| v22.9.0 | 自 v22.9.0 起加入 |
frameCount<number> 可选,指定要捕获为调用点对象的帧数。 默认值:10。允许的范围介于 1 和 200 之间。options<Object> 可选sourceMap<boolean> 从 source-map 重建堆栈跟踪中的原始位置。默认情况下,使用--enable-source-maps标志启用。
返回: <Object[]> 调用点对象数组
返回一个调用点对象数组,其中包含调用方函数的堆栈。
const util = require('node:util');
function exampleFunction() {
const callSites = util.getCallSites();
console.log('调用点:');
callSites.forEach((callSite, index) => {
console.log(`调用点 ${index + 1}:`);
console.log(`函数名称: ${callSite.functionName}`);
console.log(`脚本名称: ${callSite.scriptName}`);
console.log(`行号: ${callSite.lineNumber}`);
console.log(`列号: ${callSite.column}`);
});
// 调用点 1:
// 函数名称: exampleFunction
// 脚本名称: /home/example.js
// 行号: 5
// 列号: 26
// 调用点 2:
// 函数名称: anotherFunction
// 脚本名称: /home/example.js
// 行号: 22
// 列号: 3
// ...
}
// 用于模拟另一个堆栈层级的函数
function anotherFunction() {
exampleFunction();
}
anotherFunction();可以通过将 sourceMap 选项设置为 true 来重建原始位置。如果 source map 不可用,原始位置将与当前位置相同。 启用 --enable-source-maps 标志后,例如使用 --experimental-transform-types 时,默认情况下 sourceMap 将为 true。
import util from 'node:util';
interface Foo {
foo: string;
}
const callSites = util.getCallSites({ sourceMap: true });
// 使用 sourceMap:
// 函数名称: ''
// 脚本名称: example.js
// 行号: 7
// 列号: 26
// 不使用 sourceMap:
// 函数名称: ''
// 脚本名称: example.js
// 行号: 2
// 列号: 26util.getSystemErrorName(err)
加入于: v9.7.0
返回来自 Node.js API 的数字错误代码的字符串名称。 错误代码和错误名称之间的映射与平台相关。 有关常见错误的名称,请参见 常见系统错误。
fs.access('file/that/does/not/exist', (err) => {
const name = util.getSystemErrorName(err.errno);
console.error(name); // ENOENT
});util.getSystemErrorMap()
加入于: v16.0.0, v14.17.0
- 返回值: <Map>
返回来自 Node.js API 的所有可用系统错误代码的 Map。 错误代码和错误名称之间的映射与平台相关。 有关常见错误的名称,请参见 常见系统错误。
fs.access('file/that/does/not/exist', (err) => {
const errorMap = util.getSystemErrorMap();
const name = errorMap.get(err.errno);
console.error(name); // ENOENT
});util.getSystemErrorMessage(err)
加入于: v23.1.0
返回来自 Node.js API 的数字错误代码的字符串消息。 错误代码和字符串消息之间的映射与平台相关。
fs.access('file/that/does/not/exist', (err) => {
const name = util.getSystemErrorMessage(err.errno);
console.error(name); // No such file or directory
});util.inherits(constructor, superConstructor)
[历史记录]
| 版本 | 更改 |
|---|---|
| v5.0.0 | constructor 参数现在可以引用 ES6 类。 |
| v0.3.0 | 加入于: v0.3.0 |
constructor<Function>superConstructor<Function>
不鼓励使用 util.inherits()。 请使用 ES6 class 和 extends 关键字来获得语言级别的继承支持。 另请注意,这两种样式在 语义上不兼容。
将原型方法从一个 constructor 继承到另一个。 constructor 的原型将被设置为从 superConstructor 创建的新对象。
这主要是在 Object.setPrototypeOf(constructor.prototype, superConstructor.prototype) 之上添加一些输入验证。 作为一个额外的便利,可以通过 constructor.super_ 属性访问 superConstructor。
const util = require('node:util');
const EventEmitter = require('node:events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function(data) {
this.emit('data', data);
};
const stream = new MyStream();
console.log(stream instanceof EventEmitter); // true
console.log(MyStream.super_ === EventEmitter); // true
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
});
stream.write('It works!'); // Received data: "It works!"使用 class 和 extends 的 ES6 示例:
const EventEmitter = require('node:events');
class MyStream extends EventEmitter {
write(data) {
this.emit('data', data);
}
}
const stream = new MyStream();
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
});
stream.write('With ES6');util.inspect(object[, options])
util.inspect(object[, showHidden[, depth[, colors]]])
[历史]
| 版本 | 变更 |
|---|---|
| v16.18.0 | 添加了在检查 Set 和 Map 时对 maxArrayLength 的支持。 |
| v17.3.0, v16.14.0 | 现在支持 numericSeparator 选项。 |
| v13.0.0 | 循环引用现在包含对该引用的标记。 |
| v14.6.0, v12.19.0 | 如果 object 来自不同的 vm.Context,那么它上面的自定义检查函数将不再接收上下文特定的参数。 |
| v13.13.0, v12.17.0 | 现在支持 maxStringLength 选项。 |
| v13.5.0, v12.16.0 | 如果 showHidden 为 true,则检查用户定义的原型属性。 |
| v12.0.0 | compact 选项的默认值已更改为 3,breakLength 选项的默认值已更改为 80。 |
| v12.0.0 | 内部属性不再出现在自定义检查函数的上下文参数中。 |
| v11.11.0 | compact 选项接受数字作为新的输出模式。 |
| v11.7.0 | ArrayBuffers 现在也显示它们的二进制内容。 |
| v11.5.0 | 现在支持 getters 选项。 |
| v11.4.0 | depth 默认值已改回 2。 |
| v11.0.0 | depth 默认值已更改为 20。 |
| v11.0.0 | 检查输出现在限制在约 128 MiB。 超过该大小的数据将不会被完全检查。 |
| v10.12.0 | 现在支持 sorted 选项。 |
| v10.6.0 | 现在可以检查链表和类似对象,直到最大调用堆栈大小。 |
| v10.0.0 | 现在也可以检查 WeakMap 和 WeakSet 条目。 |
| v9.9.0 | 现在支持 compact 选项。 |
| v6.6.0 | 自定义检查函数现在可以返回 this。 |
| v6.3.0 | 现在支持 breakLength 选项。 |
| v6.1.0 | 现在支持 maxArrayLength 选项;特别是,默认情况下会截断长数组。 |
| v6.1.0 | 现在支持 showProxy 选项。 |
| v0.3.0 | 添加于:v0.3.0 |
object<any> 任何 JavaScript 原始值或Object。options<Object>showHidden<boolean> 如果为true,则object的不可枚举符号和属性将包含在格式化结果中。WeakMap和WeakSet条目以及用户定义的原型属性(不包括方法属性)也会被包含。 默认值:false。depth<number> 指定在格式化object时递归的次数。 这对于检查大型对象很有用。 要递归到最大调用堆栈大小,请传递Infinity或null。 默认值:2。colors<boolean> 如果为true,则输出使用 ANSI 颜色代码进行样式设置。 颜色是可自定义的。 参见 自定义util.inspect颜色。 默认值:false。customInspect<boolean> 如果为false,则不调用[util.inspect.custom](depth, opts, inspect)函数。 默认值:true。showProxy<boolean> 如果为true,则Proxy检查包括target和handler对象。 默认值:false。maxArrayLength<integer> 指定格式化时要包含的Array、TypedArray、Map、Set、WeakMap和WeakSet元素的最大数量。 设置为null或Infinity以显示所有元素。 设置为0或负数以不显示任何元素。 默认值:100。maxStringLength<integer> 指定格式化时要包含的最大字符数。 设置为null或Infinity以显示所有元素。 设置为0或负数以不显示任何字符。 默认值:10000。breakLength<integer> 输入值在多行上拆分的长度。 设置为Infinity以将输入格式化为单行(与设置为true或任何数字 >=1的compact结合使用)。 默认值:80。compact<boolean> | <integer> 将此设置为false会导致每个对象键都显示在新行上。 它将在长度超过breakLength的文本中换行。 如果设置为数字,则只要所有属性都适合breakLength,就会将最里面的n个元素合并到一行中。 短数组元素也会组合在一起。 有关更多信息,请参见下面的示例。 默认值:3。sorted<boolean> | <Function> 如果设置为true或函数,则对象的所有属性以及Set和Map条目都将在结果字符串中排序。 如果设置为true,则使用默认排序。 如果设置为函数,则它用作比较函数。getters<boolean> | <string> 如果设置为true,则会检查 getter。 如果设置为'get',则仅检查没有相应 setter 的 getter。 如果设置为'set',则仅检查具有相应 setter 的 getter。 这可能会根据 getter 函数引起副作用。 默认值:false。numericSeparator<boolean> 如果设置为true,则在所有 bigint 和数字中,每三位数字之间使用下划线分隔。 默认值:false。
返回: <string>
object的表示形式。
util.inspect() 方法返回 object 的字符串表示形式,旨在用于调试。 util.inspect 的输出可能随时更改,不应以编程方式依赖它。 可以传递其他 options 来更改结果。 util.inspect() 将使用构造函数的名称和/或 @@toStringTag 来为检查的值创建一个可识别的标签。
class Foo {
get [Symbol.toStringTag]() {
return 'bar';
}
}
class Bar {}
const baz = Object.create(null, { [Symbol.toStringTag]: { value: 'foo' } });
util.inspect(new Foo()); // 'Foo [bar] {}'
util.inspect(new Bar()); // 'Bar {}'
util.inspect(baz); // '[foo] {}'循环引用通过使用引用索引指向它们的锚点:
const { inspect } = require('node:util');
const obj = {};
obj.a = [obj];
obj.b = {};
obj.b.inner = obj.b;
obj.b.obj = obj;
console.log(inspect(obj));
// <ref *1> {
// a: [ [Circular *1] ],
// b: <ref *2> { inner: [Circular *2], obj: [Circular *1] }
// }以下示例检查 util 对象的所有属性:
const util = require('node:util');
console.log(util.inspect(util, { showHidden: true, depth: null }));以下示例突出显示了 compact 选项的效果:
const util = require('node:util');
const o = {
a: [1, 2, [[
'Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit, sed do ' +
'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.',
'test',
'foo']], 4],
b: new Map([['za', 1], ['zb', 'test']]),
};
console.log(util.inspect(o, { compact: true, depth: 5, breakLength: 80 }));
// { a:
// [ 1,
// 2,
// [ [ 'Lorem ipsum dolor sit amet,\nconsectetur [...]', // A long line
// 'test',
// 'foo' ] ],
// 4 ],
// b: Map(2) { 'za' => 1, 'zb' => 'test' } }
// Setting `compact` to false or an integer creates more reader friendly output.
console.log(util.inspect(o, { compact: false, depth: 5, breakLength: 80 }));
// {
// a: [
// 1,
// 2,
// [
// [
// 'Lorem ipsum dolor sit amet,\n' +
// 'consectetur adipiscing elit, sed do eiusmod \n' +
// 'tempor incididunt ut labore et dolore magna aliqua.',
// 'test',
// 'foo'
// ]
// ],
// 4
// ],
// b: Map(2) {
// 'za' => 1,
// 'zb' => 'test'
// }
// }
// Setting `breakLength` to e.g. 150 will print the "Lorem ipsum" text in a
// single line.showHidden 选项允许检查 WeakMap 和 WeakSet 条目。 如果条目数超过 maxArrayLength,则无法保证显示哪些条目。 这意味着两次检索相同的 WeakSet 条目可能会导致不同的输出。 此外,没有任何剩余强引用的条目可能随时被垃圾回收。
const { inspect } = require('node:util');
const obj = { a: 1 };
const obj2 = { b: 2 };
const weakSet = new WeakSet([obj, obj2]);
console.log(inspect(weakSet, { showHidden: true }));
// WeakSet { { a: 1 }, { b: 2 } }sorted 选项确保对象的属性插入顺序不会影响 util.inspect() 的结果。
const { inspect } = require('node:util');
const assert = require('node:assert');
const o1 = {
b: [2, 3, 1],
a: '`a` comes before `b`',
c: new Set([2, 3, 1]),
};
console.log(inspect(o1, { sorted: true }));
// { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } }
console.log(inspect(o1, { sorted: (a, b) => b.localeCompare(a) }));
// { c: Set(3) { 3, 2, 1 }, b: [ 2, 3, 1 ], a: '`a` comes before `b`' }
const o2 = {
c: new Set([2, 1, 3]),
a: '`a` comes before `b`',
b: [2, 3, 1],
};
assert.strict.equal(
inspect(o1, { sorted: true }),
inspect(o2, { sorted: true }),
);numericSeparator 选项将下划线添加到所有数字的每三位数字中。
const { inspect } = require('node:util');
const thousand = 1_000;
const million = 1_000_000;
const bigNumber = 123_456_789n;
const bigDecimal = 1_234.123_45;
console.log(inspect(thousand, { numericSeparator: true }));
// 1_000
console.log(inspect(million, { numericSeparator: true }));
// 1_000_000
console.log(inspect(bigNumber, { numericSeparator: true }));
// 123_456_789n
console.log(inspect(bigDecimal, { numericSeparator: true }));
// 1_234.123_45util.inspect() 是一种用于调试的同步方法。 其最大输出长度约为 128 MiB。 导致更长输出的输入将被截断。
自定义 util.inspect 颜色
util.inspect 的颜色输出(如果已启用)可以通过 util.inspect.styles 和 util.inspect.colors 属性进行全局自定义。
util.inspect.styles 是一个将样式名称与 util.inspect.colors 中的颜色关联起来的映射。
默认的样式和关联的颜色是:
bigint:yellowboolean:yellowdate:magentamodule:underlinename: (无样式)null:boldnumber:yellowregexp:redspecial:cyan(例如,Proxies)string:greensymbol:greenundefined:grey
颜色样式使用 ANSI 控制码,可能并非所有终端都支持。 要验证颜色支持,请使用 tty.hasColors()。
预定义的控制码如下所示(分组为“修饰符”、“前景色”和“背景色”)。
修饰符
修饰符的支持情况因不同的终端而异。 如果不支持,它们通常会被忽略。
reset- 将所有(颜色)修饰符重置为默认值- bold - 使文本加粗
- italic - 使文本倾斜
- underline - 使文本带有下划线
strikethrough- 在文本中心画一条水平线(别名:strikeThrough、crossedout、crossedOut)hidden- 打印文本,但使其不可见(别名:conceal)- dim - 降低颜色强度(别名:
faint) - overlined - 使文本带有上划线
- blink - 间隔地隐藏和显示文本
- inverse - 交换前景色和背景色(别名:
swapcolors、swapColors) - doubleunderline - 使文本带有双下划线(别名:
doubleUnderline) - framed - 在文本周围绘制一个框架
前景色
blackredgreenyellowbluemagentacyanwhitegray(别名:grey,blackBright)redBrightgreenBrightyellowBrightblueBrightmagentaBrightcyanBrightwhiteBright
背景色
bgBlackbgRedbgGreenbgYellowbgBluebgMagentabgCyanbgWhitebgGray(别名:bgGrey,bgBlackBright)bgRedBrightbgGreenBrightbgYellowBrightbgBlueBrightbgMagentaBrightbgCyanBrightbgWhiteBright
对象的自定义检查函数
[历史记录]
| 版本 | 变更 |
|---|---|
| v17.3.0, v16.14.0 | 添加了 inspect 参数以提高互操作性。 |
| v0.1.97 | 添加于: v0.1.97 |
对象还可以定义自己的 [util.inspect.custom](depth, opts, inspect) 函数,util.inspect() 在检查对象时将调用该函数并使用其结果。
const util = require('node:util');
class Box {
constructor(value) {
this.value = value;
}
[util.inspect.custom](depth, options, inspect) {
if (depth < 0) {
return options.stylize('[Box]', 'special');
}
const newOptions = Object.assign({}, options, {
depth: options.depth === null ? null : options.depth - 1,
});
// 五个空格的填充,因为 "Box< " 的大小就是五个空格。
const padding = ' '.repeat(5);
const inner = inspect(this.value, newOptions)
.replace(/\n/g, `\n${padding}`);
return `${options.stylize('Box', 'special')}< ${inner} >`;
}
}
const box = new Box(true);
util.inspect(box);
// 返回: "Box< true >"自定义 [util.inspect.custom](depth, opts, inspect) 函数通常返回一个字符串,但可以返回任何类型的值,util.inspect() 将相应地格式化该值。
const util = require('node:util');
const obj = { foo: '这不会出现在 inspect() 的输出中' };
obj[util.inspect.custom] = (depth) => {
return { bar: 'baz' };
};
util.inspect(obj);
// 返回: "{ bar: 'baz' }"util.inspect.custom
[历史记录]
| 版本 | 变更 |
|---|---|
| v10.12.0 | 现在定义为共享符号。 |
| v6.6.0 | 添加于: v6.6.0 |
- <symbol> 可用于声明自定义检查函数。
除了可以通过 util.inspect.custom 访问之外,此符号还全局注册,并且可以在任何环境中作为 Symbol.for('nodejs.util.inspect.custom') 访问。
使用此方法允许以可移植的方式编写代码,以便在 Node.js 环境中使用自定义检查函数,而在浏览器中忽略该函数。 util.inspect() 函数本身作为第三个参数传递给自定义检查函数,以允许进一步的可移植性。
const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom');
class Password {
constructor(value) {
this.value = value;
}
toString() {
return 'xxxxxxxx';
}
[customInspectSymbol](depth, inspectOptions, inspect) {
return `Password <${this.toString()}>`;
}
}
const password = new Password('r0sebud');
console.log(password);
// 打印 Password <xxxxxxxx>有关更多详细信息,请参见对象的自定义检查函数。
util.inspect.defaultOptions
新增于: v6.4.0
defaultOptions 值允许自定义 util.inspect 使用的默认选项。 这对于像 console.log 或 util.format 这样隐式调用 util.inspect 的函数很有用。 它应该设置为一个包含一个或多个有效的 util.inspect() 选项的对象。 也支持直接设置选项属性。
const util = require('node:util');
const arr = Array(101).fill(0);
console.log(arr); // 记录截断的数组
util.inspect.defaultOptions.maxArrayLength = null;
console.log(arr); // 记录完整的数组util.isDeepStrictEqual(val1, val2)
新增于: v9.0.0
如果 val1 和 val2 之间存在深度严格相等,则返回 true。 否则,返回 false。
有关深度严格相等的更多信息,请参见 assert.deepStrictEqual()。
类: util.MIMEType
新增于: v19.1.0, v18.13.0
MIMEType 类 的实现。
按照浏览器惯例,MIMEType 对象的所有属性都作为类原型上的 getter 和 setter 实现,而不是作为对象本身的数据属性实现。
MIME 字符串是一个包含多个有意义的组件的结构化字符串。 解析后,将返回一个 MIMEType 对象,其中包含每个这些组件的属性。
构造函数: new MIMEType(input)
input<string> 要解析的输入 MIME
通过解析 input 创建一个新的 MIMEType 对象。
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/plain');const { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/plain');如果 input 不是有效的 MIME,则会抛出 TypeError。 请注意,将尽力将给定值强制转换为字符串。 例如:
import { MIMEType } from 'node:util';
const myMIME = new MIMEType({ toString: () => 'text/plain' });
console.log(String(myMIME));
// Prints: text/plainconst { MIMEType } = require('node:util');
const myMIME = new MIMEType({ toString: () => 'text/plain' });
console.log(String(myMIME));
// Prints: text/plainmime.type
获取并设置 MIME 的类型部分。
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/javascript');
console.log(myMIME.type);
// Prints: text
myMIME.type = 'application';
console.log(myMIME.type);
// Prints: application
console.log(String(myMIME));
// Prints: application/javascriptconst { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/javascript');
console.log(myMIME.type);
// Prints: text
myMIME.type = 'application';
console.log(myMIME.type);
// Prints: application
console.log(String(myMIME));
// Prints: application/javascriptmime.subtype
获取并设置 MIME 的子类型部分。
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/ecmascript');
console.log(myMIME.subtype);
// Prints: ecmascript
myMIME.subtype = 'javascript';
console.log(myMIME.subtype);
// Prints: javascript
console.log(String(myMIME));
// Prints: text/javascriptconst { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/ecmascript');
console.log(myMIME.subtype);
// Prints: ecmascript
myMIME.subtype = 'javascript';
console.log(myMIME.subtype);
// Prints: javascript
console.log(String(myMIME));
// Prints: text/javascriptmime.essence
获取 MIME 的本质。此属性是只读的。使用 mime.type 或 mime.subtype 来更改 MIME。
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/javascript;key=value');
console.log(myMIME.essence);
// Prints: text/javascript
myMIME.type = 'application';
console.log(myMIME.essence);
// Prints: application/javascript
console.log(String(myMIME));
// Prints: application/javascript;key=valueconst { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/javascript;key=value');
console.log(myMIME.essence);
// Prints: text/javascript
myMIME.type = 'application';
console.log(myMIME.essence);
// Prints: application/javascript
console.log(String(myMIME));
// Prints: application/javascript;key=valuemime.params
获取代表 MIME 参数的 MIMEParams 对象。此属性是只读的。有关详细信息,请参阅 MIMEParams 文档。
mime.toString()
- 返回值: <string>
MIMEType 对象的 toString() 方法返回序列化的 MIME。
由于需要符合标准,因此此方法不允许用户自定义 MIME 的序列化过程。
mime.toJSON()
- 返回值: <string>
mime.toString() 的别名。
当使用 JSON.stringify() 序列化 MIMEType 对象时,会自动调用此方法。
import { MIMEType } from 'node:util';
const myMIMES = [
new MIMEType('image/png'),
new MIMEType('image/gif'),
];
console.log(JSON.stringify(myMIMES));
// Prints: ["image/png", "image/gif"]const { MIMEType } = require('node:util');
const myMIMES = [
new MIMEType('image/png'),
new MIMEType('image/gif'),
];
console.log(JSON.stringify(myMIMES));
// Prints: ["image/png", "image/gif"]类: util.MIMEParams
新增于: v19.1.0, v18.13.0
MIMEParams API 提供对 MIMEType 参数的读写访问。
构造函数: new MIMEParams()
通过空参数创建一个新的 MIMEParams 对象
import { MIMEParams } from 'node:util';
const myParams = new MIMEParams();const { MIMEParams } = require('node:util');
const myParams = new MIMEParams();mimeParams.delete(name)
name<string>
删除所有名称为 name 的名称-值对。
mimeParams.entries()
- 返回: <Iterator>
返回一个迭代器,用于迭代参数中的每个名称-值对。迭代器的每个项都是一个 JavaScript Array。数组的第一个项是 name,数组的第二个项是 value。
mimeParams.get(name)
返回名称为 name 的第一个名称-值对的值。如果不存在这样的键值对,则返回 null。
mimeParams.has(name)
如果存在至少一个名称为 name 的名称-值对,则返回 true。
mimeParams.keys()
- 返回: <Iterator>
返回一个迭代器,用于迭代每个名称-值对的名称。
import { MIMEType } from 'node:util';
const { params } = new MIMEType('text/plain;foo=0;bar=1');
for (const name of params.keys()) {
console.log(name);
}
// Prints:
// foo
// barconst { MIMEType } = require('node:util');
const { params } = new MIMEType('text/plain;foo=0;bar=1');
for (const name of params.keys()) {
console.log(name);
}
// Prints:
// foo
// barmimeParams.set(name, value)
将与 name 关联的 MIMEParams 对象中的值设置为 value。 如果存在任何名称为 name 的预先存在的名称-值对,则将第一个此类对的值设置为 value。
import { MIMEType } from 'node:util';
const { params } = new MIMEType('text/plain;foo=0;bar=1');
params.set('foo', 'def');
params.set('baz', 'xyz');
console.log(params.toString());
// Prints: foo=def;bar=1;baz=xyzconst { MIMEType } = require('node:util');
const { params } = new MIMEType('text/plain;foo=0;bar=1');
params.set('foo', 'def');
params.set('baz', 'xyz');
console.log(params.toString());
// Prints: foo=def;bar=1;baz=xyzmimeParams.values()
- 返回: <Iterator>
返回一个迭代器,该迭代器遍历每个名称-值对的值。
mimeParams[@@iterator]()
- 返回: <Iterator>
mimeParams.entries() 的别名。
import { MIMEType } from 'node:util';
const { params } = new MIMEType('text/plain;foo=bar;xyz=baz');
for (const [name, value] of params) {
console.log(name, value);
}
// Prints:
// foo bar
// xyz bazconst { MIMEType } = require('node:util');
const { params } = new MIMEType('text/plain;foo=bar;xyz=baz');
for (const [name, value] of params) {
console.log(name, value);
}
// Prints:
// foo bar
// xyz bazutil.parseArgs([config])
[历史记录]
| 版本 | 变更 |
|---|---|
| v22.4.0, v20.16.0 | 添加了对允许输入 config 中的负选项的支持。 |
| v20.0.0 | 该 API 不再是实验性的。 |
| v18.11.0, v16.19.0 | 添加了对输入 config 中默认值的支持。 |
| v18.7.0, v16.17.0 | 添加了对使用输入 config 和返回的属性中的 tokens 返回详细的解析信息的支持。 |
| v18.3.0, v16.17.0 | 添加于: v18.3.0, v16.17.0 |
config<Object> 用于为解析提供参数并配置解析器。config支持以下属性:args<string[]> 参数字符串数组。 默认值: 删除了execPath和filename的process.argv。options<Object> 用于描述解析器已知的参数。options的键是选项的长名称,值是 <Object>,接受以下属性:type<string> 参数的类型,必须是boolean或string。multiple<boolean> 是否可以多次提供此选项。 如果为true,则所有值都将收集在一个数组中。 如果为false,则选项的值为后胜出。 默认值:false。short<string> 选项的单个字符别名。default<string> | <boolean> | <string[]> | <boolean[]> 当未通过 args 设置时,默认选项值。 它必须与type属性的类型相同。 当multiple为true时,它必须是一个数组。strict<boolean> 当遇到未知参数,或者传递的参数与options中配置的type不匹配时,是否应抛出错误。 默认值:true。allowPositionals<boolean> 此命令是否接受位置参数。 默认值: 如果strict为true,则为false,否则为true。allowNegative<boolean> 如果为true,则允许通过在选项名称前加上--no-来显式地将布尔选项设置为false。 默认值:false。tokens<boolean> 返回已解析的令牌。 这对于扩展内置行为很有用,从添加额外的检查到以不同的方式重新处理令牌。 默认值:false。
返回: <Object> 已解析的命令行参数:
values<Object> 已解析的选项名称与其 <string> 或 <boolean> 值的映射。positionals<string[]> 位置参数。tokens<Object[]> | <undefined> 参见 parseArgs tokens 部分。 仅当config包含tokens: true时返回。
提供比直接与 process.argv 交互更高级别的命令行参数解析 API。 接受预期参数的规范,并返回带有已解析选项和位置参数的结构化对象。
import { parseArgs } from 'node:util';
const args = ['-f', '--bar', 'b'];
const options = {
foo: {
type: 'boolean',
short: 'f',
},
bar: {
type: 'string',
},
};
const {
values,
positionals,
} = parseArgs({ args, options });
console.log(values, positionals);
// Prints: [Object: null prototype] { foo: true, bar: 'b' } []const { parseArgs } = require('node:util');
const args = ['-f', '--bar', 'b'];
const options = {
foo: {
type: 'boolean',
short: 'f',
},
bar: {
type: 'string',
},
};
const {
values,
positionals,
} = parseArgs({ args, options });
console.log(values, positionals);
// Prints: [Object: null prototype] { foo: true, bar: 'b' } []parseArgs tokens
通过在配置中指定 tokens: true,可以获得详细的解析信息,从而添加自定义行为。返回的 tokens 具有描述以下内容的属性:
所有 tokens
option tokens
name<string> 选项的长名称。rawName<string> 选项在 args 中如何使用,例如-f或--foo。value<string> | <undefined> 在 args 中指定的选项值。对于布尔选项,值为 Undefined。inlineValue<boolean> | <undefined> 选项值是否以内联方式指定,例如--foo=bar。
positional tokens
value<string> args 中位置参数的值(即args[index])。
option-terminator token
返回的 tokens 的顺序与输入 args 中遇到的顺序相同。在 args 中出现多次的选项会为每次使用生成一个 token。短选项组(如 -xy)会展开为每个选项的 token。因此,-xxx 会生成三个 token。
例如,要添加对否定选项(如 --no-color)的支持(当选项的类型为 boolean 时,allowNegative 支持此操作),可以重新处理返回的 tokens 以更改为否定选项存储的值。
import { parseArgs } from 'node:util';
const options = {
'color': { type: 'boolean' },
'no-color': { type: 'boolean' },
'logfile': { type: 'string' },
'no-logfile': { type: 'boolean' },
};
const { values, tokens } = parseArgs({ options, tokens: true });
// Reprocess the option tokens and overwrite the returned values.
tokens
.filter((token) => token.kind === 'option')
.forEach((token) => {
if (token.name.startsWith('no-')) {
// Store foo:false for --no-foo
const positiveName = token.name.slice(3);
values[positiveName] = false;
delete values[token.name];
} else {
// Resave value so last one wins if both --foo and --no-foo.
values[token.name] = token.value ?? true;
}
});
const color = values.color;
const logfile = values.logfile ?? 'default.log';
console.log({ logfile, color });const { parseArgs } = require('node:util');
const options = {
'color': { type: 'boolean' },
'no-color': { type: 'boolean' },
'logfile': { type: 'string' },
'no-logfile': { type: 'boolean' },
};
const { values, tokens } = parseArgs({ options, tokens: true });
// Reprocess the option tokens and overwrite the returned values.
tokens
.filter((token) => token.kind === 'option')
.forEach((token) => {
if (token.name.startsWith('no-')) {
// Store foo:false for --no-foo
const positiveName = token.name.slice(3);
values[positiveName] = false;
delete values[token.name];
} else {
// Resave value so last one wins if both --foo and --no-foo.
values[token.name] = token.value ?? true;
}
});
const color = values.color;
const logfile = values.logfile ?? 'default.log';
console.log({ logfile, color });示例用法,展示了否定选项,以及当一个选项以多种方式使用时,最后一个胜出。
$ node negate.js
{ logfile: 'default.log', color: undefined }
$ node negate.js --no-logfile --no-color
{ logfile: false, color: false }
$ node negate.js --logfile=test.log --color
{ logfile: 'test.log', color: true }
$ node negate.js --no-logfile --logfile=test.log --color --no-color
{ logfile: 'test.log', color: false }util.parseEnv(content)
新增于: v21.7.0, v20.12.0
content<string>
.env 文件的原始内容。
- 返回: <Object>
给定一个 .env 文件示例:
const { parseEnv } = require('node:util');
parseEnv('HELLO=world\nHELLO=oh my\n');
// 返回: { HELLO: 'oh my' }import { parseEnv } from 'node:util';
parseEnv('HELLO=world\nHELLO=oh my\n');
// 返回: { HELLO: 'oh my' }util.promisify(original)
[历史]
| 版本 | 变更 |
|---|---|
| v20.8.0 | 在返回 Promise 的函数上调用 promisify 已弃用。 |
| v8.0.0 | 新增于: v8.0.0 |
original<Function>- 返回: <Function>
接受一个遵循常见错误优先回调风格的函数,即接受一个 (err, value) => ... 回调作为最后一个参数,并返回一个返回 promise 的版本。
const util = require('node:util');
const fs = require('node:fs');
const stat = util.promisify(fs.stat);
stat('.').then((stats) => {
// 使用 `stats` 做一些事情
}).catch((error) => {
// 处理错误。
});或者,等效地使用 async function:
const util = require('node:util');
const fs = require('node:fs');
const stat = util.promisify(fs.stat);
async function callStat() {
const stats = await stat('.');
console.log(`此目录归 ${stats.uid} 所有`);
}
callStat();如果存在 original[util.promisify.custom] 属性,则 promisify 将返回其值,请参见自定义 promise 化函数。
promisify() 假定 original 是一个以回调作为其最后一个参数的函数。 如果 original 不是一个函数,promisify() 将抛出一个错误。 如果 original 是一个函数,但它的最后一个参数不是一个错误优先的回调,它仍然会被传递一个错误优先的回调作为它的最后一个参数。
在类方法或其他使用 this 的方法上使用 promisify() 可能无法按预期工作,除非经过特殊处理:
const util = require('node:util');
class Foo {
constructor() {
this.a = 42;
}
bar(callback) {
callback(null, this.a);
}
}
const foo = new Foo();
const naiveBar = util.promisify(foo.bar);
// TypeError: 无法读取 undefined 的属性 'a'
// naiveBar().then(a => console.log(a));
naiveBar.call(foo).then((a) => console.log(a)); // '42'
const bindBar = naiveBar.bind(foo);
bindBar().then((a) => console.log(a)); // '42'自定义 Promise 化函数
使用 util.promisify.custom 符号可以覆盖 util.promisify() 的返回值:
const util = require('node:util');
function doSomething(foo, callback) {
// ...
}
doSomething[util.promisify.custom] = (foo) => {
return getPromiseSomehow();
};
const promisified = util.promisify(doSomething);
console.log(promisified === doSomething[util.promisify.custom]);
// prints 'true'对于原始函数不遵循以 error-first 回调作为最后一个参数的标准格式的情况,这非常有用。
例如,对于一个接受 (foo, onSuccessCallback, onErrorCallback) 的函数:
doSomething[util.promisify.custom] = (foo) => {
return new Promise((resolve, reject) => {
doSomething(foo, resolve, reject);
});
};如果定义了 promisify.custom 但不是一个函数,则 promisify() 将抛出一个错误。
util.promisify.custom
[历史]
| 版本 | 变更 |
|---|---|
| v13.12.0, v12.16.2 | 这现在被定义为一个共享符号。 |
| v8.0.0 | 添加于: v8.0.0 |
- <symbol> ,可用于声明函数的自定义 Promise 化变体,请参见自定义 Promise 化函数。
除了可以通过 util.promisify.custom 访问之外,此符号已全局注册,并且可以在任何环境中作为 Symbol.for('nodejs.util.promisify.custom') 访问。
例如,对于一个接受 (foo, onSuccessCallback, onErrorCallback) 的函数:
const kCustomPromisifiedSymbol = Symbol.for('nodejs.util.promisify.custom');
doSomething[kCustomPromisifiedSymbol] = (foo) => {
return new Promise((resolve, reject) => {
doSomething(foo, resolve, reject);
});
};util.stripVTControlCharacters(str)
添加于: v16.11.0
返回移除了所有 ANSI 转义码的 str。
console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m'));
// 打印 "value"util.styleText(format, text[, options])
[历史]
| 版本 | 变更 |
|---|---|
| v23.5.0 | styleText 现在是稳定的。 |
| v22.8.0, v20.18.0 | 尊重 isTTY 和环境变量,例如 NO_COLORS、NODE_DISABLE_COLORS 和 FORCE_COLOR。 |
| v21.7.0, v20.12.0 | 添加于: v21.7.0, v20.12.0 |
format<string> | <Array> 一个文本格式或在util.inspect.colors中定义的文本格式的数组。text<string> 要格式化的文本。options<Object>
此函数返回格式化的文本,其中考虑了为在终端中打印而传递的 format。 它知道终端的功能,并根据通过 NO_COLORS、NODE_DISABLE_COLORS 和 FORCE_COLOR 环境变量设置的配置进行操作。
import { styleText } from 'node:util';
import { stderr } from 'node:process';
const successMessage = styleText('green', 'Success!');
console.log(successMessage);
const errorMessage = styleText(
'red',
'Error! Error!',
// 验证 process.stderr 是否具有 TTY
{ stream: stderr },
);
console.error(successMessage);const { styleText } = require('node:util');
const { stderr } = require('node:process');
const successMessage = styleText('green', 'Success!');
console.log(successMessage);
const errorMessage = styleText(
'red',
'Error! Error!',
// 验证 process.stderr 是否具有 TTY
{ stream: stderr },
);
console.error(successMessage);util.inspect.colors 还提供文本格式,例如 italic 和 underline,你可以将两者结合起来:
console.log(
util.styleText(['underline', 'italic'], 'My italic underlined message'),
);当传递格式数组时,应用的格式顺序是从左到右,因此以下样式可能会覆盖前一个样式。
console.log(
util.styleText(['red', 'green'], 'text'), // green
);完整的格式列表可以在 modifiers 中找到。
类: util.TextDecoder
[历史]
| 版本 | 变更 |
|---|---|
| v11.0.0 | 该类现在可以在全局对象上使用。 |
| v8.3.0 | 添加于: v8.3.0 |
WHATWG 编码标准 TextDecoder API 的实现。
const decoder = new TextDecoder();
const u8arr = new Uint8Array([72, 101, 108, 108, 111]);
console.log(decoder.decode(u8arr)); // HelloWHATWG 支持的编码
根据 WHATWG 编码标准,TextDecoder API 支持的编码在下表中列出。 对于每种编码,可以使用一个或多个别名。
不同的 Node.js 构建配置支持不同的编码集。(参见 国际化)
默认支持的编码(具有完整的 ICU 数据)
| 编码 | 别名 |
|---|---|
'ibm866' | '866' , 'cp866' , 'csibm866' |
'iso-8859-2' | 'csisolatin2' , 'iso-ir-101' , 'iso8859-2' , 'iso88592' , 'iso_8859-2' , 'iso_8859-2:1987' , 'l2' , 'latin2' |
'iso-8859-3' | 'csisolatin3' , 'iso-ir-109' , 'iso8859-3' , 'iso88593' , 'iso_8859-3' , 'iso_8859-3:1988' , 'l3' , 'latin3' |
'iso-8859-4' | 'csisolatin4' , 'iso-ir-110' , 'iso8859-4' , 'iso88594' , 'iso_8859-4' , 'iso_8859-4:1988' , 'l4' , 'latin4' |
'iso-8859-5' | 'csisolatincyrillic' , 'cyrillic' , 'iso-ir-144' , 'iso8859-5' , 'iso88595' , 'iso_8859-5' , 'iso_8859-5:1988' |
'iso-8859-6' | 'arabic' , 'asmo-708' , 'csiso88596e' , 'csiso88596i' , 'csisolatinarabic' , 'ecma-114' , 'iso-8859-6-e' , 'iso-8859-6-i' , 'iso-ir-127' , 'iso8859-6' , 'iso88596' , 'iso_8859-6' , 'iso_8859-6:1987' |
'iso-8859-7' | 'csisolatingreek' , 'ecma-118' , 'elot_928' , 'greek' , 'greek8' , 'iso-ir-126' , 'iso8859-7' , 'iso88597' , 'iso_8859-7' , 'iso_8859-7:1987' , 'sun_eu_greek' |
'iso-8859-8' | 'csiso88598e' , 'csisolatinhebrew' , 'hebrew' , 'iso-8859-8-e' , 'iso-ir-138' , 'iso8859-8' , 'iso88598' , 'iso_8859-8' , 'iso_8859-8:1988' , 'visual' |
'iso-8859-8-i' | 'csiso88598i' , 'logical' |
'iso-8859-10' | 'csisolatin6' , 'iso-ir-157' , 'iso8859-10' , 'iso885910' , 'l6' , 'latin6' |
'iso-8859-13' | 'iso8859-13' , 'iso885913' |
'iso-8859-14' | 'iso8859-14' , 'iso885914' |
'iso-8859-15' | 'csisolatin9' , 'iso8859-15' , 'iso885915' , 'iso_8859-15' , 'l9' |
'koi8-r' | 'cskoi8r' , 'koi' , 'koi8' , 'koi8_r' |
'koi8-u' | 'koi8-ru' |
'macintosh' | 'csmacintosh' , 'mac' , 'x-mac-roman' |
'windows-874' | 'dos-874' , 'iso-8859-11' , 'iso8859-11' , 'iso885911' , 'tis-620' |
'windows-1250' | 'cp1250' , 'x-cp1250' |
'windows-1251' | 'cp1251' , 'x-cp1251' |
'windows-1252' | 'ansi_x3.4-1968' , 'ascii' , 'cp1252' , 'cp819' , 'csisolatin1' , 'ibm819' , 'iso-8859-1' , 'iso-ir-100' , 'iso8859-1' , 'iso88591' , 'iso_8859-1' , 'iso_8859-1:1987' , 'l1' , 'latin1' , 'us-ascii' , 'x-cp1252' |
'windows-1253' | 'cp1253' , 'x-cp1253' |
'windows-1254' | 'cp1254' , 'csisolatin5' , 'iso-8859-9' , 'iso-ir-148' , 'iso8859-9' , 'iso88599' , 'iso_8859-9' , 'iso_8859-9:1989' , 'l5' , 'latin5' , 'x-cp1254' |
'windows-1255' | 'cp1255' , 'x-cp1255' |
'windows-1256' | 'cp1256' , 'x-cp1256' |
'windows-1257' | 'cp1257' , 'x-cp1257' |
'windows-1258' | 'cp1258' , 'x-cp1258' |
'x-mac-cyrillic' | 'x-mac-ukrainian' |
'gbk' | 'chinese' , 'csgb2312' , 'csiso58gb231280' , 'gb2312' , 'gb_2312' , 'gb_2312-80' , 'iso-ir-58' , 'x-gbk' |
'gb18030' | |
'big5' | 'big5-hkscs' , 'cn-big5' , 'csbig5' , 'x-x-big5' |
'euc-jp' | 'cseucpkdfmtjapanese' , 'x-euc-jp' |
'iso-2022-jp' | 'csiso2022jp' |
'shift_jis' | 'csshiftjis' , 'ms932' , 'ms_kanji' , 'shift-jis' , 'sjis' , 'windows-31j' , 'x-sjis' |
'euc-kr' | 'cseuckr' , 'csksc56011987' , 'iso-ir-149' , 'korean' , 'ks_c_5601-1987' , 'ks_c_5601-1989' , 'ksc5601' , 'ksc_5601' , 'windows-949' |
当 Node.js 使用 small-icu 选项构建时支持的编码
| 编码 | 别名 |
|---|---|
'utf-8' | 'unicode-1-1-utf-8' , 'utf8' |
'utf-16le' | 'utf-16' |
'utf-16be' |
当 ICU 被禁用时支持的编码
| 编码 | 别名 |
|---|---|
'utf-8' | 'unicode-1-1-utf-8' , 'utf8' |
'utf-16le' | 'utf-16' |
WHATWG 编码标准中列出的 'iso-8859-16' 编码不受支持。 |
new TextDecoder([encoding[, options]])
创建一个新的 TextDecoder 实例。 encoding 可以指定受支持的编码或别名之一。
TextDecoder 类也可在全局对象上使用。
textDecoder.decode([input[, options]])
input<ArrayBuffer> | <DataView> | <TypedArray> 包含编码数据的ArrayBuffer、DataView或TypedArray实例。options<Object>stream<boolean> 如果期望有额外的数据块,则为true。 默认值:false。
返回: <string>
解码 input 并返回一个字符串。 如果 options.stream 为 true,则在 input 末尾发生的任何不完整的字节序列都会在内部缓冲,并在下次调用 textDecoder.decode() 后发出。
如果 textDecoder.fatal 为 true,则发生的解码错误将导致抛出 TypeError。
textDecoder.encoding
TextDecoder 实例支持的编码。
textDecoder.fatal
如果解码错误导致抛出 TypeError,则该值为 true。
textDecoder.ignoreBOM
如果解码结果将包含字节顺序标记,则该值为 true。
类: util.TextEncoder
[历史]
| 版本 | 变更 |
|---|---|
| v11.0.0 | 此类现在可在全局对象上使用。 |
| v8.3.0 | 添加于: v8.3.0 |
WHATWG 编码标准 TextEncoder API 的实现。 TextEncoder 的所有实例仅支持 UTF-8 编码。
const encoder = new TextEncoder();
const uint8array = encoder.encode('this is some data');TextEncoder 类也可在全局对象上使用。
textEncoder.encode([input])
input<string> 要编码的文本。 默认值: 空字符串。- 返回: <Uint8Array>
UTF-8 编码 input 字符串并返回包含编码字节的 Uint8Array。
textEncoder.encodeInto(src, dest)
添加于: v12.11.0
src<string> 要编码的文本。dest<Uint8Array> 用于保存编码结果的数组。- 返回: <Object>
UTF-8 编码 src 字符串到 dest Uint8Array 并返回一个包含读取的 Unicode 代码单元和写入的 UTF-8 字节数的对象。
const encoder = new TextEncoder();
const src = 'this is some data';
const dest = new Uint8Array(10);
const { read, written } = encoder.encodeInto(src, dest);textEncoder.encoding
TextEncoder 实例支持的编码。始终设置为 'utf-8'。
util.toUSVString(string)
Added in: v16.8.0, v14.18.0
string<string>
返回 string,其中任何代理码点(或等效地,任何不成对的代理码元)都被替换为 Unicode “替换字符” U+FFFD。
util.transferableAbortController()
Added in: v18.11.0
创建并返回一个 <AbortController> 实例,该实例的 <AbortSignal> 被标记为可传输的,并且可以与 structuredClone() 或 postMessage() 一起使用。
util.transferableAbortSignal(signal)
Added in: v18.11.0
signal<AbortSignal>- 返回: <AbortSignal>
将给定的 <AbortSignal> 标记为可传输的,以便它可以与 structuredClone() 和 postMessage() 一起使用。
const signal = transferableAbortSignal(AbortSignal.timeout(100));
const channel = new MessageChannel();
channel.port2.postMessage(signal, [signal]);util.aborted(signal, resource)
Added in: v19.7.0, v18.16.0
signal<AbortSignal>resource<Object> 任何与可中止操作相关联的非空对象,并被弱引用。 如果resource在signal中止之前被垃圾回收,则 promise 将保持 pending 状态,允许 Node.js 停止跟踪它。 这有助于防止长时间运行或不可取消的操作中的内存泄漏。- 返回: <Promise>
监听提供的 signal 上的 abort 事件,并返回一个 promise,该 promise 在 signal 中止时解析。 如果提供了 resource,它会弱引用操作的关联对象,因此如果 resource 在 signal 中止之前被垃圾回收,那么返回的 promise 将保持 pending 状态。 这可以防止长时间运行或不可取消的操作中的内存泄漏。
const { aborted } = require('node:util');
// 获取具有可中止信号的对象,例如自定义资源或操作。
const dependent = obtainSomethingAbortable();
// 将 `dependent` 作为资源传递,指示仅当 `dependent` 在信号中止时仍在内存中时,promise 才应解析。
aborted(dependent.signal, dependent).then(() => {
// 此代码在 `dependent` 中止时运行。
console.log('依赖资源已中止。');
});
// 模拟触发中止的事件。
dependent.on('event', () => {
dependent.abort(); // 这将导致 `aborted` promise 解析。
});import { aborted } from 'node:util';
// 获取具有可中止信号的对象,例如自定义资源或操作。
const dependent = obtainSomethingAbortable();
// 将 `dependent` 作为资源传递,指示仅当 `dependent` 在信号中止时仍在内存中时,promise 才应解析。
aborted(dependent.signal, dependent).then(() => {
// 此代码在 `dependent` 中止时运行。
console.log('依赖资源已中止。');
});
// 模拟触发中止的事件。
dependent.on('event', () => {
dependent.abort(); // 这将导致 `aborted` promise 解析。
});util.types
[历史]
| 版本 | 变更 |
|---|---|
| v15.3.0 | 公开为 require('util/types')。 |
| v10.0.0 | 添加于: v10.0.0 |
util.types 提供了对不同类型的内置对象的类型检查。 与 instanceof 或 Object.prototype.toString.call(value) 不同,这些检查不会检查可以从 JavaScript 访问的对象的属性(例如它们的原型),并且通常具有调用 C++ 的开销。
结果通常不保证值在 JavaScript 中公开的属性或行为的种类。 它们主要对希望在 JavaScript 中进行类型检查的插件开发者有用。
该 API 可通过 require('node:util').types 或 require('node:util/types') 访问。
util.types.isAnyArrayBuffer(value)
添加于: v10.0.0
如果该值是内置的 ArrayBuffer 或 SharedArrayBuffer 实例,则返回 true。
另请参阅 util.types.isArrayBuffer() 和 util.types.isSharedArrayBuffer()。
util.types.isAnyArrayBuffer(new ArrayBuffer()); // 返回 true
util.types.isAnyArrayBuffer(new SharedArrayBuffer()); // 返回 trueutil.types.isArrayBufferView(value)
添加于: v10.0.0
如果该值是 ArrayBuffer 视图之一的实例,例如类型化数组对象或 DataView,则返回 true。 等同于 ArrayBuffer.isView()。
util.types.isArrayBufferView(new Int8Array()); // true
util.types.isArrayBufferView(Buffer.from('hello world')); // true
util.types.isArrayBufferView(new DataView(new ArrayBuffer(16))); // true
util.types.isArrayBufferView(new ArrayBuffer()); // falseutil.types.isArgumentsObject(value)
加入版本: v10.0.0
如果该值是一个 arguments 对象,则返回 true。
function foo() {
util.types.isArgumentsObject(arguments); // 返回 true
}util.types.isArrayBuffer(value)
加入版本: v10.0.0
如果该值是一个内置的 ArrayBuffer 实例,则返回 true。 这不包括 SharedArrayBuffer 实例。 通常,需要同时测试两者; 请参阅 util.types.isAnyArrayBuffer()。
util.types.isArrayBuffer(new ArrayBuffer()); // 返回 true
util.types.isArrayBuffer(new SharedArrayBuffer()); // 返回 falseutil.types.isAsyncFunction(value)
加入版本: v10.0.0
如果该值是一个 async function,则返回 true。 这仅报告 JavaScript 引擎所看到的内容; 特别是,如果使用了转译工具,则返回值可能与原始源代码不匹配。
util.types.isAsyncFunction(function foo() {}); // 返回 false
util.types.isAsyncFunction(async function foo() {}); // 返回 trueutil.types.isBigInt64Array(value)
新增于: v10.0.0
如果该值是 BigInt64Array 实例,则返回 true。
util.types.isBigInt64Array(new BigInt64Array()); // 返回 true
util.types.isBigInt64Array(new BigUint64Array()); // 返回 falseutil.types.isBigIntObject(value)
新增于: v10.4.0
如果该值是一个 BigInt 对象,例如由 Object(BigInt(123)) 创建,则返回 true。
util.types.isBigIntObject(Object(BigInt(123))); // 返回 true
util.types.isBigIntObject(BigInt(123)); // 返回 false
util.types.isBigIntObject(123); // 返回 falseutil.types.isBigUint64Array(value)
新增于: v10.0.0
如果该值是 BigUint64Array 实例,则返回 true。
util.types.isBigUint64Array(new BigInt64Array()); // 返回 false
util.types.isBigUint64Array(new BigUint64Array()); // 返回 trueutil.types.isBooleanObject(value)
新增于: v10.0.0
如果该值是一个布尔对象,例如由 new Boolean() 创建,则返回 true。
util.types.isBooleanObject(false); // 返回 false
util.types.isBooleanObject(true); // 返回 false
util.types.isBooleanObject(new Boolean(false)); // 返回 true
util.types.isBooleanObject(new Boolean(true)); // 返回 true
util.types.isBooleanObject(Boolean(false)); // 返回 false
util.types.isBooleanObject(Boolean(true)); // 返回 falseutil.types.isBoxedPrimitive(value)
新增于: v10.11.0
如果该值是任何装箱的原始对象,例如由 new Boolean()、new String() 或 Object(Symbol()) 创建的,则返回 true。
例如:
util.types.isBoxedPrimitive(false); // 返回 false
util.types.isBoxedPrimitive(new Boolean(false)); // 返回 true
util.types.isBoxedPrimitive(Symbol('foo')); // 返回 false
util.types.isBoxedPrimitive(Object(Symbol('foo'))); // 返回 true
util.types.isBoxedPrimitive(Object(BigInt(5))); // 返回 trueutil.types.isCryptoKey(value)
新增于: v16.2.0
如果 value 是一个 <CryptoKey>,则返回 true,否则返回 false。
util.types.isDataView(value)
新增于: v10.0.0
如果该值是内置的 DataView 实例,则返回 true。
const ab = new ArrayBuffer(20);
util.types.isDataView(new DataView(ab)); // 返回 true
util.types.isDataView(new Float64Array()); // 返回 false另请参阅 ArrayBuffer.isView()。
util.types.isDate(value)
新增于: v10.0.0
如果该值是内置的 Date 实例,则返回 true。
util.types.isDate(new Date()); // 返回 trueutil.types.isExternal(value)
新增于: v10.0.0
如果该值是原生 External 值,则返回 true。
原生 External 值是一种特殊类型的对象,它包含一个原始 C++ 指针 (void*),用于从原生代码访问,并且没有其他属性。 这种对象由 Node.js 内部或原生插件创建。 在 JavaScript 中,它们是具有 null 原型的冻结对象。
#include <js_native_api.h>
#include <stdlib.h>
napi_value result;
static napi_value MyNapi(napi_env env, napi_callback_info info) {
int* raw = (int*) malloc(1024);
napi_status status = napi_create_external(env, (void*) raw, NULL, NULL, &result);
if (status != napi_ok) {
napi_throw_error(env, NULL, "napi_create_external failed");
return NULL;
}
return result;
}
...
DECLARE_NAPI_PROPERTY("myNapi", MyNapi)
...const native = require('napi_addon.node');
const data = native.myNapi();
util.types.isExternal(data); // 返回 true
util.types.isExternal(0); // 返回 false
util.types.isExternal(new String('foo')); // 返回 false有关 napi_create_external 的更多信息,请参阅 napi_create_external()。
util.types.isFloat32Array(value)
新增于: v10.0.0
如果该值是内置的 Float32Array 实例,则返回 true。
util.types.isFloat32Array(new ArrayBuffer()); // 返回 false
util.types.isFloat32Array(new Float32Array()); // 返回 true
util.types.isFloat32Array(new Float64Array()); // 返回 falseutil.types.isFloat64Array(value)
新增于: v10.0.0
如果该值是一个内置的 Float64Array 实例,则返回 true。
util.types.isFloat64Array(new ArrayBuffer()); // 返回 false
util.types.isFloat64Array(new Uint8Array()); // 返回 false
util.types.isFloat64Array(new Float64Array()); // 返回 trueutil.types.isGeneratorFunction(value)
新增于: v10.0.0
如果该值是一个生成器函数,则返回 true。 这仅报告 JavaScript 引擎所看到的内容; 特别是,如果使用了转译工具,则返回值可能与原始源代码不匹配。
util.types.isGeneratorFunction(function foo() {}); // 返回 false
util.types.isGeneratorFunction(function* foo() {}); // 返回 trueutil.types.isGeneratorObject(value)
新增于: v10.0.0
如果该值是由内置生成器函数返回的生成器对象,则返回 true。 这仅报告 JavaScript 引擎所看到的内容; 特别是,如果使用了转译工具,则返回值可能与原始源代码不匹配。
function* foo() {}
const generator = foo();
util.types.isGeneratorObject(generator); // 返回 trueutil.types.isInt8Array(value)
新增于: v10.0.0
如果该值是一个内置的 Int8Array 实例,则返回 true。
util.types.isInt8Array(new ArrayBuffer()); // 返回 false
util.types.isInt8Array(new Int8Array()); // 返回 true
util.types.isInt8Array(new Float64Array()); // 返回 falseutil.types.isInt16Array(value)
新增于: v10.0.0
如果该值是内置的 Int16Array 实例,则返回 true。
util.types.isInt16Array(new ArrayBuffer()); // 返回 false
util.types.isInt16Array(new Int16Array()); // 返回 true
util.types.isInt16Array(new Float64Array()); // 返回 falseutil.types.isInt32Array(value)
新增于: v10.0.0
如果该值是内置的 Int32Array 实例,则返回 true。
util.types.isInt32Array(new ArrayBuffer()); // 返回 false
util.types.isInt32Array(new Int32Array()); // 返回 true
util.types.isInt32Array(new Float64Array()); // 返回 falseutil.types.isKeyObject(value)
新增于: v16.2.0
如果 value 是一个 <KeyObject>,则返回 true,否则返回 false。
util.types.isMap(value)
新增于: v10.0.0
如果该值是内置的 Map 实例,则返回 true。
util.types.isMap(new Map()); // 返回 trueutil.types.isMapIterator(value)
Added in: v10.0.0
如果该值是由内置的 Map 实例返回的迭代器,则返回 true。
const map = new Map();
util.types.isMapIterator(map.keys()); // 返回 true
util.types.isMapIterator(map.values()); // 返回 true
util.types.isMapIterator(map.entries()); // 返回 true
util.types.isMapIterator(map[Symbol.iterator]()); // 返回 trueutil.types.isModuleNamespaceObject(value)
Added in: v10.0.0
如果该值是 模块命名空间对象 的实例,则返回 true。
import * as ns from './a.js';
util.types.isModuleNamespaceObject(ns); // 返回 trueutil.types.isNativeError(value)
Added in: v10.0.0
如果该值是由 内置 Error 类型 的构造函数返回的,则返回 true。
console.log(util.types.isNativeError(new Error())); // true
console.log(util.types.isNativeError(new TypeError())); // true
console.log(util.types.isNativeError(new RangeError())); // true原生错误类型的子类也是原生错误:
class MyError extends Error {}
console.log(util.types.isNativeError(new MyError())); // true一个值是原生错误类的 instanceof 并不等同于 isNativeError() 为该值返回 true。 isNativeError() 对于来自不同 realm 的错误返回 true,而 instanceof Error 对于这些错误返回 false:
const vm = require('node:vm');
const context = vm.createContext({});
const myError = vm.runInContext('new Error()', context);
console.log(util.types.isNativeError(myError)); // true
console.log(myError instanceof Error); // false相反,isNativeError() 对于所有不是由原生错误的构造函数返回的对象返回 false。 这包括 instanceof 原生错误的值:
const myError = { __proto__: Error.prototype };
console.log(util.types.isNativeError(myError)); // false
console.log(myError instanceof Error); // trueutil.types.isNumberObject(value)
新增于: v10.0.0
如果该值是数字对象(例如通过 new Number() 创建)则返回 true。
util.types.isNumberObject(0); // 返回 false
util.types.isNumberObject(new Number(0)); // 返回 trueutil.types.isPromise(value)
新增于: v10.0.0
如果该值是内置的 Promise 则返回 true。
util.types.isPromise(Promise.resolve(42)); // 返回 trueutil.types.isProxy(value)
新增于: v10.0.0
如果该值是 Proxy 实例则返回 true。
const target = {};
const proxy = new Proxy(target, {});
util.types.isProxy(target); // 返回 false
util.types.isProxy(proxy); // 返回 trueutil.types.isRegExp(value)
新增于: v10.0.0
如果该值是正则表达式对象则返回 true。
util.types.isRegExp(/abc/); // 返回 true
util.types.isRegExp(new RegExp('abc')); // 返回 trueutil.types.isSet(value)
加入于: v10.0.0
如果该值是内置的 Set 实例,则返回 true。
util.types.isSet(new Set()); // 返回 trueutil.types.isSetIterator(value)
加入于: v10.0.0
如果该值是为内置的 Set 实例返回的迭代器,则返回 true。
const set = new Set();
util.types.isSetIterator(set.keys()); // 返回 true
util.types.isSetIterator(set.values()); // 返回 true
util.types.isSetIterator(set.entries()); // 返回 true
util.types.isSetIterator(set[Symbol.iterator]()); // 返回 trueutil.types.isSharedArrayBuffer(value)
加入于: v10.0.0
如果该值是内置的 SharedArrayBuffer 实例,则返回 true。 这不包括 ArrayBuffer 实例。 通常,最好同时测试两者;有关此信息,请参见 util.types.isAnyArrayBuffer()。
util.types.isSharedArrayBuffer(new ArrayBuffer()); // 返回 false
util.types.isSharedArrayBuffer(new SharedArrayBuffer()); // 返回 trueutil.types.isStringObject(value)
新增于: v10.0.0
如果该值是字符串对象(例如由 new String() 创建的对象),则返回 true。
util.types.isStringObject('foo'); // 返回 false
util.types.isStringObject(new String('foo')); // 返回 trueutil.types.isSymbolObject(value)
新增于: v10.0.0
如果该值是符号对象(通过在 Symbol 原始值上调用 Object() 创建的对象),则返回 true。
const symbol = Symbol('foo');
util.types.isSymbolObject(symbol); // 返回 false
util.types.isSymbolObject(Object(symbol)); // 返回 trueutil.types.isTypedArray(value)
新增于: v10.0.0
如果该值是内置的 TypedArray 实例,则返回 true。
util.types.isTypedArray(new ArrayBuffer()); // 返回 false
util.types.isTypedArray(new Uint8Array()); // 返回 true
util.types.isTypedArray(new Float64Array()); // 返回 trueutil.types.isUint8Array(value)
新增于: v10.0.0
如果该值是内置的 Uint8Array 实例,则返回 true。
util.types.isUint8Array(new ArrayBuffer()); // 返回 false
util.types.isUint8Array(new Uint8Array()); // 返回 true
util.types.isUint8Array(new Float64Array()); // 返回 falseutil.types.isUint8ClampedArray(value)
新增于: v10.0.0
如果该值是内置的 Uint8ClampedArray 实例,则返回 true。
util.types.isUint8ClampedArray(new ArrayBuffer()); // 返回 false
util.types.isUint8ClampedArray(new Uint8ClampedArray()); // 返回 true
util.types.isUint8ClampedArray(new Float64Array()); // 返回 falseutil.types.isUint16Array(value)
新增于: v10.0.0
如果该值是内置的 Uint16Array 实例,则返回 true。
util.types.isUint16Array(new ArrayBuffer()); // 返回 false
util.types.isUint16Array(new Uint16Array()); // 返回 true
util.types.isUint16Array(new Float64Array()); // 返回 falseutil.types.isUint32Array(value)
新增于: v10.0.0
如果该值是内置的 Uint32Array 实例,则返回 true。
util.types.isUint32Array(new ArrayBuffer()); // 返回 false
util.types.isUint32Array(new Uint32Array()); // 返回 true
util.types.isUint32Array(new Float64Array()); // 返回 falseutil.types.isWeakMap(value)
新增于: v10.0.0
如果该值是内置的 WeakMap 实例,则返回 true。
util.types.isWeakMap(new WeakMap()); // 返回 trueutil.types.isWeakSet(value)
新增于: v10.0.0
如果该值是内置的 WeakSet 实例,则返回 true。
util.types.isWeakSet(new WeakSet()); // 返回 true废弃的 API
以下 API 已被弃用,不应再使用。 现有的应用程序和模块应更新以寻找替代方法。
util._extend(target, source)
新增于: v0.7.5
自以下版本弃用: v6.0.0
[Stable: 0 - Deprecated]
Stable: 0 稳定性: 0 - 已弃用:请改用 Object.assign()。
util._extend() 方法从来没有打算在 Node.js 内部模块之外使用。 社区找到了它并使用了它。
它已被弃用,不应在新代码中使用。 JavaScript 通过 Object.assign() 提供了非常相似的内置功能。
util.isArray(object)
新增于: v0.6.0
自以下版本弃用: v4.0.0
[Stable: 0 - Deprecated]
Stable: 0 稳定性: 0 - 已弃用:请改用 Array.isArray()。
Array.isArray() 的别名。
如果给定的 object 是一个 Array,则返回 true。 否则,返回 false。
const util = require('node:util');
util.isArray([]);
// 返回: true
util.isArray(new Array());
// 返回: true
util.isArray({});
// 返回: false