Util#
Source Code:lib/util.js
Thenode:util module supports the needs of Node.js internal APIs. Many of theutilities are useful for application and module developers as well. To accessit:
import utilfrom'node:util';const util =require('node:util');
util.callbackify(original)#
original<Function> Anasyncfunction- Returns:<Function> a callback style function
Takes anasync function (or a function that returns aPromise) and returns afunction following the error-first callback style, i.e. takingan(err, value) => ... callback as the last argument. In the callback, thefirst argument will be the rejection reason (ornull if thePromiseresolved), and the second argument will be the resolved value.
import { callbackify }from'node:util';asyncfunctionfn() {return'hello world';}const callbackFunction =callbackify(fn);callbackFunction((err, ret) => {if (err)throw err;console.log(ret);});const { callbackify } =require('node:util');asyncfunctionfn() {return'hello world';}const callbackFunction =callbackify(fn);callbackFunction((err, ret) => {if (err)throw err;console.log(ret);});
Will print:
hello worldThe callback is executed asynchronously, and will have a limited stack trace.If the callback throws, the process will emit an'uncaughtException'event, and if not handled will exit.
Sincenull has a special meaning as the first argument to a callback, if awrapped function rejects aPromise with a falsy value as a reason, the valueis wrapped in anError with the original value stored in a field namedreason.
functionfn() {returnPromise.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> A string identifying the portion of the application forwhich thedebuglogfunction is being created.callback<Function> A callback invoked the first time the logging functionis called with a function argument that is a more optimized logging function.- Returns:<Function> The logging function
Theutil.debuglog() method is used to create a function that conditionallywrites debug messages tostderr based on the existence of theNODE_DEBUGenvironment variable. If thesection name appears within the value of thatenvironment variable, then the returned function operates similar toconsole.error(). If not, then the returned function is a no-op.
import { debuglog }from'node:util';const log =debuglog('foo');log('hello from foo [%d]',123);const { debuglog } =require('node:util');const log =debuglog('foo');log('hello from foo [%d]',123);
If this program is run withNODE_DEBUG=foo in the environment, thenit will output something like:
FOO 3245: hello from foo [123]where3245 is the process id. If it is not run with thatenvironment variable set, then it will not print anything.
Thesection supports wildcard also:
import { debuglog }from'node:util';const log =debuglog('foo');log('hi there, it\'s foo-bar [%d]',2333);const { debuglog } =require('node:util');const log =debuglog('foo');log('hi there, it\'s foo-bar [%d]',2333);
if it is run withNODE_DEBUG=foo* in the environment, then it will outputsomething like:
FOO-BAR 3257: hi there, it's foo-bar [2333]Multiple comma-separatedsection names may be specified in theNODE_DEBUGenvironment variable:NODE_DEBUG=fs,net,tls.
The optionalcallback argument can be used to replace the logging functionwith a different function that doesn't have any initialization orunnecessary wrapping.
import { debuglog }from'node:util';let log =debuglog('internals',(debug) => {// Replace with a logging function that optimizes out// testing if the section is enabled log = debug;});const { debuglog } =require('node:util');let log =debuglog('internals',(debug) => {// Replace with a logging function that optimizes out// testing if the section is enabled log = debug;});
debuglog().enabled#
- Type:<boolean>
Theutil.debuglog().enabled getter is used to create a test that can be usedin conditionals based on the existence of theNODE_DEBUG environment variable.If thesection name appears within the value of that environment variable,then the returned value will betrue. If not, then the returned value will befalse.
import { debuglog }from'node:util';const enabled =debuglog('foo').enabled;if (enabled) {console.log('hello from foo [%d]',123);}const { debuglog } =require('node:util');const enabled =debuglog('foo').enabled;if (enabled) {console.log('hello from foo [%d]',123);}
If this program is run withNODE_DEBUG=foo in the environment, then it willoutput something like:
hello from foo [123]util.debug(section)#
Alias forutil.debuglog. Usage allows for readability of that doesn't implylogging when only usingutil.debuglog().enabled.
util.deprecate(fn, msg[, code])#
History
| Version | Changes |
|---|---|
| v10.0.0 | Deprecation warnings are only emitted once for each code. |
| v0.8.0 | Added in: v0.8.0 |
fn<Function> The function that is being deprecated.msg<string> A warning message to display when the deprecated function isinvoked.code<string> A deprecation code. See thelist of deprecated APIs for alist of codes.- Returns:<Function> The deprecated function wrapped to emit a warning.
Theutil.deprecate() method wrapsfn (which may be a function or class) insuch a way that it is marked as deprecated.
import { deprecate }from'node:util';exportconst obsoleteFunction =deprecate(() => {// Do something here.},'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');const { deprecate } =require('node:util');exports.obsoleteFunction =deprecate(() => {// Do something here.},'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');
When called,util.deprecate() will return a function that will emit aDeprecationWarning using the'warning' event. The warning willbe emitted and printed tostderr the first time the returned function iscalled. After the warning is emitted, the wrapped function is called withoutemitting a warning.
If the same optionalcode is supplied in multiple calls toutil.deprecate(),the warning will be emitted only once for thatcode.
import { deprecate }from'node:util';const fn1 =deprecate(() =>'a value','deprecation message','DEP0001',);const fn2 =deprecate(() =>'a different value','other dep message','DEP0001',);fn1();// Emits a deprecation warning with code DEP0001fn2();// Does not emit a deprecation warning because it has the same codeconst { deprecate } =require('node:util');const fn1 =deprecate(function() {return'a value'; },'deprecation message','DEP0001',);const fn2 =deprecate(function() {return'a different value'; },'other dep message','DEP0001',);fn1();// Emits a deprecation warning with code DEP0001fn2();// Does not emit a deprecation warning because it has the same code
If either the--no-deprecation or--no-warnings command-line flags areused, or if theprocess.noDeprecation property is set totrueprior tothe first deprecation warning, theutil.deprecate() method does nothing.
If the--trace-deprecation or--trace-warnings command-line flags are set,or theprocess.traceDeprecation property is set totrue, a warning and astack trace are printed tostderr the first time the deprecated function iscalled.
If the--throw-deprecation command-line flag is set, or theprocess.throwDeprecation property is set totrue, then an exception will bethrown when the deprecated function is called.
The--throw-deprecation command-line flag andprocess.throwDeprecationproperty take precedence over--trace-deprecation andprocess.traceDeprecation.
util.diff(actual, expected)#
Returns:<Array> An array of difference entries. Each entry is an array with two elements:
Algorithm complexity: O(N*D), where:
N is the total length of the two sequences combined (N = actual.length + expected.length)
D is the edit distance (the minimum number of operations required to transform one sequence into the other).
util.diff() compares two string or array values and returns an array of difference entries.It uses the Myers diff algorithm to compute minimal differences, which is the same algorithmused internally by assertion error messages.
If the values are equal, an empty array is returned.
const { diff } =require('node:util');// Comparing stringsconst actualString ='12345678';const expectedString ='12!!5!7!';console.log(diff(actualString, expectedString));// [// [0, '1'],// [0, '2'],// [1, '3'],// [1, '4'],// [-1, '!'],// [-1, '!'],// [0, '5'],// [1, '6'],// [-1, '!'],// [0, '7'],// [1, '8'],// [-1, '!'],// ]// Comparing arraysconst actualArray = ['1','2','3'];const expectedArray = ['1','3','4'];console.log(diff(actualArray, expectedArray));// [// [0, '1'],// [1, '2'],// [0, '3'],// [-1, '4'],// ]// Equal values return empty arrayconsole.log(diff('same','same'));// []util.format(format[, ...args])#
History
| Version | Changes |
|---|---|
| v12.11.0 | The |
| v12.0.0 | The |
| v12.0.0 | If the |
| v11.4.0 | The |
| v11.4.0 | The |
| v11.0.0 | The |
| v10.12.0 | The |
| v8.4.0 | The |
| v0.5.3 | Added in: v0.5.3 |
format<string> Aprintf-like format string.
Theutil.format() method returns a formatted string using the first argumentas aprintf-like format string which can contain zero or more formatspecifiers. Each specifier is replaced with the converted value from thecorresponding argument. Supported specifiers are:
%s:Stringwill be used to convert all values exceptBigInt,Objectand-0.BigIntvalues will be represented with annand Objects thathave neither a user definedtoStringfunction norSymbol.toPrimitivefunction are inspected usingutil.inspect()with options{ depth: 0, colors: false, compact: 3 }.%d:Numberwill be used to convert all values exceptBigIntandSymbol.%i:parseInt(value, 10)is used for all values exceptBigIntandSymbol.%f:parseFloat(value)is used for all values expectSymbol.%j: JSON. Replaced with the string'[Circular]'if the argument containscircular references.%o:Object. A string representation of an object with generic JavaScriptobject formatting. Similar toutil.inspect()with options{ showHidden: true, showProxy: true }. This will show the full objectincluding non-enumerable properties and proxies.%O:Object. A string representation of an object with generic JavaScriptobject formatting. Similar toutil.inspect()without options. This will showthe full object not including non-enumerable properties and proxies.%c:CSS. This specifier is ignored and will skip any CSS passed in.%%: single percent sign ('%'). This does not consume an argument.- Returns:<string> The formatted string
If a specifier does not have a corresponding argument, it is not replaced:
util.format('%s:%s','foo');// Returns: 'foo:%s'Values that are not part of the format string are formatted usingutil.inspect() if their type is notstring.
If there are more arguments passed to theutil.format() method than thenumber of specifiers, the extra arguments are concatenated to the returnedstring, separated by spaces:
util.format('%s:%s','foo','bar','baz');// Returns: 'foo:bar baz'If the first argument does not contain a valid format specifier,util.format()returns a string that is the concatenation of all arguments separated by spaces:
util.format(1,2,3);// Returns: '1 2 3'If only one argument is passed toutil.format(), it is returned as it iswithout any formatting:
util.format('%% %s');// Returns: '%% %s'util.format() is a synchronous method that is intended as a debugging tool.Some input values can have a significant performance overhead that can block theevent loop. Use this function with care and never in a hot code path.
util.formatWithOptions(inspectOptions, format[, ...args])#
This function is identical toutil.format(), except in that it takesaninspectOptions argument which specifies options that are passed along toutil.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.getCallSites([frameCount][, options])#
History
| Version | Changes |
|---|---|
| v23.7.0, v22.14.0 | Property |
| v23.7.0, v22.14.0 | Property |
| v23.3.0, v22.12.0 | The API is renamed from |
| v22.9.0 | Added in: v22.9.0 |
frameCount<number> Optional number of frames to capture as call site objects.Default:10. Allowable range is between 1 and 200.options<Object> OptionalsourceMap<boolean> Reconstruct the original location in the stacktrace from the source-map.Enabled by default with the flag--enable-source-maps.
- Returns:<Object[]> An array of call site objects
functionName<string> Returns the name of the function associated with this call site.scriptName<string> Returns the name of the resource that contains the script for thefunction for this call site.scriptId<string> Returns the unique id of the script, as in Chrome DevTools protocolRuntime.ScriptId.lineNumber<number> Returns the JavaScript script line number (1-based).columnNumber<number> Returns the JavaScript script column number (1-based).
Returns an array of call site objects containing the stack ofthe caller function.
import { getCallSites }from'node:util';functionexampleFunction() {const callSites =getCallSites();console.log('Call Sites:'); callSites.forEach((callSite, index) => {console.log(`CallSite${index +1}:`);console.log(`Function Name:${callSite.functionName}`);console.log(`Script Name:${callSite.scriptName}`);console.log(`Line Number:${callSite.lineNumber}`);console.log(`Column Number:${callSite.column}`); });// CallSite 1:// Function Name: exampleFunction// Script Name: /home/example.js// Line Number: 5// Column Number: 26// CallSite 2:// Function Name: anotherFunction// Script Name: /home/example.js// Line Number: 22// Column Number: 3// ...}// A function to simulate another stack layerfunctionanotherFunction() {exampleFunction();}anotherFunction();const { getCallSites } =require('node:util');functionexampleFunction() {const callSites =getCallSites();console.log('Call Sites:'); callSites.forEach((callSite, index) => {console.log(`CallSite${index +1}:`);console.log(`Function Name:${callSite.functionName}`);console.log(`Script Name:${callSite.scriptName}`);console.log(`Line Number:${callSite.lineNumber}`);console.log(`Column Number:${callSite.column}`); });// CallSite 1:// Function Name: exampleFunction// Script Name: /home/example.js// Line Number: 5// Column Number: 26// CallSite 2:// Function Name: anotherFunction// Script Name: /home/example.js// Line Number: 22// Column Number: 3// ...}// A function to simulate another stack layerfunctionanotherFunction() {exampleFunction();}anotherFunction();
It is possible to reconstruct the original locations by setting the optionsourceMap totrue.If the source map is not available, the original location will be the same as the current location.When the--enable-source-maps flag is enabled, for example when using--experimental-transform-types,sourceMap will be true by default.
import { getCallSites }from'node:util';interfaceFoo {foo:string;}const callSites =getCallSites({sourceMap:true });// With sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 7// Column Number: 26// Without sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 2// Column Number: 26const { getCallSites } =require('node:util');const callSites =getCallSites({sourceMap:true });// With sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 7// Column Number: 26// Without sourceMap:// Function Name: ''// Script Name: example.js// Line Number: 2// Column Number: 26util.getSystemErrorName(err)#
Returns the string name for a numeric error code that comes from a Node.js API.The mapping between error codes and error names is platform-dependent.SeeCommon System Errors for the names of common errors.
fs.access('file/that/does/not/exist',(err) => {const name = util.getSystemErrorName(err.errno);console.error(name);// ENOENT});util.getSystemErrorMap()#
- Returns:<Map>
Returns a Map of all system error codes available from the Node.js API.The mapping between error codes and error names is platform-dependent.SeeCommon System Errors for the names of common errors.
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)#
Returns the string message for a numeric error code that comes from a Node.jsAPI.The mapping between error codes and string messages is platform-dependent.
fs.access('file/that/does/not/exist',(err) => {const message = util.getSystemErrorMessage(err.errno);console.error(message);// No such file or directory});util.setTraceSigInt(enable)#
enable<boolean>
Enable or disable printing a stack trace onSIGINT. The API is only available on the main thread.
util.inherits(constructor, superConstructor)#
History
| Version | Changes |
|---|---|
| v5.0.0 | The |
| v0.3.0 | Added in: v0.3.0 |
extends keyword instead.constructor<Function>superConstructor<Function>
Usage ofutil.inherits() is discouraged. Please use the ES6class andextends keywords to get language level inheritance support. Also notethat the two styles aresemantically incompatible.
Inherit the prototype methods from oneconstructor into another. Theprototype ofconstructor will be set to a new object created fromsuperConstructor.
This mainly adds some input validation on top ofObject.setPrototypeOf(constructor.prototype, superConstructor.prototype).As an additional convenience,superConstructor will be accessiblethrough theconstructor.super_ property.
const util =require('node:util');constEventEmitter =require('node:events');functionMyStream() {EventEmitter.call(this);}util.inherits(MyStream,EventEmitter);MyStream.prototype.write =function(data) {this.emit('data', data);};const stream =newMyStream();console.log(streaminstanceofEventEmitter);// trueconsole.log(MyStream.super_ ===EventEmitter);// truestream.on('data',(data) => {console.log(`Received data: "${data}"`);});stream.write('It works!');// Received data: "It works!"ES6 example usingclass andextends:
importEventEmitterfrom'node:events';classMyStreamextendsEventEmitter {write(data) {this.emit('data', data); }}const stream =newMyStream();stream.on('data',(data) => {console.log(`Received data: "${data}"`);});stream.write('With ES6');constEventEmitter =require('node:events');classMyStreamextendsEventEmitter {write(data) {this.emit('data', data); }}const stream =newMyStream();stream.on('data',(data) => {console.log(`Received data: "${data}"`);});stream.write('With ES6');
util.inspect(object[, options])#
util.inspect(object[, showHidden[, depth[, colors]]])#
History
| Version | Changes |
|---|---|
| v25.0.0 | The util.inspect.styles.regexp style is now a method that is invoked for coloring the stringified regular expression. |
| v16.18.0 | add support for |
| v17.3.0, v16.14.0 | The |
| v13.0.0 | Circular references now include a marker to the reference. |
| v14.6.0, v12.19.0 | If |
| v13.13.0, v12.17.0 | The |
| v13.5.0, v12.16.0 | User defined prototype properties are inspected in case |
| v12.0.0 | The |
| v12.0.0 | Internal properties no longer appear in the context argument of a custom inspection function. |
| v11.11.0 | The |
| v11.7.0 | ArrayBuffers now also show their binary contents. |
| v11.5.0 | The |
| v11.4.0 | The |
| v11.0.0 | The |
| v11.0.0 | The inspection output is now limited to about 128 MiB. Data above that size will not be fully inspected. |
| v10.12.0 | The |
| v10.6.0 | Inspecting linked lists and similar objects is now possible up to the maximum call stack size. |
| v10.0.0 | The |
| v9.9.0 | The |
| v6.6.0 | Custom inspection functions can now return |
| v6.3.0 | The |
| v6.1.0 | The |
| v6.1.0 | The |
| v0.3.0 | Added in: v0.3.0 |
object<any> Any JavaScript primitive orObject.options<Object>showHidden<boolean> Iftrue,object's non-enumerable symbols andproperties are included in the formatted result.<WeakMap> and<WeakSet> entries are also included as well as user defined prototypeproperties (excluding method properties).Default:false.depth<number> Specifies the number of times to recurse while formattingobject. This is useful for inspecting large objects. To recurse up tothe maximum call stack size passInfinityornull.Default:2.colors<boolean> Iftrue, the output is styled with ANSI colorcodes. Colors are customizable. SeeCustomizingutil.inspectcolors.Default:false.customInspect<boolean> Iffalse,[util.inspect.custom](depth, opts, inspect)functions are not invoked.Default:true.showProxy<boolean> Iftrue,Proxyinspection includesthetargetandhandlerobjects.Default:false.maxArrayLength<integer> Specifies the maximum number ofArray,<TypedArray>,<Map>,<WeakMap>, and<WeakSet> elements to include when formatting.Set tonullorInfinityto show all elements. Set to0ornegative to show no elements.Default:100.maxStringLength<integer> Specifies the maximum number of characters toinclude when formatting. Set tonullorInfinityto show all elements.Set to0or negative to show no characters.Default:10000.breakLength<integer> The length at which input values are split acrossmultiple lines. Set toInfinityto format the input as a single line(in combination withcompactset totrueor any number >=1).Default:80.compact<boolean> |<integer> Setting this tofalsecauses each object keyto be displayed on a new line. It will break on new lines in text that islonger thanbreakLength. If set to a number, the mostninner elementsare united on a single line as long as all properties fit intobreakLength. Short array elements are also grouped together. For moreinformation, see the example below.Default:3.sorted<boolean> |<Function> If set totrueor a function, all propertiesof an object, andSetandMapentries are sorted in the resultingstring. If set totruethedefault sort is used. If set to a function,it is used as acompare function.getters<boolean> |<string> If set totrue, getters are inspected. If setto'get', only getters without a corresponding setter are inspected. Ifset to'set', only getters with a corresponding setter are inspected.This might cause side effects depending on the getter function.Default:false.numericSeparator<boolean> If set totrue, an underscore is used toseparate every three digits in all bigints and numbers.Default:false.
- Returns:<string> The representation of
object.
Theutil.inspect() method returns a string representation ofobject that isintended for debugging. The output ofutil.inspect may change at any timeand should not be depended upon programmatically. Additionaloptions may bepassed that alter the result.util.inspect() will use the constructor's name and/orSymbol.toStringTagproperty to make an identifiable tag for an inspected value.
classFoo { get [Symbol.toStringTag]() {return'bar'; }}classBar {}const baz =Object.create(null, { [Symbol.toStringTag]: {value:'foo' } });util.inspect(newFoo());// 'Foo [bar] {}'util.inspect(newBar());// 'Bar {}'util.inspect(baz);// '[foo] {}'Circular references point to their anchor by using a reference index:
import { inspect }from'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] }// }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] }// }
The following example inspects all properties of theutil object:
import utilfrom'node:util';console.log(util.inspect(util, {showHidden:true,depth:null }));const util =require('node:util');console.log(util.inspect(util, {showHidden:true,depth:null }));
The following example highlights the effect of thecompact option:
import { inspect }from'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:newMap([['za',1], ['zb','test']]),};console.log(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(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.const { inspect } =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:newMap([['za',1], ['zb','test']]),};console.log(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(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.
TheshowHidden option allows<WeakMap> and<WeakSet> entries to beinspected. If there are more entries thanmaxArrayLength, there is noguarantee which entries are displayed. That means retrieving the same<WeakSet> entries twice may result in different output. Furthermore, entrieswith no remaining strong references may be garbage collected at any time.
import { inspect }from'node:util';const obj = {a:1 };const obj2 = {b:2 };const weakSet =newWeakSet([obj, obj2]);console.log(inspect(weakSet, {showHidden:true }));// WeakSet { { a: 1 }, { b: 2 } }const { inspect } =require('node:util');const obj = {a:1 };const obj2 = {b:2 };const weakSet =newWeakSet([obj, obj2]);console.log(inspect(weakSet, {showHidden:true }));// WeakSet { { a: 1 }, { b: 2 } }
Thesorted option ensures that an object's property insertion order does notimpact the result ofutil.inspect().
import { inspect }from'node:util';import assertfrom'node:assert';const o1 = {b: [2,3,1],a:'`a` comes before `b`',c:newSet([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:newSet([2,1,3]),a:'`a` comes before `b`',b: [2,3,1],};assert.strict.equal(inspect(o1, {sorted:true }),inspect(o2, {sorted:true }),);const { inspect } =require('node:util');const assert =require('node:assert');const o1 = {b: [2,3,1],a:'`a` comes before `b`',c:newSet([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:newSet([2,1,3]),a:'`a` comes before `b`',b: [2,3,1],};assert.strict.equal(inspect(o1, {sorted:true }),inspect(o2, {sorted:true }),);
ThenumericSeparator option adds an underscore every three digits to allnumbers.
import { inspect }from'node:util';const thousand =1000;const million =1000000;const bigNumber =123456789n;const bigDecimal =1234.12345;console.log(inspect(thousand, {numericSeparator:true }));// 1_000console.log(inspect(million, {numericSeparator:true }));// 1_000_000console.log(inspect(bigNumber, {numericSeparator:true }));// 123_456_789nconsole.log(inspect(bigDecimal, {numericSeparator:true }));// 1_234.123_45const { inspect } =require('node:util');const thousand =1000;const million =1000000;const bigNumber =123456789n;const bigDecimal =1234.12345;console.log(inspect(thousand, {numericSeparator:true }));// 1_000console.log(inspect(million, {numericSeparator:true }));// 1_000_000console.log(inspect(bigNumber, {numericSeparator:true }));// 123_456_789nconsole.log(inspect(bigDecimal, {numericSeparator:true }));// 1_234.123_45
util.inspect() is a synchronous method intended for debugging. Its maximumoutput length is approximately 128 MiB. Inputs that result in longer output willbe truncated.
Customizingutil.inspect colors#
Color output (if enabled) ofutil.inspect is customizable globallyvia theutil.inspect.styles andutil.inspect.colors properties.
util.inspect.styles is a map associating a style name to a color fromutil.inspect.colors.
The default styles and associated colors are:
bigint:yellowboolean:yellowdate:magentamodule:underlinename: (no styling)null:boldnumber:yellowregexp: A method that colors character classes, groups, assertions, andother parts for improved readability. To customize the coloring, change thecolorsproperty. It is set to['red', 'green', 'yellow', 'cyan', 'magenta']by default and may beadjusted as needed. The array is repetitively iterated through depending onthe "depth".special:cyan(e.g.,Proxies)string:greensymbol:greenundefined:grey
Color styling uses ANSI control codes that may not be supported on allterminals. To verify color support usetty.hasColors().
Predefined control codes are listed below (grouped as "Modifiers", "Foregroundcolors", and "Background colors").
Complex custom coloring#
It is possible to define a method as style. It receives the stringified valueof the input. It is invoked in case coloring is active and the type isinspected.
Example:util.inspect.styles.regexp(value)
Modifiers#
Modifier support varies throughout different terminals. They will mostly beignored, if not supported.
reset- Resets all (color) modifiers to their defaults- bold - Make text bold
- italic - Make text italic
- underline - Make text underlined
strikethrough- Puts a horizontal line through the center of the text(Alias:strikeThrough,crossedout,crossedOut)hidden- Prints the text, but makes it invisible (Alias: conceal)- dim - Decreased color intensity (Alias:
faint) - overlined - Make text overlined
- blink - Hides and shows the text in an interval
- inverse - Swap foreground andbackground colors (Alias:
swapcolors,swapColors) - doubleunderline - Make textdouble underlined (Alias:
doubleUnderline) - framed - Draw a frame around the text
Foreground colors#
blackredgreenyellowbluemagentacyanwhitegray(alias:grey,blackBright)redBrightgreenBrightyellowBrightblueBrightmagentaBrightcyanBrightwhiteBright
Background colors#
bgBlackbgRedbgGreenbgYellowbgBluebgMagentabgCyanbgWhitebgGray(alias:bgGrey,bgBlackBright)bgRedBrightbgGreenBrightbgYellowBrightbgBlueBrightbgMagentaBrightbgCyanBrightbgWhiteBright
Custom inspection functions on objects#
History
| Version | Changes |
|---|---|
| v17.3.0, v16.14.0 | The inspect argument is added for more interoperability. |
| v0.1.97 | Added in: v0.1.97 |
Objects may also define their own[util.inspect.custom](depth, opts, inspect) function,whichutil.inspect() will invoke and use the result of when inspectingthe object.
import { inspect }from'node:util';classBox {constructor(value) {this.value = value; } [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 =newBox(true);console.log(inspect(box));// "Box< true >"const { inspect } =require('node:util');classBox {constructor(value) {this.value = value; } [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 =newBox(true);console.log(inspect(box));// "Box< true >"
Custom[util.inspect.custom](depth, opts, inspect) functions typically returna string but may return a value of any type that will be formatted accordinglybyutil.inspect().
import { inspect }from'node:util';const obj = {foo:'this will not show up in the inspect() output' };obj[inspect.custom] =(depth) => {return {bar:'baz' };};console.log(inspect(obj));// "{ bar: 'baz' }"const { inspect } =require('node:util');const obj = {foo:'this will not show up in the inspect() output' };obj[inspect.custom] =(depth) => {return {bar:'baz' };};console.log(inspect(obj));// "{ bar: 'baz' }"
util.inspect.custom#
History
| Version | Changes |
|---|---|
| v10.12.0 | This is now defined as a shared symbol. |
| v6.6.0 | Added in: v6.6.0 |
- Type:<symbol> that can be used to declare custom inspect functions.
In addition to being accessible throughutil.inspect.custom, thissymbol isregistered globally and can beaccessed in any environment asSymbol.for('nodejs.util.inspect.custom').
Using this allows code to be written in a portable fashion, so that the custominspect function is used in an Node.js environment and ignored in the browser.Theutil.inspect() function itself is passed as third argument to the custominspect function to allow further portability.
const customInspectSymbol =Symbol.for('nodejs.util.inspect.custom');classPassword {constructor(value) {this.value = value; }toString() {return'xxxxxxxx'; } [customInspectSymbol](depth, inspectOptions, inspect) {return`Password <${this.toString()}>`; }}const password =newPassword('r0sebud');console.log(password);// Prints Password <xxxxxxxx>SeeCustom inspection functions on Objects for more details.
util.inspect.defaultOptions#
ThedefaultOptions value allows customization of the default options used byutil.inspect. This is useful for functions likeconsole.log orutil.format which implicitly call intoutil.inspect. It shall be set to anobject containing one or more validutil.inspect() options. Settingoption properties directly is also supported.
import { inspect }from'node:util';const arr =Array(156).fill(0);console.log(arr);// Logs the truncated arrayinspect.defaultOptions.maxArrayLength =null;console.log(arr);// logs the full arrayconst { inspect } =require('node:util');const arr =Array(156).fill(0);console.log(arr);// Logs the truncated arrayinspect.defaultOptions.maxArrayLength =null;console.log(arr);// logs the full array
util.isDeepStrictEqual(val1, val2[, options])#
History
| Version | Changes |
|---|---|
| v24.9.0 | Added |
| v9.0.0 | Added in: v9.0.0 |
val1<any>val2<any>skipPrototype<boolean> Iftrue, prototype and constructorcomparison is skipped during deep strict equality check.Default:false.- Returns:<boolean>
Returnstrue if there is deep strict equality betweenval1 andval2.Otherwise, returnsfalse.
By default, deep strict equality includes comparison of object prototypes andconstructors. WhenskipPrototype istrue, objects withdifferent prototypes or constructors can still be considered equal if theirenumerable properties are deeply strictly equal.
const util =require('node:util');classFoo {constructor(a) {this.a = a; }}classBar {constructor(a) {this.a = a; }}const foo =newFoo(1);const bar =newBar(1);// Different constructors, same propertiesconsole.log(util.isDeepStrictEqual(foo, bar));// falseconsole.log(util.isDeepStrictEqual(foo, bar,true));// trueSeeassert.deepStrictEqual() for more information about deep strictequality.
Class:util.MIMEType#
History
| Version | Changes |
|---|---|
| v23.11.0, v22.15.0 | Marking the API stable. |
| v19.1.0, v18.13.0 | Added in: v19.1.0, v18.13.0 |
An implementation ofthe MIMEType class.
In accordance with browser conventions, all properties ofMIMEType objectsare implemented as getters and setters on the class prototype, rather than asdata properties on the object itself.
A MIME string is a structured string containing multiple meaningfulcomponents. When parsed, aMIMEType object is returned containingproperties for each of these components.
new MIMEType(input)#
input<string> The input MIME to parse
Creates a newMIMEType object by parsing theinput.
import {MIMEType }from'node:util';const myMIME =newMIMEType('text/plain');const {MIMEType } =require('node:util');const myMIME =newMIMEType('text/plain');
ATypeError will be thrown if theinput is not a valid MIME. Notethat an effort will be made to coerce the given values into strings. Forinstance:
import {MIMEType }from'node:util';const myMIME =newMIMEType({toString:() =>'text/plain' });console.log(String(myMIME));// Prints: text/plainconst {MIMEType } =require('node:util');const myMIME =newMIMEType({toString:() =>'text/plain' });console.log(String(myMIME));// Prints: text/plain
mime.type#
- Type:<string>
Gets and sets the type portion of the MIME.
import {MIMEType }from'node:util';const myMIME =newMIMEType('text/javascript');console.log(myMIME.type);// Prints: textmyMIME.type ='application';console.log(myMIME.type);// Prints: applicationconsole.log(String(myMIME));// Prints: application/javascriptconst {MIMEType } =require('node:util');const myMIME =newMIMEType('text/javascript');console.log(myMIME.type);// Prints: textmyMIME.type ='application';console.log(myMIME.type);// Prints: applicationconsole.log(String(myMIME));// Prints: application/javascript
mime.subtype#
- Type:<string>
Gets and sets the subtype portion of the MIME.
import {MIMEType }from'node:util';const myMIME =newMIMEType('text/ecmascript');console.log(myMIME.subtype);// Prints: ecmascriptmyMIME.subtype ='javascript';console.log(myMIME.subtype);// Prints: javascriptconsole.log(String(myMIME));// Prints: text/javascriptconst {MIMEType } =require('node:util');const myMIME =newMIMEType('text/ecmascript');console.log(myMIME.subtype);// Prints: ecmascriptmyMIME.subtype ='javascript';console.log(myMIME.subtype);// Prints: javascriptconsole.log(String(myMIME));// Prints: text/javascript
mime.essence#
- Type:<string>
Gets the essence of the MIME. This property is read only.Usemime.type ormime.subtype to alter the MIME.
import {MIMEType }from'node:util';const myMIME =newMIMEType('text/javascript;key=value');console.log(myMIME.essence);// Prints: text/javascriptmyMIME.type ='application';console.log(myMIME.essence);// Prints: application/javascriptconsole.log(String(myMIME));// Prints: application/javascript;key=valueconst {MIMEType } =require('node:util');const myMIME =newMIMEType('text/javascript;key=value');console.log(myMIME.essence);// Prints: text/javascriptmyMIME.type ='application';console.log(myMIME.essence);// Prints: application/javascriptconsole.log(String(myMIME));// Prints: application/javascript;key=value
mime.params#
- Type:<MIMEParams>
Gets theMIMEParams object representing theparameters of the MIME. This property is read-only. SeeMIMEParams documentation for details.
mime.toString()#
- Returns:<string>
ThetoString() method on theMIMEType object returns the serialized MIME.
Because of the need for standard compliance, this method does not allow usersto customize the serialization process of the MIME.
mime.toJSON()#
- Returns:<string>
Alias formime.toString().
This method is automatically called when anMIMEType object is serializedwithJSON.stringify().
import {MIMEType }from'node:util';const myMIMES = [newMIMEType('image/png'),newMIMEType('image/gif'),];console.log(JSON.stringify(myMIMES));// Prints: ["image/png", "image/gif"]const {MIMEType } =require('node:util');const myMIMES = [newMIMEType('image/png'),newMIMEType('image/gif'),];console.log(JSON.stringify(myMIMES));// Prints: ["image/png", "image/gif"]
Class:util.MIMEParams#
TheMIMEParams API provides read and write access to the parameters of aMIMEType.
new MIMEParams()#
Creates a newMIMEParams object by with empty parameters
import {MIMEParams }from'node:util';const myParams =newMIMEParams();const {MIMEParams } =require('node:util');const myParams =newMIMEParams();
mimeParams.entries()#
- Returns:<Iterator>
Returns an iterator over each of the name-value pairs in the parameters.Each item of the iterator is a JavaScriptArray. The first item of the arrayis thename, the second item of the array is thevalue.
mimeParams.get(name)#
name<string>- Returns:<string> |<null> A string or
nullif there is no name-value pairwith the givenname.
Returns the value of the first name-value pair whose name isname. If thereare no such pairs,null is returned.
mimeParams.has(name)#
Returnstrue if there is at least one name-value pair whose name isname.
mimeParams.keys()#
- Returns:<Iterator>
Returns an iterator over the names of each name-value pair.
import {MIMEType }from'node:util';const { params } =newMIMEType('text/plain;foo=0;bar=1');for (const nameof params.keys()) {console.log(name);}// Prints:// foo// barconst {MIMEType } =require('node:util');const { params } =newMIMEType('text/plain;foo=0;bar=1');for (const nameof params.keys()) {console.log(name);}// Prints:// foo// bar
mimeParams.set(name, value)#
Sets the value in theMIMEParams object associated withname tovalue. If there are any pre-existing name-value pairs whose names arename,set the first such pair's value tovalue.
import {MIMEType }from'node:util';const { params } =newMIMEType('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 } =newMIMEType('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[Symbol.iterator]()#
- Returns:<Iterator>
Alias formimeParams.entries().
import {MIMEType }from'node:util';const { params } =newMIMEType('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 } =newMIMEType('text/plain;foo=bar;xyz=baz');for (const [name, value]of params) {console.log(name, value);}// Prints:// foo bar// xyz baz
util.parseArgs([config])#
History
| Version | Changes |
|---|---|
| v22.4.0, v20.16.0 | add support for allowing negative options in input |
| v20.0.0 | The API is no longer experimental. |
| v18.11.0, v16.19.0 | Add support for default values in input |
| v18.7.0, v16.17.0 | add support for returning detailed parse information using |
| v18.3.0, v16.17.0 | Added in: v18.3.0, v16.17.0 |
config<Object> Used to provide arguments for parsing and to configurethe parser.configsupports the following properties:args<string[]> array of argument strings.Default:process.argvwithexecPathandfilenameremoved.options<Object> Used to describe arguments known to the parser.Keys ofoptionsare the long names of options and values are an<Object> accepting the following properties:type<string> Type of argument, which must be eitherbooleanorstring.multiple<boolean> Whether this option can be provided multipletimes. Iftrue, all values will be collected in an array. Iffalse, values for the option are last-wins.Default:false.short<string> A single character alias for the option.default<string> |<boolean> |<string[]> |<boolean[]> The value to assign tothe option if it does not appear in the arguments to be parsed. The valuemust match the type specified by thetypeproperty. Ifmultipleistrue, it must be an array. No default value is applied when the optiondoes appear in the arguments to be parsed, even if the provided valueis falsy.
strict<boolean> Should an error be thrown when unknown argumentsare encountered, or when arguments are passed that do not match thetypeconfigured inoptions.Default:true.allowPositionals<boolean> Whether this command accepts positionalarguments.Default:falseifstrictistrue, otherwisetrue.allowNegative<boolean> Iftrue, allows explicitly setting booleanoptions tofalseby prefixing the option name with--no-.Default:false.tokens<boolean> Return the parsed tokens. This is useful for extendingthe built-in behavior, from adding additional checks through to reprocessingthe tokens in different ways.Default:false.
Returns:<Object> The parsed command line arguments:
values<Object> A mapping of parsed option names with their<string>or<boolean> values.positionals<string[]> Positional arguments.tokens<Object[]> |<undefined> SeeparseArgs tokenssection. Only returned ifconfigincludestokens: true.
Provides a higher level API for command-line argument parsing than interactingwithprocess.argv directly. Takes a specification for the expected argumentsand returns a structured object with the parsed options and positionals.
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' } []
parseArgstokens#
Detailed parse information is available for adding custom behaviors byspecifyingtokens: true in the configuration.The returned tokens have properties describing:
- all tokens
- option tokens
name<string> Long name of option.rawName<string> How option used in args, like-fof--foo.value<string> |<undefined> Option value specified in args.Undefined for boolean options.inlineValue<boolean> |<undefined> Whether option value specified inline,like--foo=bar.
- positional tokens
value<string> The value of the positional argument in args (i.e.args[index]).
- option-terminator token
The returned tokens are in the order encountered in the input args. Optionsthat appear more than once in args produce a token for each use. Short optiongroups like-xy expand to a token for each option. So-xxx producesthree tokens.
For example, to add support for a negated option like--no-color (whichallowNegative supports when the option is ofboolean type), the returnedtokens can be reprocessed to change the value stored for the negated option.
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-fooconst 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-fooconst 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 });
Example usage showing negated options, and when an option is usedmultiple ways then last one wins.
$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)#
History
| Version | Changes |
|---|---|
| v24.10.0 | This API is no longer experimental. |
| v21.7.0, v20.12.0 | Added in: v21.7.0, v20.12.0 |
content<string>
The raw contents of a.env file.
- Returns:<Object>
Given an example.env file:
const { parseEnv } =require('node:util');parseEnv('HELLO=world\nHELLO=oh my\n');// Returns: { HELLO: 'oh my' }import { parseEnv }from'node:util';parseEnv('HELLO=world\nHELLO=oh my\n');// Returns: { HELLO: 'oh my' }
util.promisify(original)#
History
| Version | Changes |
|---|---|
| v20.8.0 | Calling |
| v8.0.0 | Added in: v8.0.0 |
original<Function>- Returns:<Function>
Takes a function following the common error-first callback style, i.e. takingan(err, value) => ... callback as the last argument, and returns a versionthat returns promises.
import { promisify }from'node:util';import { stat }from'node:fs';const promisifiedStat =promisify(stat);promisifiedStat('.').then((stats) => {// Do something with `stats`}).catch((error) => {// Handle the error.});const { promisify } =require('node:util');const { stat } =require('node:fs');const promisifiedStat =promisify(stat);promisifiedStat('.').then((stats) => {// Do something with `stats`}).catch((error) => {// Handle the error.});
Or, equivalently usingasync functions:
import { promisify }from'node:util';import { stat }from'node:fs';const promisifiedStat =promisify(stat);asyncfunctioncallStat() {const stats =awaitpromisifiedStat('.');console.log(`This directory is owned by${stats.uid}`);}callStat();const { promisify } =require('node:util');const { stat } =require('node:fs');const promisifiedStat =promisify(stat);asyncfunctioncallStat() {const stats =awaitpromisifiedStat('.');console.log(`This directory is owned by${stats.uid}`);}callStat();
If there is anoriginal[util.promisify.custom] property present,promisifywill return its value, seeCustom promisified functions.
promisify() assumes thatoriginal is a function taking a callback as itsfinal argument in all cases. Iforiginal is not a function,promisify()will throw an error. Iforiginal is a function but its last argument is notan error-first callback, it will still be passed an error-firstcallback as its last argument.
Usingpromisify() on class methods or other methods that usethis may notwork as expected unless handled specially:
import { promisify }from'node:util';classFoo {constructor() {this.a =42; }bar(callback) {callback(null,this.a); }}const foo =newFoo();const naiveBar =promisify(foo.bar);// TypeError: Cannot read properties of undefined (reading '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'const { promisify } =require('node:util');classFoo {constructor() {this.a =42; }bar(callback) {callback(null,this.a); }}const foo =newFoo();const naiveBar =promisify(foo.bar);// TypeError: Cannot read properties of undefined (reading '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'
Custom promisified functions#
Using theutil.promisify.custom symbol one can override the return value ofutil.promisify():
import { promisify }from'node:util';functiondoSomething(foo, callback) {// ...}doSomething[promisify.custom] =(foo) => {returngetPromiseSomehow();};const promisified =promisify(doSomething);console.log(promisified === doSomething[promisify.custom]);// prints 'true'const { promisify } =require('node:util');functiondoSomething(foo, callback) {// ...}doSomething[promisify.custom] =(foo) => {returngetPromiseSomehow();};const promisified =promisify(doSomething);console.log(promisified === doSomething[promisify.custom]);// prints 'true'
This can be useful for cases where the original function does not follow thestandard format of taking an error-first callback as the last argument.
For example, with a function that takes in(foo, onSuccessCallback, onErrorCallback):
doSomething[util.promisify.custom] =(foo) => {returnnewPromise((resolve, reject) => {doSomething(foo, resolve, reject); });};Ifpromisify.custom is defined but is not a function,promisify() willthrow an error.
util.promisify.custom#
History
| Version | Changes |
|---|---|
| v13.12.0, v12.16.2 | This is now defined as a shared symbol. |
| v8.0.0 | Added in: v8.0.0 |
- Type:<symbol> that can be used to declare custom promisified variants of functions,seeCustom promisified functions.
In addition to being accessible throughutil.promisify.custom, thissymbol isregistered globally and can beaccessed in any environment asSymbol.for('nodejs.util.promisify.custom').
For example, with a function that takes in(foo, onSuccessCallback, onErrorCallback):
const kCustomPromisifiedSymbol =Symbol.for('nodejs.util.promisify.custom');doSomething[kCustomPromisifiedSymbol] =(foo) => {returnnewPromise((resolve, reject) => {doSomething(foo, resolve, reject); });};util.stripVTControlCharacters(str)#
Returnsstr with any ANSI escape codes removed.
console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m'));// Prints "value"util.styleText(format, text[, options])#
History
| Version | Changes |
|---|---|
| v24.2.0, v22.17.0 | Added the |
| v23.5.0, v22.13.0 | styleText is now stable. |
| v22.8.0, v20.18.0 | Respect isTTY and environment variables such as NO_COLOR, NODE_DISABLE_COLORS, and FORCE_COLOR. |
| v21.7.0, v20.12.0 | Added in: v21.7.0, v20.12.0 |
format<string> |<Array> A text format or an Arrayof text formats defined inutil.inspect.colors.text<string> The text to to be formatted.options<Object>
This function returns a formatted text considering theformat passedfor printing in a terminal. It is aware of the terminal's capabilitiesand acts according to the configuration set viaNO_COLOR,NODE_DISABLE_COLORS andFORCE_COLOR environment variables.
import { styleText }from'node:util';import { stderr }from'node:process';const successMessage =styleText('green','Success!');console.log(successMessage);const errorMessage =styleText('red','Error! Error!',// Validate if process.stderr has TTY {stream: stderr },);console.error(errorMessage);const { styleText } =require('node:util');const { stderr } =require('node:process');const successMessage =styleText('green','Success!');console.log(successMessage);const errorMessage =styleText('red','Error! Error!',// Validate if process.stderr has TTY {stream: stderr },);console.error(errorMessage);
util.inspect.colors also provides text formats such asitalic, andunderline and you can combine both:
console.log( util.styleText(['underline','italic'],'My italic underlined message'),);When passing an array of formats, the order of the format appliedis left to right so the following style might overwrite the previous one.
console.log( util.styleText(['red','green'],'text'),// green);The special format valuenone applies no additional styling to the text.
The full list of formats can be found inmodifiers.
Class:util.TextDecoder#
History
| Version | Changes |
|---|---|
| v11.0.0 | The class is now available on the global object. |
| v8.3.0 | Added in: v8.3.0 |
An implementation of theWHATWG Encoding StandardTextDecoder API.
const decoder =newTextDecoder();const u8arr =newUint8Array([72,101,108,108,111]);console.log(decoder.decode(u8arr));// HelloWHATWG supported encodings#
Per theWHATWG Encoding Standard, the encodings supported by theTextDecoder API are outlined in the tables below. For each encoding,one or more aliases may be used.
Different Node.js build configurations support different sets of encodings.(seeInternationalization)
Encodings supported by default (with full ICU data)#
| Encoding | Aliases |
|---|---|
'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' |
Encodings supported when Node.js is built with thesmall-icu option#
| Encoding | Aliases |
|---|---|
'utf-8' | 'unicode-1-1-utf-8','utf8' |
'utf-16le' | 'utf-16' |
'utf-16be' |
Encodings supported when ICU is disabled#
| Encoding | Aliases |
|---|---|
'utf-8' | 'unicode-1-1-utf-8','utf8' |
'utf-16le' | 'utf-16' |
The'iso-8859-16' encoding listed in theWHATWG Encoding Standardis not supported.
new TextDecoder([encoding[, options]])#
encoding<string> Identifies theencodingthat thisTextDecoderinstancesupports.Default:'utf-8'.options<Object>fatal<boolean>trueif decoding failures are fatal.This option is not supported when ICU is disabled(seeInternationalization).Default:false.ignoreBOM<boolean> Whentrue, theTextDecoderwill include the byteorder mark in the decoded result. Whenfalse, the byte order mark willbe removed from the output. This option is only used whenencodingis'utf-8','utf-16be', or'utf-16le'.Default:false.
Creates a newTextDecoder instance. Theencoding may specify one of thesupported encodings or an alias.
TheTextDecoder class is also available on the global object.
textDecoder.decode([input[, options]])#
input<ArrayBuffer> |<DataView> |<TypedArray> AnArrayBuffer,DataView, orTypedArrayinstance containing the encoded data.options<Object>stream<boolean>trueif additional chunks of data are expected.Default:false.
- Returns:<string>
Decodes theinput and returns a string. Ifoptions.stream istrue, anyincomplete byte sequences occurring at the end of theinput are bufferedinternally and emitted after the next call totextDecoder.decode().
IftextDecoder.fatal istrue, decoding errors that occur will result in aTypeError being thrown.
Class:util.TextEncoder#
History
| Version | Changes |
|---|---|
| v11.0.0 | The class is now available on the global object. |
| v8.3.0 | Added in: v8.3.0 |
An implementation of theWHATWG Encoding StandardTextEncoder API. Allinstances ofTextEncoder only support UTF-8 encoding.
const encoder =newTextEncoder();const uint8array = encoder.encode('this is some data');TheTextEncoder class is also available on the global object.
textEncoder.encode([input])#
input<string> The text to encode.Default: an empty string.- Returns:<Uint8Array>
UTF-8 encodes theinput string and returns aUint8Array containing theencoded bytes.
textEncoder.encodeInto(src, dest)#
src<string> The text to encode.dest<Uint8Array> The array to hold the encode result.- Returns:<Object>
UTF-8 encodes thesrc string to thedest Uint8Array and returns an objectcontaining the read Unicode code units and written UTF-8 bytes.
const encoder =newTextEncoder();const src ='this is some data';const dest =newUint8Array(10);const { read, written } = encoder.encodeInto(src, dest);util.toUSVString(string)#
string<string>
Returns thestring after replacing any surrogate code points(or equivalently, any unpaired surrogate code units) with theUnicode "replacement character" U+FFFD.
util.transferableAbortController()#
History
| Version | Changes |
|---|---|
| v23.11.0, v22.15.0 | Marking the API stable. |
| v18.11.0 | Added in: v18.11.0 |
Creates and returns an<AbortController> instance whose<AbortSignal> is markedas transferable and can be used withstructuredClone() orpostMessage().
util.transferableAbortSignal(signal)#
History
| Version | Changes |
|---|---|
| v23.11.0, v22.15.0 | Marking the API stable. |
| v18.11.0 | Added in: v18.11.0 |
signal<AbortSignal>- Returns:<AbortSignal>
Marks the given<AbortSignal> as transferable so that it can be used withstructuredClone() andpostMessage().
const signal =transferableAbortSignal(AbortSignal.timeout(100));const channel =newMessageChannel();channel.port2.postMessage(signal, [signal]);util.aborted(signal, resource)#
History
| Version | Changes |
|---|---|
| v24.0.0, v22.16.0 | Change stability index for this feature from Experimental to Stable. |
| v19.7.0, v18.16.0 | Added in: v19.7.0, v18.16.0 |
signal<AbortSignal>resource<Object> Any non-null object tied to the abortable operation and held weakly.Ifresourceis garbage collected before thesignalaborts, the promise remains pending,allowing Node.js to stop tracking it.This helps prevent memory leaks in long-running or non-cancelable operations.- Returns:<Promise>
Listens to abort event on the providedsignal and returns a promise that resolves when thesignal is aborted.Ifresource is provided, it weakly references the operation's associated object,so ifresource is garbage collected before thesignal aborts,then returned promise shall remain pending.This prevents memory leaks in long-running or non-cancelable operations.
const { aborted } =require('node:util');// Obtain an object with an abortable signal, like a custom resource or operation.const dependent =obtainSomethingAbortable();// Pass `dependent` as the resource, indicating the promise should only resolve// if `dependent` is still in memory when the signal is aborted.aborted(dependent.signal, dependent).then(() => {// This code runs when `dependent` is aborted.console.log('Dependent resource was aborted.');});// Simulate an event that triggers the abort.dependent.on('event',() => { dependent.abort();// This will cause the `aborted` promise to resolve.});import { aborted }from'node:util';// Obtain an object with an abortable signal, like a custom resource or operation.const dependent =obtainSomethingAbortable();// Pass `dependent` as the resource, indicating the promise should only resolve// if `dependent` is still in memory when the signal is aborted.aborted(dependent.signal, dependent).then(() => {// This code runs when `dependent` is aborted.console.log('Dependent resource was aborted.');});// Simulate an event that triggers the abort.dependent.on('event',() => { dependent.abort();// This will cause the `aborted` promise to resolve.});
util.types#
History
| Version | Changes |
|---|---|
| v15.3.0 | Exposed as |
| v10.0.0 | Added in: v10.0.0 |
util.types provides type checks for different kinds of built-in objects.Unlikeinstanceof orObject.prototype.toString.call(value), these checks donot inspect properties of the object that are accessible from JavaScript (liketheir prototype), and usually have the overhead of calling into C++.
The result generally does not make any guarantees about what kinds ofproperties or behavior a value exposes in JavaScript. They are primarilyuseful for addon developers who prefer to do type checking in JavaScript.
The API is accessible viarequire('node:util').types orrequire('node:util/types').
util.types.isAnyArrayBuffer(value)#
Returnstrue if the value is a built-in<ArrayBuffer> or<SharedArrayBuffer> instance.
See alsoutil.types.isArrayBuffer() andutil.types.isSharedArrayBuffer().
util.types.isAnyArrayBuffer(newArrayBuffer());// Returns trueutil.types.isAnyArrayBuffer(newSharedArrayBuffer());// Returns trueutil.types.isArrayBufferView(value)#
Returnstrue if the value is an instance of one of the<ArrayBuffer>views, such as typed array objects or<DataView>. Equivalent toArrayBuffer.isView().
util.types.isArrayBufferView(newInt8Array());// trueutil.types.isArrayBufferView(Buffer.from('hello world'));// trueutil.types.isArrayBufferView(newDataView(newArrayBuffer(16)));// trueutil.types.isArrayBufferView(newArrayBuffer());// falseutil.types.isArgumentsObject(value)#
Returnstrue if the value is anarguments object.
functionfoo() { util.types.isArgumentsObject(arguments);// Returns true}util.types.isArrayBuffer(value)#
Returnstrue if the value is a built-in<ArrayBuffer> instance.This doesnot include<SharedArrayBuffer> instances. Usually, it isdesirable to test for both; Seeutil.types.isAnyArrayBuffer() for that.
util.types.isArrayBuffer(newArrayBuffer());// Returns trueutil.types.isArrayBuffer(newSharedArrayBuffer());// Returns falseutil.types.isAsyncFunction(value)#
Returnstrue if the value is anasync function.This only reports back what the JavaScript engine is seeing;in particular, the return value may not match the original source code ifa transpilation tool was used.
util.types.isAsyncFunction(functionfoo() {});// Returns falseutil.types.isAsyncFunction(asyncfunctionfoo() {});// Returns trueutil.types.isBigInt64Array(value)#
Returnstrue if the value is aBigInt64Array instance.
util.types.isBigInt64Array(newBigInt64Array());// Returns trueutil.types.isBigInt64Array(newBigUint64Array());// Returns falseutil.types.isBigIntObject(value)#
Returnstrue if the value is a BigInt object, e.g. createdbyObject(BigInt(123)).
util.types.isBigIntObject(Object(BigInt(123)));// Returns trueutil.types.isBigIntObject(BigInt(123));// Returns falseutil.types.isBigIntObject(123);// Returns falseutil.types.isBigUint64Array(value)#
Returnstrue if the value is aBigUint64Array instance.
util.types.isBigUint64Array(newBigInt64Array());// Returns falseutil.types.isBigUint64Array(newBigUint64Array());// Returns trueutil.types.isBooleanObject(value)#
Returnstrue if the value is a boolean object, e.g. createdbynew Boolean().
util.types.isBooleanObject(false);// Returns falseutil.types.isBooleanObject(true);// Returns falseutil.types.isBooleanObject(newBoolean(false));// Returns trueutil.types.isBooleanObject(newBoolean(true));// Returns trueutil.types.isBooleanObject(Boolean(false));// Returns falseutil.types.isBooleanObject(Boolean(true));// Returns falseutil.types.isBoxedPrimitive(value)#
Returnstrue if the value is any boxed primitive object, e.g. createdbynew Boolean(),new String() orObject(Symbol()).
For example:
util.types.isBoxedPrimitive(false);// Returns falseutil.types.isBoxedPrimitive(newBoolean(false));// Returns trueutil.types.isBoxedPrimitive(Symbol('foo'));// Returns falseutil.types.isBoxedPrimitive(Object(Symbol('foo')));// Returns trueutil.types.isBoxedPrimitive(Object(BigInt(5)));// Returns trueutil.types.isDataView(value)#
Returnstrue if the value is a built-in<DataView> instance.
const ab =newArrayBuffer(20);util.types.isDataView(newDataView(ab));// Returns trueutil.types.isDataView(newFloat64Array());// Returns falseSee alsoArrayBuffer.isView().
util.types.isDate(value)#
Returnstrue if the value is a built-in<Date> instance.
util.types.isDate(newDate());// Returns trueutil.types.isExternal(value)#
Returnstrue if the value is a nativeExternal value.
A nativeExternal value is a special type of object that contains araw C++ pointer (void*) for access from native code, and has no otherproperties. Such objects are created either by Node.js internals or nativeaddons. In JavaScript, they arefrozen objects with anull prototype.
#include<js_native_api.h>#include<stdlib.h>napi_value result;static napi_valueMyNapi(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");returnNULL; }return result;}...DECLARE_NAPI_PROPERTY("myNapi", MyNapi)...import nativefrom'napi_addon.node';import { types }from'node:util';const data = native.myNapi();types.isExternal(data);// returns truetypes.isExternal(0);// returns falsetypes.isExternal(newString('foo'));// returns falseconst native =require('napi_addon.node');const { types } =require('node:util');const data = native.myNapi();types.isExternal(data);// returns truetypes.isExternal(0);// returns falsetypes.isExternal(newString('foo'));// returns false
For further information onnapi_create_external, refer tonapi_create_external().
util.types.isFloat16Array(value)#
Returnstrue if the value is a built-in<Float16Array> instance.
util.types.isFloat16Array(newArrayBuffer());// Returns falseutil.types.isFloat16Array(newFloat16Array());// Returns trueutil.types.isFloat16Array(newFloat32Array());// Returns falseutil.types.isFloat32Array(value)#
Returnstrue if the value is a built-in<Float32Array> instance.
util.types.isFloat32Array(newArrayBuffer());// Returns falseutil.types.isFloat32Array(newFloat32Array());// Returns trueutil.types.isFloat32Array(newFloat64Array());// Returns falseutil.types.isFloat64Array(value)#
Returnstrue if the value is a built-in<Float64Array> instance.
util.types.isFloat64Array(newArrayBuffer());// Returns falseutil.types.isFloat64Array(newUint8Array());// Returns falseutil.types.isFloat64Array(newFloat64Array());// Returns trueutil.types.isGeneratorFunction(value)#
Returnstrue if the value is a generator function.This only reports back what the JavaScript engine is seeing;in particular, the return value may not match the original source code ifa transpilation tool was used.
util.types.isGeneratorFunction(functionfoo() {});// Returns falseutil.types.isGeneratorFunction(function*foo() {});// Returns trueutil.types.isGeneratorObject(value)#
Returnstrue if the value is a generator object as returned from abuilt-in generator function.This only reports back what the JavaScript engine is seeing;in particular, the return value may not match the original source code ifa transpilation tool was used.
function*foo() {}const generator =foo();util.types.isGeneratorObject(generator);// Returns trueutil.types.isInt8Array(value)#
Returnstrue if the value is a built-in<Int8Array> instance.
util.types.isInt8Array(newArrayBuffer());// Returns falseutil.types.isInt8Array(newInt8Array());// Returns trueutil.types.isInt8Array(newFloat64Array());// Returns falseutil.types.isInt16Array(value)#
Returnstrue if the value is a built-in<Int16Array> instance.
util.types.isInt16Array(newArrayBuffer());// Returns falseutil.types.isInt16Array(newInt16Array());// Returns trueutil.types.isInt16Array(newFloat64Array());// Returns falseutil.types.isInt32Array(value)#
Returnstrue if the value is a built-in<Int32Array> instance.
util.types.isInt32Array(newArrayBuffer());// Returns falseutil.types.isInt32Array(newInt32Array());// Returns trueutil.types.isInt32Array(newFloat64Array());// Returns falseutil.types.isMap(value)#
Returnstrue if the value is a built-in<Map> instance.
util.types.isMap(newMap());// Returns trueutil.types.isMapIterator(value)#
Returnstrue if the value is an iterator returned for a built-in<Map> instance.
const map =newMap();util.types.isMapIterator(map.keys());// Returns trueutil.types.isMapIterator(map.values());// Returns trueutil.types.isMapIterator(map.entries());// Returns trueutil.types.isMapIterator(map[Symbol.iterator]());// Returns trueutil.types.isModuleNamespaceObject(value)#
Returnstrue if the value is an instance of aModule Namespace Object.
import *as nsfrom'./a.js';util.types.isModuleNamespaceObject(ns);// Returns trueutil.types.isNativeError(value)#
Error.isError instead.Note: As of Node.js v24,Error.isError() is currently slower thanutil.types.isNativeError().If performance is critical, consider benchmarking both in your environment.
Returnstrue if the value was returned by the constructor of abuilt-inError type.
console.log(util.types.isNativeError(newError()));// trueconsole.log(util.types.isNativeError(newTypeError()));// trueconsole.log(util.types.isNativeError(newRangeError()));// trueSubclasses of the native error types are also native errors:
classMyErrorextendsError {}console.log(util.types.isNativeError(newMyError()));// trueA value beinginstanceof a native error class is not equivalent toisNativeError()returningtrue for that value.isNativeError() returnstrue for errorswhich come from a differentrealm whileinstanceof Error returnsfalsefor these errors:
import { createContext, runInContext }from'node:vm';import { types }from'node:util';const context =createContext({});const myError =runInContext('new Error()', context);console.log(types.isNativeError(myError));// trueconsole.log(myErrorinstanceofError);// falseconst { createContext, runInContext } =require('node:vm');const { types } =require('node:util');const context =createContext({});const myError =runInContext('new Error()', context);console.log(types.isNativeError(myError));// trueconsole.log(myErrorinstanceofError);// false
Conversely,isNativeError() returnsfalse for all objects which were notreturned by the constructor of a native error. That includes valueswhich areinstanceof native errors:
const myError = {__proto__:Error.prototype };console.log(util.types.isNativeError(myError));// falseconsole.log(myErrorinstanceofError);// trueutil.types.isNumberObject(value)#
Returnstrue if the value is a number object, e.g. createdbynew Number().
util.types.isNumberObject(0);// Returns falseutil.types.isNumberObject(newNumber(0));// Returns trueutil.types.isPromise(value)#
Returnstrue if the value is a built-in<Promise>.
util.types.isPromise(Promise.resolve(42));// Returns trueutil.types.isProxy(value)#
Returnstrue if the value is a<Proxy> instance.
const target = {};const proxy =newProxy(target, {});util.types.isProxy(target);// Returns falseutil.types.isProxy(proxy);// Returns trueutil.types.isRegExp(value)#
Returnstrue if the value is a regular expression object.
util.types.isRegExp(/abc/);// Returns trueutil.types.isRegExp(newRegExp('abc'));// Returns trueutil.types.isSet(value)#
Returnstrue if the value is a built-in<Set> instance.
util.types.isSet(newSet());// Returns trueutil.types.isSetIterator(value)#
Returnstrue if the value is an iterator returned for a built-in<Set> instance.
const set =newSet();util.types.isSetIterator(set.keys());// Returns trueutil.types.isSetIterator(set.values());// Returns trueutil.types.isSetIterator(set.entries());// Returns trueutil.types.isSetIterator(set[Symbol.iterator]());// Returns trueutil.types.isSharedArrayBuffer(value)#
Returnstrue if the value is a built-in<SharedArrayBuffer> instance.This doesnot include<ArrayBuffer> instances. Usually, it isdesirable to test for both; Seeutil.types.isAnyArrayBuffer() for that.
util.types.isSharedArrayBuffer(newArrayBuffer());// Returns falseutil.types.isSharedArrayBuffer(newSharedArrayBuffer());// Returns trueutil.types.isStringObject(value)#
Returnstrue if the value is a string object, e.g. createdbynew String().
util.types.isStringObject('foo');// Returns falseutil.types.isStringObject(newString('foo'));// Returns trueutil.types.isSymbolObject(value)#
Returnstrue if the value is a symbol object, createdby callingObject() on aSymbol primitive.
const symbol =Symbol('foo');util.types.isSymbolObject(symbol);// Returns falseutil.types.isSymbolObject(Object(symbol));// Returns trueutil.types.isTypedArray(value)#
Returnstrue if the value is a built-in<TypedArray> instance.
util.types.isTypedArray(newArrayBuffer());// Returns falseutil.types.isTypedArray(newUint8Array());// Returns trueutil.types.isTypedArray(newFloat64Array());// Returns trueSee alsoArrayBuffer.isView().
util.types.isUint8Array(value)#
Returnstrue if the value is a built-in<Uint8Array> instance.
util.types.isUint8Array(newArrayBuffer());// Returns falseutil.types.isUint8Array(newUint8Array());// Returns trueutil.types.isUint8Array(newFloat64Array());// Returns falseutil.types.isUint8ClampedArray(value)#
Returnstrue if the value is a built-in<Uint8ClampedArray> instance.
util.types.isUint8ClampedArray(newArrayBuffer());// Returns falseutil.types.isUint8ClampedArray(newUint8ClampedArray());// Returns trueutil.types.isUint8ClampedArray(newFloat64Array());// Returns falseutil.types.isUint16Array(value)#
Returnstrue if the value is a built-in<Uint16Array> instance.
util.types.isUint16Array(newArrayBuffer());// Returns falseutil.types.isUint16Array(newUint16Array());// Returns trueutil.types.isUint16Array(newFloat64Array());// Returns falseutil.types.isUint32Array(value)#
Returnstrue if the value is a built-in<Uint32Array> instance.
util.types.isUint32Array(newArrayBuffer());// Returns falseutil.types.isUint32Array(newUint32Array());// Returns trueutil.types.isUint32Array(newFloat64Array());// Returns falseDeprecated APIs#
The following APIs are deprecated and should no longer be used. Existingapplications and modules should be updated to find alternative approaches.
util._extend(target, source)#
Object.assign() instead.Theutil._extend() method was never intended to be used outside of internalNode.js modules. The community found and used it anyway.
It is deprecated and should not be used in new code. JavaScript comes with verysimilar built-in functionality throughObject.assign().
util.isArray(object)#
Array.isArray() instead.Alias forArray.isArray().
Returnstrue if the givenobject is anArray. Otherwise, returnsfalse.
const util =require('node:util');util.isArray([]);// Returns: trueutil.isArray(newArray());// Returns: trueutil.isArray({});// Returns: false