1. 引言:什么是 node.is?
在 Node.js 开发中,我们经常需要精确判断一个值的类型。虽然 JavaScript 提供了 typeof 和 instanceof 等操作符,但在处理 Buffer、TypedArray、Promise 等 Node.js 特有或复杂的原生对象时,它们往往力不从心,或者结果不够精确。
node.is 并非一个全局对象,而是对 Node.js 内置 util.types 模块中一系列 is* 类型检查方法的俗称。这些方法提供了可靠、精确且跨上下文的类型判断,是编写健壮 Node.js 代码的利器。
本文将深入总结 util.types.is* 方法的核心场景、使用技巧与最佳实践。
2. 核心方法速览
util.types 提供了数十个 is* 方法。以下是一些最常用和关键的方法:
| 方法名 | 检查类型 | 典型用例 |
|---|---|---|
isDate |
Date 对象 | 区分 Date 对象与普通对象 |
isRegExp |
RegExp 对象 | 检查正则表达式 |
isArrayBuffer |
ArrayBuffer | 判断是否为 ArrayBuffer |
isTypedArray |
任何 TypedArray (Uint8Array 等) | 处理二进制数据 |
isPromise |
Promise | 判断是否为 Promise 对象 |
isGeneratorObject |
Generator 对象 | 识别生成器函数返回的对象 |
isAsyncFunction |
异步函数 | 判断函数是否为 async function |
isAnyArrayBuffer |
ArrayBuffer 或 SharedArrayBuffer | 更宽泛的二进制缓冲区检查 |
isBoxedPrimitive |
被包装的基本类型 (如 new Number(1)) |
识别罕见的包装对象 |
isMap / isSet |
Map / Set 集合 | 检查 ES6 集合类型 |
isWeakMap / isWeakSet |
WeakMap / WeakSet | 检查弱引用集合 |
isProxy |
Proxy 对象 | 判断对象是否为 Proxy 代理 |
3. 多场景实用总结
场景一:精确的类型守卫(Type Guard)
在 TypeScript 或需要严格类型判断的逻辑中,util.types.is* 方法可以作为完美的类型守卫。
const util = require('util');
function processInput(input) {
if (util.types.isPromise(input)) {
// 类型收窄为 Promise<any>
return input.then(handleResult);
}
if (util.types.isArrayBuffer(input)) {
// 类型收窄为 ArrayBuffer
const view = new Uint8Array(input);
return processBuffer(view);
}
if (util.types.isDate(input)) {
// 类型收窄为 Date
return input.toISOString();
}
// ... 其他类型处理
}
优势:比 instanceof 更可靠,尤其是在跨 Realm(如不同的 vm 上下文、iframe)的情况下,instanceof 会失效,而 util.types.is* 依然有效。
场景二:处理二进制数据与 Buffer
Node.js 的核心优势之一是高效的 I/O 和二进制数据处理。util.types.is* 在这方面提供了精细的控制。
const util = require('util');
function safeBufferConcat(chunks) {
const validChunks = chunks.filter(chunk =>
util.types.isAnyArrayBuffer(chunk) ||
Buffer.isBuffer(chunk) ||
util.types.isTypedArray(chunk)
);
return Buffer.concat(validChunks.map(chunk =>
Buffer.from(chunk) // 统一转换为 Buffer
));
}
// 示例:区分不同类型的二进制视图
const buf = Buffer.from('hello');
const arrBuf = new ArrayBuffer(10);
const uintArr = new Uint8Array([1,2,3]);
console.log(util.types.isTypedArray(buf)); // false, Buffer 不是 TypedArray
console.log(util.types.isUint8Array(uintArr)); // true
console.log(util.types.isArrayBuffer(arrBuf)); // true
场景三:函数与异步流程控制
在中间件、拦截器或高阶函数中,需要根据输入函数的类型采取不同策略。
const util = require('util');
async function callMaybeAsync(fn, ...args) {
if (util.types.isAsyncFunction(fn)) {
1046



被折叠的 条评论
为什么被折叠?



