携手创作,共同成长!这是我参与「掘金日新计划 · 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方法名实现了语义化命名,在项目中运用适当方法也可以使代码更直观。