lodash里的is系列(二)

348 阅读3分钟

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

前言

本篇章将继续深入lodash源码的is系列,该系列方法主要用于判断数据是否符合预期类型,并且多数方法与方法之间相互借助嵌套以封装实现。

isNil

isNil方法主要是判断数据是否为null,实际开发中可以用该方法简写代码判断。 使用如下:

_.isNil(null);
// => true
 
_.isNil(void 0);
// => true
 
_.isNil(NaN);
// => false

源码实现:

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

isElement

isElement方法可以判断一个数据是否属于元素节点。

在浏览器中,元素是一个类对象,且元素身上有一个Node.nodeType 属性,该属性表示的是该节点的类型。当且仅当值为1时表示元素节点。

使用如下:

_.isElement(document.body);
// => true
 
_.isElement('<body>');
// => false

lodash里的isElement方法在实现上借助了isObjectLike 方法和isPlainObject 方法。

当且仅当目标数据时类对象类型,并且数据不是普通对象,身上的nodeType属性值等于1时成立。

源码实现:

import isObjectLike from './isObjectLike.js';
import isPlainObject from './isPlainObject.js';

function isElement(value) {
  return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
}

isError

isError方法可以判断数据是否属于错误类型。

使用如下:

_.isError(new Error);
// => true
 
_.isError(Error);
// => false

isError方法在实现上借助baseGetTag 获取目标数据的类型标签,通过isObjectLike 判断是否属于类对象,通过isPlainObject 判断数据,只有当数据不等于普通对象时成立。

源码实现:

import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
import isPlainObject from './isPlainObject.js';

var domExcTag = '[object DOMException]',
    errorTag = '[object Error]';

function isError(value) {
  if (!isObjectLike(value)) {
    return false;
  }
  var tag = baseGetTag(value);
  return tag == errorTag || tag == domExcTag ||
    (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
}

isFinite

isFinite方法主要判断数据是否是无穷大。

使用如下:

_.isFinite(3);
// => true
 
_.isFinite(Number.MIN_VALUE);
// => true
 
_.isFinite(Infinity);
// => false
 
_.isFinite('3');
// => false

isFiniteF方法在实现上直接调用当前环境下的原生isFinite方法。通过root变量获取,root内部会根据环境获取node下或者window下的变量。

源码实现:

import root from './_root.js';

var nativeIsFinite = root.isFinite;
function isFinite(value) {
  return typeof value == 'number' && nativeIsFinite(value);
}

isInteger

isInteger方法可以检查 value 是否为一个整数。

使用如下:

_.isInteger(3);
// => true
 
_.isInteger(Number.MIN_VALUE);
// => false
 
_.isInteger(Infinity);
// => false
 
_.isInteger('3');
// => false

isInteger方法在实现上需要借助toInteger方法实现,而toInteger方法在实现上借助了toFinite方法,toFinite方法在《 lodash里的clamp和inRange 》里我们已经讲解到了。

toInteger

toInteger方法可以转换 value 为一个整数。

使用如下:

_.toInteger(3.2);
// => 3
 
_.toInteger(Number.MIN_VALUE);
// => 0
 
_.toInteger(Infinity);
// => 1.7976931348623157e+308
 
_.toInteger('3.2');
// => 3

源码如下:

import toFinite from './toFinite.js';

function toInteger(value) {
  var result = toFinite(value),
      remainder = result % 1;

  return result === result ? (remainder ? result - remainder : result) : 0;
}

isInteger

借助toInteger方法,我们只需验证数字类型并且toInteger为true同时成立即可返回true。

import toInteger from './toInteger.js';
function isInteger(value) {
  return typeof value == 'number' && value == toInteger(value);
}

isSafeInteger

isSafeInteger方法可以检查 value 是否是一个安全整数。

使用如下:

_.isSafeInteger(3);
// => true
 
_.isSafeInteger(Number.MIN_VALUE);
// => false
 
_.isSafeInteger(Infinity);
// => false
 
_.isSafeInteger('3');
// => false

实现该方法只需要调用isInteger方法并且数值在安全数区间即可。

源码如下:

import isInteger from './isInteger.js';

var MAX_SAFE_INTEGER = 9007199254740991;

function isSafeInteger(value) {
  return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
}

小结

本篇章主要讲解lodash源码里的is系列,is系列主要是判断目标数据是否符合预期,而这里我们除了针对数字类型的拓展,还讲解判断元素节点,判断错误类型等。