携手创作,共同成长!这是我参与「掘金日新计划 · 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系列主要是判断目标数据是否符合预期,而这里我们除了针对数字类型的拓展,还讲解判断元素节点,判断错误类型等。