携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
前言
本篇章我们将学习isWeakMap、isWeakSet、isArrayBuffer、isDate、isRegExp判断方法,实现上将借助 《 lodash里的is系列(四) 》 和 《 关于lodash内部方法getTag的实现 》里提到的封装方法,主要是处理环境兼容性问题以及数据类型标签的获取。
isWeakMap
isWeakMap方法主要是检查参数value 是否是WeakMap 对象,是lodash对外导出的方法。
使用如下:
var weakMap = new WeakMap()
weakMap.set({a:1},{a:2})
_.isWeakMap(weakMap)
// => true
_.isWeakMap({})
// => false
_.isWeakMap([])
// => false
_.isWeakMap(1)
// => false
同Set、Map方法实现一样,实现上借助getTag 获取数据的类型标签,而isObjectLike 则是验证数据是否属于类对象,当且仅当数据属于类对象,并且类型标签是[object WeakMap]时,则可判定该数据为WeakSet数据。
源码如下:
import getTag from './_getTag.js';
import isObjectLike from './isObjectLike.js';
var weakMapTag = '[object WeakMap]';
function isWeakMap(value) {
return isObjectLike(value) && getTag(value) == weakMapTag;
}
isWeakSet
isWeakSet方法主要是检查参数value是否是WeakSet对象,是lodash对外导出的方法。
使用如下:
var weakSet = new WeakSet()
weakSet.add({a:1})
_.isWeakSet(weakSet)
// => true
_.isWeakSet({})
// => false
_.isWeakSet([])
// => false
_.isWeakSet(1)
// => false
isWeakSet方法实现同isWeakMap方法一样,借助baseGetTag 方法和isObjectLike 方法进行处理。
源码如下:
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
var weakSetTag = '[object WeakSet]';
function isWeakSet(value) {
return isObjectLike(value) && baseGetTag(value) == weakSetTag;
}
isArrayBuffer
isArrayBuffer 方法主要是检查value是否是ArrayBuffer对象。
使用如下:
_.isArrayBuffer(new ArrayBuffer(2));
// => true
_.isArrayBuffer(new Array(2));
// => false
_.isArrayBuffer({});
// => false
isArrayBuffer方法在实现上为了兼容不同环境,借助nodeUtil 变量获取node环境下的isArrayBuffer方法,通过baseUnary方法返回新的方法,即node环境下的isArrayBuffer方法,其实现核心是baseIsArrayBuffer方法。
baseIsArrayBuffer
baseIsArrayBuffer方法作为判断ArrayBuffer对象的核心实现,主要借助baseGetTag 方法获取目标数据的类型标签,通过isObjectLike 方法判断目标数据是否属于类对象,只有当目标数据属于类对象并且类型标签为[object ArrayBuffer]时则表示目标数据为ArrayBuffer对象。
在大多数判断数据类型的方法中,baseGetTag是核心方法。
baseIsArrayBuffer方法源码如下:
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
var arrayBufferTag = '[object ArrayBuffer]';
function baseIsArrayBuffer(value) {
return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
}
isArrayBuffer
isArrayBuffer方法借助baseUnary 方法和nodeUtil变量 返回node环境下的isArrayBuffer判断方法,在浏览器环境下则返回baseIsArrayBuffer方法。
源码如下:
import baseIsArrayBuffer from './_baseIsArrayBuffer.js';
import baseUnary from './_baseUnary.js';
import nodeUtil from './_nodeUtil.js';
var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer;
var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
isDate
isDate方法检查参数value 是否是 Date 对象。
使用如下:
_.isDate(new Date);
// => true
_.isDate('Mon April 23 2012');
// => false
同理,判断Date对象内部兼容实现为了兼容不同环境借助baseUnary 方法调用返回nodeUtil变量里的isDate方法,核心实现为baseIsDate 方法。
baseIsDate 方法实现上借助baseGetTag方法获取目标数据的类型标签,
baseIsDate 方法源码如下:
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
var dateTag = '[object Date]';
function baseIsDate(value) {
return isObjectLike(value) && baseGetTag(value) == dateTag;
}
isDate方法源码如下:
import baseIsDate from './_baseIsDate.js';
import baseUnary from './_baseUnary.js';
import nodeUtil from './_nodeUtil.js';
var nodeIsDate = nodeUtil && nodeUtil.isDate;
var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
isRegExp
isRegExp方法主要检查 value 是否为RegExp对象。
使用如下:
_.isRegExp(/abc/);
// => true
_.isRegExp('/abc/');
// => false
baseIsRegExp方法源码如下:
同理,isRegExp方法内部实现上为了兼容不同环境,在node环境下借助baseUnary方法和nodeUtil变量,返回isRegExp判断方法,在浏览器环境下直接返回核心方法baseIsRegExp。
baseIsRegExp源码如下:
import baseGetTag from './_baseGetTag.js';
import isObjectLike from './isObjectLike.js';
var regexpTag = '[object RegExp]';
function baseIsRegExp(value) {
return isObjectLike(value) && baseGetTag(value) == regexpTag;
}
isRegExp源码如下:
import baseIsRegExp from './_baseIsRegExp.js';
import baseUnary from './_baseUnary.js';
import nodeUtil from './_nodeUtil.js';
var nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;
var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
小结
本篇章我们主要学习了isWeakMap、isWeakSet、isArrayBuffer、isDate、isRegExp等判断方法的内部实现,在lodash内部源码中,is系列大部分需要借助getTag方法和nodeUtil变量处理判断逻辑和兼容性问题。