Nodejs源码解析之util

本文将探讨Node.js的util模块,这是一个内部API,用于提供各种工具函数。内容涵盖判断类型、格式化对象和字符串以及对象关系。通过源码分析,我们发现判断类型主要依赖于typeof、instanceof和Object.prototype.toString方法。在对象关系部分,重点讲解了inherits和_extend函数的实现细节。对于格式化,util提供了format和inspect函数,其源码包含复杂的递归处理和特殊场景应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

util是nodejs中的工具类,属于内部API,被nodejs其他模块使用。 可以浏览官方文档:https://nodejs.org/dist/latest-v5.x/docs/api/util.html#util_util_inspect_object_options

其基本的API可以分成以下类型:

  • 判断类型, 返回值为布尔类型,判断一个值是否为特定类型,如isBoolean,isBuffer,isDate等。
  • 格式化字符串,对象
  • 对象关系,如inherits,_extend

分成以上部分进行源码分析:

判断类型

// 判断一个对象是否为布尔类型
function isBoolean(arg) {
   
  // 使用typeof关键字,如果是boolean就为boolean类型
  return typeof arg === 'boolean';
}

// 导出函数
exports.isBoolean = isBoolean;

// 判断是否为null,
function isNull(arg) {
   
   // 请注意使用的是 ===
  return arg === null;
}
// 导出函数
exports.isNull = isNull;

// 判断是否为null或者undefined
function isNullOrUndefined(arg) {
   
  // 注意,使用的是 ==
  return arg == null;
}
// 导出函数
exports.isNullOrUndefined = isNullOrUndefined;

// 是否为数字类型
function isNumber(arg) {
   
  //注意是 === 
  return typeof arg === 'number';
}
// 导出函数
exports.isNumber = isNumber;

// 是否为string类型
function isString(arg) {
   
// 使用的依然是typeof类型
  return typeof arg === 'string';
}

// 导出函数
exports.isString = isString;

// 是否为symbol类型
function isSymbol(arg) {
   
  return typeof arg === 'symbol';
}
// 导出函数
exports.isSymbol = isSymbol;

// 是否为undefined类型
function isUndefined(arg) {
   
   // 注意,使用的是void 0, 其实可以用typeof。个人理解应该是性能问题
   // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
  return arg === void 0;
}
// 导出isUndefined 
exports.isUndefined = isUndefined;

// 是否为正则表达式
function isRegExp(re) {
   
  // 是否为object
  // 是否为RegExp
  return isObject(re) && objectToString(re) === '[object RegExp]';
}
// 导出
exports.isRegExp = isRegExp;

// 是否为object对象
function isObject(arg) {
   
   // typeof对象,需要不是null
  return typeof arg === 'object' && arg !== null;
}
// 导出函数
exports.isObject = isObject;

// 是否为Date
function isDate(d) {
   

  return isObject(d) && objectToString(d) === '[object Date]';
}
// 导出是否为Date
exports.isDate = isDate;

// 是否为Error对象
function isError(e) {
   
  return isObject(e) &&
      (objectToString(e) === '[object Error]' || e instanceof Error);
}
// 导出
exports.isError = isError;

// 是否为函数
function isFunction(arg) {
   
  return typeof arg === 'function';
}
// 导出函数
exports.isFunction = isFunction;

// 是否为原对象
function isPrimitive(arg) {
   
  // 具体的原对象为
  return arg === null ||
         typeof arg === 'boolean' ||
         typeof arg === 'number' ||
         typeof arg === 'string' ||
         typeof arg === 'symbol' ||  // ES6 symbol
         typeof arg === 'undefined';
}
//导出原子对象
exports.isPrimitive = isPrimitive;

// 是否为Buffer对象
function isBuffer(arg) {
   
 // 注意这里用的是
  return arg instanceof Buffer;
}
exports.isBuffer = isBuffer;

// 帮组函数或获取对象的表达字符串
function objectToString(o) {
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值