lodash里常用的类型判断

1,206 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

lodash里的is方法系列主要是验证数据是否符合预期的类型,本篇章主要讲解常用数据类型的判断方法。

null

验证数据是否等于null可以使用isNull方法,该方法内部主要用了===操作符。

function isNull(value) {
  return value === null;
}

undefined

验证数据是否等于undefined可以使用isUndefined方法,内部实现使用===操作符。

function isUndefined(value) {
  return value === undefined;
}

类对象

在很多情况下,我们需要判断一个数据的类型是否是对象类型但是又不属于null就可以用此方法。该方法除了对象生效,还可以是数组等。

function isObjectLike(value) {
  return value != null && typeof value == 'object';
}ˆ

数字

验证一个数据是否是数字类型,可以使用isNumber方法,该方法主要加强typeof的判断,对new Number等类型进行处理。

var numberTag = '[object Number]';

function isNumber(value) {
  return typeof value == 'number' ||
    (isObjectLike(value) && baseGetTag(value) == numberTag);
}


typeof new Number('1')
// => 'object'

Object.prototype.toString.call(new Number(1))
// => '[object Number]'

这里借助了isObjectLike方法验证数据,baseGetTag主要获取toString.call之后的结果,或后面的判断主要是验证new Number的情况。

NaN

验证数据是否等于NaN可以通过isNaN方法处理验证,由于NaN不等于NaN,所以实现上借助该特性,并调用isNumber方法验证其是否属于数字类型。

function isNaN(value) {
  return isNumber(value) && value != +value;
}

字符串

验证字符串类型的数据可以用isString方法,同isNumber实现一样,针对常规字符串用typeof类型判断,其中增强了对new String方法进行处理。

var stringTag = '[object String]';

function isString(value) {
  return typeof value == 'string' ||
    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
}

Object.prototype.toString.call(new String('a'))
// => '[object String]'

Symbol

验证Symbol类型的数据可以用isSymbol方法,该方法主要是通过实现思路如下:

  • 调用typeof判断数据类型是symbol类型。
  • 由于旧浏览器可能typeof判断不了symbol,所以可以通过isObjectLike判断其是否属于对象类型,再调用baseGetTag获取数据的标签特征,看看是否属于[object Symbol]。
var symbolTag = '[object Symbol]';

function isSymbol(value) {
  return typeof value == 'symbol' ||
    (isObjectLike(value) && baseGetTag(value) == symbolTag);
}

数组

验证数组可以使用isArray方法,内部实现直接运用Array.isArray方法。

var isArray = Array.isArray;

对象

验证对象类型数据可以使用isObject方法,内部实现主要使用typeof操作符,并对数据进行非null判断,function也属于对象。

function isObject(value) {
  var type = typeof value;
  return value != null && (type == 'object' || type == 'function');
}

函数

验证函数可以使用isFunction方法,在实现上,对于参数会先调用isObject判断,如果不是对象类型,则返回false,其次调用baseGetTag获取参数toString.call之后的结果。

对于函数类型,细分的话还有普通函数、异步函数、生成器函数、代理函数。

所以内部还调用baseGetTag方法获取其相对的函数类型。

var asyncTag = '[object AsyncFunction]',
    funcTag = '[object Function]',
    genTag = '[object GeneratorFunction]',
    proxyTag = '[object Proxy]';

function isFunction(value) {
  if (!isObject(value)) {
    return false;
  }
  // The use of `Object#toString` avoids issues with the `typeof` operator
  // in Safari 9 which returns 'object' for typed arrays and other constructors.
  var tag = baseGetTag(value);
  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}

typeof Promise.resolve(()=>{})
// => 'object'

小结

本篇章主要讲解常用的数据类型判断方法,可以看到lodash对于数据类型的判断增加了严谨性和兼容性。

在大多数判断中还借助了getTag的内部方法,该方法能够获取数据的类型并返回特定的类型标签。

实际项目中我们也可以借助lodash的es模块,对于数据类型判断进行按需引用,减少对非常规数据类型的漏检,同时lodash方法名实现了语义化命名,在项目中运用适当方法也可以使代码更直观。