- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入 Node环境
- 子进程(Child processes)
- 集群(Cluster)
- 命令行选项
- 控制台(Console)
- 核心包(Corepack)
- 加密(Crypto)
- 调试器(Debugger)
- 已弃用的 API
- 诊断通道(Diagnostics Channel)
- 域名系统(DNS)
- 域(Domain)
- 错误(Errors)
- 事件(Events)
- 文件系统(File system)
- 全局变量(Globals)
- HTTP
- HTTP/2
- HTTPS
- 检查器(Inspector)
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:packages 模块
- 网络(Net)
- 系统(OS)
- 路径(Path)
- 性能挂钩(Performance hooks)
- 性能挂钩(Permissions)
- 进程(Process)
- Punycode 国际化域名编码
- 查询字符串(Query strings)
- 命令行库(Readline)
- REPL 交互式编程环境
- 诊断报告
- 单个可执行应用程序
- Stream 流
- 字符串解码器
- 单元测试
- 定时器(Timers)
- 传输层安全/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用程序
- V8
- 虚拟机
- WebAssembly
- Web加密 API(Web Crypto API)
- 网络流 API(Web Streams API)
- 工作线程(Worker threads)
- zlib
Node.js v18.18.2 文档
- Node.js v18.18.2
-
►
目录
- 实用程序
util.callbackify(original)
util.debuglog(section[, callback])
util.debug(section)
util.deprecate(fn, msg[, code])
util.format(format[, ...args])
util.formatWithOptions(inspectOptions, format[, ...args])
util.getSystemErrorName(err)
util.getSystemErrorMap()
util.inherits(constructor, superConstructor)
util.inspect(object[, options])
util.inspect(object[, showHidden[, depth[, colors]]])
util.isDeepStrictEqual(val1, val2)
- 类:
util.MIMEType
- 类:
util.MIMEParams
util.parseArgs([config])
util.promisify(original)
util.stripVTControlCharacters(str)
- 类:
util.TextDecoder
- 类:
util.TextEncoder
util.toUSVString(string)
util.transferableAbortController()
util.transferableAbortSignal(signal)
util.aborted(signal, resource)
util.types
util.types.isAnyArrayBuffer(value)
util.types.isArrayBufferView(value)
util.types.isArgumentsObject(value)
util.types.isArrayBuffer(value)
util.types.isAsyncFunction(value)
util.types.isBigInt64Array(value)
util.types.isBigUint64Array(value)
util.types.isBooleanObject(value)
util.types.isBoxedPrimitive(value)
util.types.isCryptoKey(value)
util.types.isDataView(value)
util.types.isDate(value)
util.types.isExternal(value)
util.types.isFloat32Array(value)
util.types.isFloat64Array(value)
util.types.isGeneratorFunction(value)
util.types.isGeneratorObject(value)
util.types.isInt8Array(value)
util.types.isInt16Array(value)
util.types.isInt32Array(value)
util.types.isKeyObject(value)
util.types.isMap(value)
util.types.isMapIterator(value)
util.types.isModuleNamespaceObject(value)
util.types.isNativeError(value)
util.types.isNumberObject(value)
util.types.isPromise(value)
util.types.isProxy(value)
util.types.isRegExp(value)
util.types.isSet(value)
util.types.isSetIterator(value)
util.types.isSharedArrayBuffer(value)
util.types.isStringObject(value)
util.types.isSymbolObject(value)
util.types.isTypedArray(value)
util.types.isUint8Array(value)
util.types.isUint8ClampedArray(value)
util.types.isUint16Array(value)
util.types.isUint32Array(value)
util.types.isWeakMap(value)
util.types.isWeakSet(value)
util.types.isWebAssemblyCompiledModule(value)
- 已弃用的 API
util._extend(target, source)
util.isArray(object)
util.isBoolean(object)
util.isBuffer(object)
util.isDate(object)
util.isError(object)
util.isFunction(object)
util.isNull(object)
util.isNullOrUndefined(object)
util.isNumber(object)
util.isObject(object)
util.isPrimitive(object)
util.isRegExp(object)
util.isString(object)
util.isSymbol(object)
util.isUndefined(object)
util.log(string)
- 实用程序
-
►
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ embedder API
- Child processes
- Cluster
- Command-line options
- Console
- Corepack
- Crypto
- Debugger
- Deprecated APIs
- Diagnostics Channel
- DNS
- Domain
- Errors
- Events
- File system
- Globals
- HTTP
- HTTP/2
- HTTPS
- Inspector
- Internationalization
- Modules: CommonJS modules
- Modules: ECMAScript modules
- Modules:
node:module
API - Modules: Packages
- Net
- 系统(OS)
- 路径(Path)
- Performance hooks
- Permissions
- 进程(Process)
- Punycode
- Query strings
- 命令行库(Readline)
- REPL 交互式编程环境
- Report
- Single executable applications
- Stream
- String decoder
- Test runner
- Timers
- TLS/SSL
- Trace events
- TTY
- UDP/datagram
- URL
- Utilities
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- Worker threads
- Zlib
- ► 其他版本
- ► 选项
目录
- 实用程序
util.callbackify(original)
util.debuglog(section[, callback])
util.debug(section)
util.deprecate(fn, msg[, code])
util.format(format[, ...args])
util.formatWithOptions(inspectOptions, format[, ...args])
util.getSystemErrorName(err)
util.getSystemErrorMap()
util.inherits(constructor, superConstructor)
util.inspect(object[, options])
util.inspect(object[, showHidden[, depth[, colors]]])
util.isDeepStrictEqual(val1, val2)
- 类:
util.MIMEType
- 类:
util.MIMEParams
util.parseArgs([config])
util.promisify(original)
util.stripVTControlCharacters(str)
- 类:
util.TextDecoder
- 类:
util.TextEncoder
util.toUSVString(string)
util.transferableAbortController()
util.transferableAbortSignal(signal)
util.aborted(signal, resource)
util.types
util.types.isAnyArrayBuffer(value)
util.types.isArrayBufferView(value)
util.types.isArgumentsObject(value)
util.types.isArrayBuffer(value)
util.types.isAsyncFunction(value)
util.types.isBigInt64Array(value)
util.types.isBigUint64Array(value)
util.types.isBooleanObject(value)
util.types.isBoxedPrimitive(value)
util.types.isCryptoKey(value)
util.types.isDataView(value)
util.types.isDate(value)
util.types.isExternal(value)
util.types.isFloat32Array(value)
util.types.isFloat64Array(value)
util.types.isGeneratorFunction(value)
util.types.isGeneratorObject(value)
util.types.isInt8Array(value)
util.types.isInt16Array(value)
util.types.isInt32Array(value)
util.types.isKeyObject(value)
util.types.isMap(value)
util.types.isMapIterator(value)
util.types.isModuleNamespaceObject(value)
util.types.isNativeError(value)
util.types.isNumberObject(value)
util.types.isPromise(value)
util.types.isProxy(value)
util.types.isRegExp(value)
util.types.isSet(value)
util.types.isSetIterator(value)
util.types.isSharedArrayBuffer(value)
util.types.isStringObject(value)
util.types.isSymbolObject(value)
util.types.isTypedArray(value)
util.types.isUint8Array(value)
util.types.isUint8ClampedArray(value)
util.types.isUint16Array(value)
util.types.isUint32Array(value)
util.types.isWeakMap(value)
util.types.isWeakSet(value)
util.types.isWebAssemblyCompiledModule(value)
- 已弃用的 API
util._extend(target, source)
util.isArray(object)
util.isBoolean(object)
util.isBuffer(object)
util.isDate(object)
util.isError(object)
util.isFunction(object)
util.isNull(object)
util.isNullOrUndefined(object)
util.isNumber(object)
util.isObject(object)
util.isPrimitive(object)
util.isRegExp(object)
util.isString(object)
util.isSymbol(object)
util.isUndefined(object)
util.log(string)
实用程序#
源代码: lib/util.js
node:util
模块支持 Node.js 内部 API 的需求。许多实用程序对于应用程序和模块开发人员也很有用。要访问它:
const util = require('node:util');
util.callbackify(original)
#
original
<函数>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) => {
// When the Promise was rejected with `null` it is wrapped with an Error and
// the original value is stored in `reason`.
err && Object.hasOwn(err, 'reason') && err.reason === null; // true
});
util.debuglog(section[, callback])
#
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('hello from foo [%d]', 123);
如果该程序在环境中使用NODE_DEBUG=foo
运行,那么它将输出如下内容:
FOO 3245: hello from foo [123]
其中3245
是进程 ID。如果它没有在设置的环境变量下运行,那么它不会打印任何内容。
section
还支持通配符:
const util = require('node:util');
const debuglog = util.debuglog('foo-bar');
debuglog('hi there, it\'s foo-bar [%d]', 2333);
如果它在环境中使用NODE_DEBUG=foo*
运行,那么它将输出如下内容:
FOO-BAR 3257: hi there, it's foo-bar [2333]
可以在NODE_DEBUG
环境变量中指定多个以逗号分隔的section
名称
:NODE_DEBUG=fs,net,tls
。
可选的callback
参数可用于将日志记录函数替换为没有任何初始化或不必要的包装的不同函数。
const util = require('node:util');
let debuglog = util.debuglog('internals', (debug) => {
// Replace with a logging function that optimizes out
// testing if the section is enabled
debuglog = debug;
});
debuglog().enabled
#
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)
#
util.debuglog
的别名。使用允许可读性并不意味着仅使用util.debuglog().enabled
时进行记录。
util.deprecate(fn, msg[, code])
#
fn
<Function>已弃用的函数。msg
<string>调用已弃用的函数时显示的警告消息。code
<string>弃用代码。有关代码列表,请参阅已弃用的 API 列表。- 返回:<Function>已弃用的函数被包装以发出警告。
util.deprecate()
方法以标记为已弃用的方式包装fn
(可以是函数或类)。
const util = require('node:util');
exports.obsoleteFunction = util.deprecate(() => {
// Do something here.
}, 'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');
调用时,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(); // Emits a deprecation warning with code DEP0001
fn2(); // Does not emit a deprecation warning because it has the same code
如果使用--no-deprecation
或--no-warnings
命令行标志,或者如果process.noDeprecation
属性在第一个之前设置为true
弃用警告,util.deprecate()
方法不执行任何操作。
如果设置了--trace-deprecation
或--trace-warnings
命令行标志,或者process.traceDeprecation
属性设置为true
,则会出现警告和堆栈第一次调用已弃用的函数时,trace 会打印到stderr
。
如果设置了--throw-deprecation
命令行标志,或者
将process.throwDeprecation
属性设置为true
,则在调用已弃用的函数时将引发异常。
--throw-deprecation
命令行标志和process.throwDeprecation
属性优先于--trace-deprecation
和
process.traceDeprecation
。
util.format(format[, ...args])
#
format
<string>类似于printf
的格式字符串。
util.format()
方法使用第一个参数作为类似printf
的格式字符串返回一个格式化字符串,该字符串可以包含零个或多个格式说明符。每个说明符都替换为相应参数的转换值。支持的说明符有:
%s
:String
将用于转换除BigInt
、Object
和-0
之外的所有值。BigInt
值将用n
表示,并且没有用户定义的toString
函数的对象将使用带有 选项{ depth: 0, colors: false, compact: 3 }
%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');
// Returns: 'foo:%s'
如果不属于格式字符串的值的类型
不是string
,则使用util.inspect()
进行格式化。
如果传递给util.format()
方法的参数多于说明符的数量,则额外的参数将连接到返回的字符串,并以空格分隔:
util.format('%s:%s', 'foo', 'bar', 'baz');
// Returns: 'foo:bar baz'
如果第一个参数不包含有效的格式说明符,则util.format()
返回一个由空格分隔的所有参数串联而成的字符串:
util.format(1, 2, 3);
// Returns: '1 2 3'
如果仅将一个参数传递给util.format()
,则该参数将按原样返回,不带任何格式:
util.format('%% %s');
// Returns: '%% %s'
util.format()
是一种同步方法,旨在用作调试工具。某些输入值可能会产生显着的性能开销,从而阻塞事件循环。请小心使用此函数,切勿在热代码路径中使用。
util.formatWithOptions(inspectOptions, format[, ...args])
#
此函数与util.format()
相同,不同之处在于它采用inspectOptions
参数,该参数指定传递给
util.inspect()
的选项。
util.formatWithOptions({ colors: true }, 'See object %O', { foo: 42 });
// Returns 'See object { foo: 42 }', where `42` is colored as a number
// when printed to a terminal.
util.getSystemErrorName(err)
#
返回来自 Node.js API 的数字错误代码的字符串名称。错误代码和错误名称之间的映射取决于平台。有关常见错误的名称,请参阅常见系统错误。
fs.access('file/that/does/not/exist', (err) => {
const name = util.getSystemErrorName(err.errno);
console.error(name); // ENOENT
});
util.getSystemErrorMap()
#
- 返回:<地图>
返回 Node.js API 中可用的所有系统错误代码的映射。错误代码和错误名称之间的映射取决于平台。有关常见错误的名称,请参阅常见系统错误。
fs.access('file/that/does/not/exist', (err) => {
const errorMap = util.getSystemErrorMap();
const name = errorMap.get(err.errno);
console.error(name); // ENOENT
});
util.inherits(constructor, superConstructor)
#
extends
关键字。不鼓励使用util.inherits()
。请使用 ES6 class
和
extends
关键字来获取语言级别继承支持。另请注意,这两种样式在语义上是不兼容的。
将原型方法从一个构造函数继承到另一个构造函数。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]]])
object
<any>任何 JavaScript 原语或Object
。options
<对象>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
、WeakMap
和WeakSet
元素的最大数量格式化时。设置为null
或Infinity
以显示所有元素。设置为0
或负数以不显示任何元素。默认值:100
。maxStringLength
<整数>指定格式化时要包含的最大字符数。设置为null
或Infinity
以显示所有元素。设置为0
或负数以不显示字符。默认值:10000
。breakLength
<integer>输入值拆分为多行的长度。设置为Infinity
将输入格式设置为单行(与设置为true
或任意数字 >=1
的compact
结合) 。 默认值:80
。compact
<布尔值> | <integer>将其设置为false
会导致每个对象键显示在新行上。它将在长度超过breakLength
的文本中换行。如果设置为数字,则只要所有属性都适合breakLength
,最多的n
内部元素就会统一在一行上。短数组元素也被分组在一起。有关更多信息,请参阅下面的示例。默认值:3
。sorted
<布尔值> | <Function>如果设置为true
或函数,则对象的所有属性以及Set
和Map
条目都会在结果字符串中排序。如果设置为true
,则使用默认排序。如果设置为函数,则将其用作比较函数。getters
<布尔值> | <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(thousand, million, bigNumber, bigDecimal);
// 1_000 1_000_000 123_456_789n 1_234.123_45
util.inspect()
是一种用于调试的同步方法。其最大输出长度约为 128 MiB。导致较长输出的输入将被截断。
自定义util.inspect
颜色#
util.inspect
的颜色输出(如果启用)可通过util.inspect.styles
和util.inspect.colors
属性进行全局自定义。
util.inspect.styles
是将样式名称与util.inspect.colors
中的颜色相关联的映射
。
默认样式和关联颜色为:
bigint
:yellow
boolean
:yellow
date
:magenta
module
:underline
name
:(无样式)null
:bold
number
:yellow
regexp
:red
special
:cyan
(例如,Proxies
)string
:green
symbol
:green
undefined
:grey
颜色样式使用可能并非所有终端都支持的 ANSI 控制代码。要验证颜色支持,请使用tty.hasColors()
。
下面列出了预定义的控制代码(分为“修饰符”、“前景色”和“背景色”)。
修饰符#
不同终端的修饰符支持有所不同。如果不支持的话,它们大多会被忽略。
reset
- 将所有(颜色)修饰符重置为默认值- 粗体- 使文本加粗
- italic - 使文本斜体
- underline - 使文本带有下划线
删除线- 在文本中心放置一条水平线(别名:strikeThrough
、crossedout
、crossedOut
)hidden
- 打印文本,但使其不可见(别名:隐藏)- 暗淡- 颜色强度降低(别名:
faint
) - overlined - 使文本带有上划线
- 闪烁 - 以一定间隔隐藏和显示文本
- inverse - 交换前景色和背景色(别名:
swapcolors
、swapColors
) - doubleunderline - 使文本加双下划线(别名:
doubleUnderline
) - 框架- 在文本周围绘制框架
前景色#
black
red
green
yellow
blue
magenta
cyan
white
gray
(别名:grey
、blackBright
)redBright
greenBright
yellowBright
blueBright
magentaBright
cyanBright
whiteBright
背景颜色#
bgBlack
bgRed
bgGreen
bgYellow
bgBlue
bgMagenta
bgCyan
bgWhite
bgGray
(别名:bgGrey
、bgBlackBright
)bgRedBright
bgGreenBright
bgYellowBright
bgBlueBright
bgMagentaBright
bgCyanBright
bgWhiteBright
对象的自定义检查功能#
对象还可以定义自己的
[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,
});
// Five space padding because that's the size of "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);
// Returns: "Box< true >"
自定义[util.inspect.custom](depth, opts, inspect)
函数通常返回一个字符串,但也可以返回将由util.inspect()
相应格式化的任何类型的值。
const util = require('node:util');
const obj = { foo: 'this will not show up in the inspect() output' };
obj[util.inspect.custom] = (depth) => {
return { bar: 'baz' };
};
util.inspect(obj);
// Returns: "{ bar: 'baz' }"
util.inspect.custom
#
- <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);
// Prints Password <xxxxxxxx>
有关更多详细信息,请参阅对象上的自定义检查函数。
util.inspect.defaultOptions
#
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); // Logs the truncated array
util.inspect.defaultOptions.maxArrayLength = null;
console.log(arr); // logs the full array
util.isDeepStrictEqual(val1, val2)
#
如果val1
和val2
之间存在深度严格相等,则返回 true
。否则,返回false
。
有关深度严格相等的更多信息,请参阅assert.deepStrictEqual()
。
类:util.MIMEType
#
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/plain
const { MIMEType } = require('node:util');
const myMIME = new MIMEType({ toString: () => 'text/plain' });
console.log(String(myMIME));
// Prints: text/plain
mime.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/javascript
const { 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/javascript
mime.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/javascript
const { 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/javascript
mime.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=value
const { 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=value
mime.params
#
获取表示 MIME 参数的MIMEParams
对象。该属性是只读的。有关详细信息,请参阅
MIMEParams
文档。
mime.toString()
#
- 返回:<字符串>
MIMEType
对象上的toString()
方法返回序列化的 MIME。
由于需要符合标准,该方法不允许用户自定义 MIME 的序列化过程。
mime.toJSON()
#
- 返回:<字符串>
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
#
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
<字符串>
删除所有名称为name
的名称-值对。
mimeParams.entries()
#
- 返回:<迭代器>
返回参数中每个名称/值对的迭代器。迭代器的每一项都是 JavaScript Array
。数组的第一项是name
,数组的第二项是value
。
mimeParams.get(name)
#
返回第一个名称为name
的名称-值对的值。如果没有这样的对,则返回null
。
mimeParams.has(name)
#
如果至少有一个名称为name
的名称-值对,则返回true
。
mimeParams.keys()
#
- 返回:<迭代器>
返回每个名称-值对的名称的迭代器。
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
// bar
const { 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
// bar
mimeParams.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=xyz
const { 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=xyz
mimeParams.values()
#
- 返回:<迭代器>
返回每个名称-值对的值的迭代器。
mimeParams[@@iterator]()
#
- 返回:<迭代器>
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 baz
const { 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 baz
util.parseArgs([config])
#
-
config
<Object>用于提供解析参数并配置解析器。config
支持以下属性:args
<string[]>参数字符串数组。默认值:process.argv
,删除了execPath
和filename
。options
<Object>用于描述解析器已知的参数。options
的键是选项的长名称,值是 接受以下属性的 <Object> :strict
<boolean>当遇到未知参数或传递的参数与type
中配置的type
不匹配时是否应该抛出错误 。 默认值:true
。allowPositionals
<boolean>此命令是否接受位置参数。 默认值: 如果strict
是true
,则为false
,否则为true
。tokens
<boolean>返回解析后的标记。这对于扩展内置行为非常有用,从添加额外的检查到以不同的方式重新处理令牌。 默认值:false
。
-
返回:<Object>解析的命令行参数:
values
<Object>已解析选项名称与其<string> 或<boolean>值的映射。positionals
<string[]>位置参数。tokens
<对象[]> | <未定义>请参阅parseArgs 标记 部分。仅当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' } []
util.parseArgs
是实验性的,行为可能会改变。加入pkgjs/parseargs中的对话,为设计做出贡献。
parseArgs
tokens
#
通过在配置中指定tokens: true
可以获取详细的解析信息来添加自定义行为。返回的令牌具有描述以下属性:
- 所有代币
kind
<string> “选项”、“位置”或“选项终止符”之一。index
<number>包含标记的args
中元素的索引。因此令牌的源参数是args[token.index]
。
- 期权代币
- 位置标记
value
<string> args 中位置参数的值(即args[index]
)。
- 选项终止符标记
返回的标记按照输入参数中遇到的顺序排列。在 args 中出现多次的选项每次使用都会生成一个标记。像-xy
这样的短选项组会扩展为每个选项的标记。因此-xxx
生成三个标记。
例如,要使用返回的令牌添加对--no-color
之类的否定选项的支持,可以重新处理令牌以更改为否定选项存储的值。
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.promisify(original)
#
采用遵循常见错误优先回调风格的函数,即采用(err, value) => ...
回调作为最后一个参数,并返回一个返回 Promise 的版本。
const util = require('node:util');
const fs = require('node:fs');
const stat = util.promisify(fs.stat);
stat('.').then((stats) => {
// Do something with `stats`
}).catch((error) => {
// Handle the error.
});
或者,等效地使用async function
s:
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(`This directory is owned by ${stats.uid}`);
}
如果存在original[util.promisify.custom]
属性,则promisify
将返回其值,请参阅自定义 Promisified 函数。
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: Cannot read property 'a' of undefined
// 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'
这对于原始函数不遵循将错误优先回调作为最后一个参数的标准格式的情况很有用。
例如,使用接受
(foo, onSuccessCallback, onErrorCallback)
的函数:
doSomething[util.promisify.custom] = (foo) => {
return new Promise((resolve, reject) => {
doSomething(foo, resolve, reject);
});
};
如果定义了promisify.custom
但不是函数,则promisify()
将引发错误。
util.promisify.custom
#
- <symbol>可用于声明函数的自定义 Promisified 变体,请参阅自定义 Promisified 函数。
除了可以通过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)
#
返回str
,并删除所有 ANSI 转义码。
console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m'));
// Prints "value"
类:util.TextDecoder
#
WHATWG 编码标准 TextDecoder
API的实现。
const decoder = new TextDecoder();
const u8arr = new Uint8Array([72, 101, 108, 108, 111]);
console.log(decoder.decode(u8arr)); // Hello
WHATWG 支持的编码#
根据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' |
使用small-icu
选项构建 Node.js 时支持的编码#
编码 | 别名 |
---|---|
'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> | <数据视图> | <TypedArray>包含编码数据的ArrayBuffer
、DataView
或TypedArray
实例。options
<对象>stream
<boolean>true
如果需要额外的数据块。 默认值:false
。
- 返回:<字符串>
解码input
并返回一个字符串。如果options.stream
为true
,则input
末尾出现的任何不完整字节序列都会在内部缓冲,并在下一次调用textDecoder.decode()
后发出。
如果textDecoder.fatal
是true
,则发生的解码错误将导致抛出
TypeError
。
textDecoder.encoding
#
TextDecoder
实例支持的编码。
textDecoder.fatal
#
如果解码错误导致抛出TypeError
,则该值将为true
。
textDecoder.ignoreBOM
#
如果解码结果包含字节顺序标记,则该值将为true
。
类:util.TextEncoder
#
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)
#
src
<string>要编码的文本。dest
<Uint8Array>保存编码结果的数组。- 返回:<对象>
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)
#
string
<字符串>
用 Unicode“替换字符”U+FFFD 替换任何代理代码点(或同等地,任何未配对的代理代码单元)后返回string
。
util.transferableAbortController()
#
创建并返回一个<AbortController>实例,其<AbortSignal>被标记为可转移,并且可以与structuredClone()
或postMessage()
一起使用。
util.transferableAbortSignal(signal)
#
将给定的<AbortSignal>标记为可转移,以便它可以与
structuredClone()
和postMessage()
一起使用。
const signal = transferableAbortSignal(AbortSignal.timeout(100));
const channel = new MessageChannel();
channel.port2.postMessage(signal, [signal]);
util.aborted(signal, resource)
#
signal
<中止信号>resource
<Object>任何非空实体,对其的引用是弱保留的。- 返回:< Promise >
侦听提供的signal
上的中止事件,并返回当signal
中止时履行的 Promise 。如果在signal
中止之前传递的resource
被垃圾回收,则返回的 Promise 将无限期地保持挂起状态。
const { aborted } = require('node:util');
const dependent = obtainSomethingAbortable();
aborted(dependent.signal, dependent).then(() => {
// Do something when dependent is aborted.
});
dependent.on('event', () => {
dependent.abort();
});
import { aborted } from 'node:util';
const dependent = obtainSomethingAbortable();
aborted(dependent.signal, dependent).then(() => {
// Do something when dependent is aborted.
});
dependent.on('event', () => {
dependent.abort();
});
util.types
#
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)
#
如果该值是内置的 ArrayBuffer
或
SharedArrayBuffer
实例,则返回 true
。
另请参阅util.types.isArrayBuffer()
和
util.types.isSharedArrayBuffer()
。
util.types.isAnyArrayBuffer(new ArrayBuffer()); // Returns true
util.types.isAnyArrayBuffer(new SharedArrayBuffer()); // Returns true
util.types.isArrayBufferView(value)
#
如果值是 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()); // false
util.types.isArgumentsObject(value)
#
如果值是arguments
对象,则返回true
。
function foo() {
util.types.isArgumentsObject(arguments); // Returns true
}
util.types.isArrayBuffer(value)
#
如果该值是内置的ArrayBuffer
实例,则返回true
。这不包括 SharedArrayBuffer
实例。通常,需要对两者进行测试;请参阅util.types.isAnyArrayBuffer()
了解这一点。
util.types.isArrayBuffer(new ArrayBuffer()); // Returns true
util.types.isArrayBuffer(new SharedArrayBuffer()); // Returns false
util.types.isAsyncFunction(value)
#
如果该值是异步函数,则返回true
。这仅报告 JavaScript 引擎所看到的内容;特别是,如果使用转译工具,返回值可能与原始源代码不匹配。
util.types.isAsyncFunction(function foo() {}); // Returns false
util.types.isAsyncFunction(async function foo() {}); // Returns true
util.types.isBigInt64Array(value)
#
如果值是BigInt64Array
实例,则返回true
。
util.types.isBigInt64Array(new BigInt64Array()); // Returns true
util.types.isBigInt64Array(new BigUint64Array()); // Returns false
util.types.isBigUint64Array(value)
#
如果值是BigUint64Array
实例,则返回true
。
util.types.isBigUint64Array(new BigInt64Array()); // Returns false
util.types.isBigUint64Array(new BigUint64Array()); // Returns true
util.types.isBooleanObject(value)
#
如果值是布尔对象(例如由new Boolean()
创建),则返回true
。
util.types.isBooleanObject(false); // Returns false
util.types.isBooleanObject(true); // Returns false
util.types.isBooleanObject(new Boolean(false)); // Returns true
util.types.isBooleanObject(new Boolean(true)); // Returns true
util.types.isBooleanObject(Boolean(false)); // Returns false
util.types.isBooleanObject(Boolean(true)); // Returns false
util.types.isBoxedPrimitive(value)
#
如果该值是任何装箱原始对象,例如由new Boolean()
、 new String()
或Object(Symbol())
创建,则返回 true
。
例如:
util.types.isBoxedPrimitive(false); // Returns false
util.types.isBoxedPrimitive(new Boolean(false)); // Returns true
util.types.isBoxedPrimitive(Symbol('foo')); // Returns false
util.types.isBoxedPrimitive(Object(Symbol('foo'))); // Returns true
util.types.isBoxedPrimitive(Object(BigInt(5))); // Returns true
util.types.isCryptoKey(value)
#
如果value
是<CryptoKey> ,则返回 true
,否则返回false
。
util.types.isDataView(value)
#
如果该值是内置的DataView
实例,则返回true
。
const ab = new ArrayBuffer(20);
util.types.isDataView(new DataView(ab)); // Returns true
util.types.isDataView(new Float64Array()); // Returns false
另请参阅ArrayBuffer.isView()
。
util.types.isDate(value)
#
如果该值是内置Date
实例,则返回true
。
util.types.isDate(new Date()); // Returns true
util.types.isExternal(value)
#
如果该值是本机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); // returns true
util.types.isExternal(0); // returns false
util.types.isExternal(new String('foo')); // returns false
有关napi_create_external
的更多信息,请参阅
napi_create_external()
。
util.types.isFloat32Array(value)
#
如果该值是内置的Float32Array
实例,则返回true
。
util.types.isFloat32Array(new ArrayBuffer()); // Returns false
util.types.isFloat32Array(new Float32Array()); // Returns true
util.types.isFloat32Array(new Float64Array()); // Returns false
util.types.isFloat64Array(value)
#
如果该值是内置的Float64Array
实例,则返回true
。
util.types.isFloat64Array(new ArrayBuffer()); // Returns false
util.types.isFloat64Array(new Uint8Array()); // Returns false
util.types.isFloat64Array(new Float64Array()); // Returns true
util.types.isGeneratorFunction(value)
#
如果该值是生成器函数,则返回true
。这仅报告 JavaScript 引擎所看到的内容;特别是,如果使用转译工具,返回值可能与原始源代码不匹配。
util.types.isGeneratorFunction(function foo() {}); // Returns false
util.types.isGeneratorFunction(function* foo() {}); // Returns true
util.types.isGeneratorObject(value)
#
如果该值是从内置生成器函数返回的生成器对象,则返回true
。这仅报告 JavaScript 引擎所看到的内容;特别是,如果使用转译工具,返回值可能与原始源代码不匹配。
function* foo() {}
const generator = foo();
util.types.isGeneratorObject(generator); // Returns true
util.types.isInt8Array(value)
#
如果该值是内置的Int8Array
实例,则返回true
。
util.types.isInt8Array(new ArrayBuffer()); // Returns false
util.types.isInt8Array(new Int8Array()); // Returns true
util.types.isInt8Array(new Float64Array()); // Returns false
util.types.isInt16Array(value)
#
如果该值是内置的Int16Array
实例,则返回true
。
util.types.isInt16Array(new ArrayBuffer()); // Returns false
util.types.isInt16Array(new Int16Array()); // Returns true
util.types.isInt16Array(new Float64Array()); // Returns false
util.types.isInt32Array(value)
#
如果该值是内置的Int32Array
实例,则返回true
。
util.types.isInt32Array(new ArrayBuffer()); // Returns false
util.types.isInt32Array(new Int32Array()); // Returns true
util.types.isInt32Array(new Float64Array()); // Returns false
util.types.isKeyObject(value)
#
如果value
是<KeyObject> ,则返回 true
,否则返回false
。
util.types.isMap(value)
#
如果该值是内置的Map
实例,则返回true
。
util.types.isMap(new Map()); // Returns true
util.types.isMapIterator(value)
#
如果该值是为内置
Map
实例返回的迭代器,则返回true
。
const map = new Map();
util.types.isMapIterator(map.keys()); // Returns true
util.types.isMapIterator(map.values()); // Returns true
util.types.isMapIterator(map.entries()); // Returns true
util.types.isMapIterator(map[Symbol.iterator]()); // Returns true
util.types.isModuleNamespaceObject(value)
#
如果该值是Module Namespace Object的实例,则返回true
。
import * as ns from './a.js';
util.types.isModuleNamespaceObject(ns); // Returns true
util.types.isNativeError(value)
#
如果值是由内置
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()
返回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); // true
util.types.isNumberObject(value)
#
如果值是数字对象(例如由new Number()
创建),则返回true
。
util.types.isNumberObject(0); // Returns false
util.types.isNumberObject(new Number(0)); // Returns true
util.types.isPromise(value)
#
如果该值是内置的Promise
,则返回true
。
util.types.isPromise(Promise.resolve(42)); // Returns true
util.types.isProxy(value)
#
如果值是Proxy
实例,则返回true
。
const target = {};
const proxy = new Proxy(target, {});
util.types.isProxy(target); // Returns false
util.types.isProxy(proxy); // Returns true
util.types.isRegExp(value)
#
如果值是正则表达式对象,则返回true
。
util.types.isRegExp(/abc/); // Returns true
util.types.isRegExp(new RegExp('abc')); // Returns true
util.types.isSet(value)
#
如果该值是内置的Set
实例,则返回true
。
util.types.isSet(new Set()); // Returns true
util.types.isSetIterator(value)
#
如果该值是为内置
Set
实例返回的迭代器,则返回true
。
const set = new Set();
util.types.isSetIterator(set.keys()); // Returns true
util.types.isSetIterator(set.values()); // Returns true
util.types.isSetIterator(set.entries()); // Returns true
util.types.isSetIterator(set[Symbol.iterator]()); // Returns true
util.types.isSharedArrayBuffer(value)
#
如果该值是内置的SharedArrayBuffer
实例,则返回true
。这不包括 ArrayBuffer
实例。通常,需要对两者进行测试;请参阅util.types.isAnyArrayBuffer()
了解这一点。
util.types.isSharedArrayBuffer(new ArrayBuffer()); // Returns false
util.types.isSharedArrayBuffer(new SharedArrayBuffer()); // Returns true
util.types.isStringObject(value)
#
如果值是字符串对象(例如由new String()
创建),则返回true
。
util.types.isStringObject('foo'); // Returns false
util.types.isStringObject(new String('foo')); // Returns true
util.types.isSymbolObject(value)
#
如果该值是通过对Symbol
原语调用Object()
创建的符号对象,则返回true
。
const symbol = Symbol('foo');
util.types.isSymbolObject(symbol); // Returns false
util.types.isSymbolObject(Object(symbol)); // Returns true
util.types.isTypedArray(value)
#
如果该值是内置的TypedArray
实例,则返回true
。
util.types.isTypedArray(new ArrayBuffer()); // Returns false
util.types.isTypedArray(new Uint8Array()); // Returns true
util.types.isTypedArray(new Float64Array()); // Returns true
另请参阅ArrayBuffer.isView()
。
util.types.isUint8Array(value)
#
如果该值是内置Uint8Array
实例,则返回true
。
util.types.isUint8Array(new ArrayBuffer()); // Returns false
util.types.isUint8Array(new Uint8Array()); // Returns true
util.types.isUint8Array(new Float64Array()); // Returns false
util.types.isUint8ClampedArray(value)
#
如果该值是内置的Uint8ClampedArray
实例,则返回true
。
util.types.isUint8ClampedArray(new ArrayBuffer()); // Returns false
util.types.isUint8ClampedArray(new Uint8ClampedArray()); // Returns true
util.types.isUint8ClampedArray(new Float64Array()); // Returns false
util.types.isUint16Array(value)
#
如果该值是内置的Uint16Array
实例,则返回true
。
util.types.isUint16Array(new ArrayBuffer()); // Returns false
util.types.isUint16Array(new Uint16Array()); // Returns true
util.types.isUint16Array(new Float64Array()); // Returns false
util.types.isUint32Array(value)
#
如果该值是内置的Uint32Array
实例,则返回true
。
util.types.isUint32Array(new ArrayBuffer()); // Returns false
util.types.isUint32Array(new Uint32Array()); // Returns true
util.types.isUint32Array(new Float64Array()); // Returns false
util.types.isWeakMap(value)
#
如果该值是内置的WeakMap
实例,则返回true
。
util.types.isWeakMap(new WeakMap()); // Returns true
util.types.isWeakSet(value)
#
如果该值是内置的WeakSet
实例,则返回true
。
util.types.isWeakSet(new WeakSet()); // Returns true
util.types.isWebAssemblyCompiledModule(value)
#
value instanceof WebAssembly.Module
代替。如果该值是内置的WebAssembly.Module
实例,则返回true
。
const module = new WebAssembly.Module(wasmBuffer);
util.types.isWebAssemblyCompiledModule(module); // Returns true
已弃用的 API#
以下 API 已弃用,不应再使用。应更新现有的应用程序和模块以寻找替代方法。
util._extend(target, source)
#
Object.assign()
代替。util._extend()
方法从未打算在内部 Node.js 模块之外使用。无论如何,社区发现并使用了它。
它已被弃用,不应在新代码中使用。JavaScript 通过Object.assign()
提供了非常相似的内置功能。
util.isArray(object)
#
Array.isArray()
代替。Array.isArray()
的别名。
如果给定的object
是Array
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isArray([]);
// Returns: true
util.isArray(new Array());
// Returns: true
util.isArray({});
// Returns: false
util.isBoolean(object)
#
typeof value === 'boolean'
代替。如果给定的object
是Boolean
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isBoolean(1);
// Returns: false
util.isBoolean(0);
// Returns: false
util.isBoolean(false);
// Returns: true
util.isBuffer(object)
#
Buffer.isBuffer()
代替。如果给定的object
是Buffer
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isBuffer({ length: 0 });
// Returns: false
util.isBuffer([]);
// Returns: false
util.isBuffer(Buffer.from('hello world'));
// Returns: true
util.isDate(object)
#
util.types.isDate()
代替。如果给定的object
是Date
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isDate(new Date());
// Returns: true
util.isDate(Date());
// false (without 'new' returns a String)
util.isDate({});
// Returns: false
util.isError(object)
#
util.types.isNativeError()
代替。如果给定的object
是Error
,则返回true
。否则,返回
false
。
const util = require('node:util');
util.isError(new Error());
// Returns: true
util.isError(new TypeError());
// Returns: true
util.isError({ name: 'Error', message: 'an error occurred' });
// Returns: false
此方法依赖于Object.prototype.toString()
行为。当object
参数操作
@@toStringTag
时,可能会获得不正确的结果。
const util = require('node:util');
const obj = { name: 'Error', message: 'an error occurred' };
util.isError(obj);
// Returns: false
obj[Symbol.toStringTag] = 'Error';
util.isError(obj);
// Returns: true
util.isFunction(object)
#
typeof value === 'function'
代替。如果给定的object
是Function
,则返回true
。否则,返回
false
。
const util = require('node:util');
function Foo() {}
const Bar = () => {};
util.isFunction({});
// Returns: false
util.isFunction(Foo);
// Returns: true
util.isFunction(Bar);
// Returns: true
util.isNull(object)
#
value === null
代替。如果给定的object
严格为null
,则返回true
。否则,返回
false
。
const util = require('node:util');
util.isNull(0);
// Returns: false
util.isNull(undefined);
// Returns: false
util.isNull(null);
// Returns: true
util.isNullOrUndefined(object)
#
value === undefined || value === null
代替。如果给定的object
是null
或undefined
,则返回 true
。否则,返回false
。
const util = require('node:util');
util.isNullOrUndefined(0);
// Returns: false
util.isNullOrUndefined(undefined);
// Returns: true
util.isNullOrUndefined(null);
// Returns: true
util.isNumber(object)
#
typeof value === 'number'
代替。如果给定的object
是Number
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isNumber(false);
// Returns: false
util.isNumber(Infinity);
// Returns: true
util.isNumber(0);
// Returns: true
util.isNumber(NaN);
// Returns: true
util.isObject(object)
#
value !== null && typeof value === 'object'
代替。如果给定的object
严格来说是Object
而不是
Function
(即使函数是 JavaScript 中的对象),则返回true
。否则,返回false
。
const util = require('node:util');
util.isObject(5);
// Returns: false
util.isObject(null);
// Returns: false
util.isObject({});
// Returns: true
util.isObject(() => {});
// Returns: false
util.isPrimitive(object)
#
(typeof value !== 'object' && typeof value !== 'function') || value === null
代替。如果给定的object
是原始类型,则返回true
。否则,返回
false
。
const util = require('node:util');
util.isPrimitive(5);
// Returns: true
util.isPrimitive('foo');
// Returns: true
util.isPrimitive(false);
// Returns: true
util.isPrimitive(null);
// Returns: true
util.isPrimitive(undefined);
// Returns: true
util.isPrimitive({});
// Returns: false
util.isPrimitive(() => {});
// Returns: false
util.isPrimitive(/^$/);
// Returns: false
util.isPrimitive(new Date());
// Returns: false
util.isRegExp(object)
#
如果给定的object
是RegExp
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isRegExp(/some regexp/);
// Returns: true
util.isRegExp(new RegExp('another regexp'));
// Returns: true
util.isRegExp({});
// Returns: false
util.isString(object)
#
typeof value === 'string'
代替。如果给定的object
是string
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isString('');
// Returns: true
util.isString('foo');
// Returns: true
util.isString(String('foo'));
// Returns: true
util.isString(5);
// Returns: false
util.isSymbol(object)
#
typeof value === 'symbol'
代替。如果给定的object
是Symbol
,则返回true
。否则,返回false
。
const util = require('node:util');
util.isSymbol(5);
// Returns: false
util.isSymbol('foo');
// Returns: false
util.isSymbol(Symbol('foo'));
// Returns: true
util.isUndefined(object)
#
value === undefined
代替。如果给定的object
是undefined
,则返回true
。否则,返回false
。
const util = require('node:util');
const foo = undefined;
util.isUndefined(5);
// Returns: false
util.isUndefined(foo);
// Returns: true
util.isUndefined(null);
// Returns: false
util.log(string)
#
string
<字符串>
util.log()
方法将给定的string
打印到stdout
并包含时间戳。
const util = require('node:util');
util.log('Timestamped message.');