携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
前言
本篇章我们将学习Set和Map的判断方法,实现上将借助 《 lodash里的is系列(四) 》 和 《 关于lodash内部方法getTag的实现 》里提到的封装方法,主要是处理环境兼容性问题以及数据类型标签的获取。
isSet
isSet方法主要检查 value 是否是一个Set对象。
使用如下:
_.isSet(new Set);
// => true
_.isSet(new WeakSet);
// => false
_.isSet(new Map);
// => false
_.isSet({});
// => false
在实现上isSet方法需要借助内部封装的方法和变量,主要是针对不同环境下的全局变量不同而做出的兼容性处理,内部是实现上借助了freeGlobal变量、baseUnary基础方法、nodeUtil工具方法、以及基础的判断Set对象的baseIsSet方法。
baseIsSet
baseIsSet方法适合当前环境存在Set构造函数下,可以直接调用该方法判断数据是否属于Set对象。
实现上通过getTag 方法获取数据的类型标签,通过isObjectLike 方法判断目标数据是否属于类对象。
源码如下:
import getTag from './_getTag.js';
import isObjectLike from './isObjectLike.js';
var setTag = '[object Set]';
function baseIsSet(value) {
return isObjectLike(value) && getTag(value) == setTag;
}
isSet
isSet方法是lodash对外导出的方法,该方法兼容了node环境和浏览器环境,适合不同环境下的方法调用,解决环境兼容性问题。
实现上主要借助baseIsSet 方法判断数据,即是方法的核心。通过nodeIsSet 变量判断当前环境,即环境存在nodeUtil 变量并且nodeUtil 变量身上具有isSet方法,将isSet方法赋值给变量nodeIsSet。
源码如下:
import baseIsSet from './_baseIsSet.js';
import baseUnary from './_baseUnary.js';
import nodeUtil from './_nodeUtil.js';
var nodeIsSet = nodeUtil && nodeUtil.isSet;
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
export default isSet;
isMap
isMap方法主要是检查参数value 是否为一个 Map 对象。
使用如下:
_.isMap(new Map);
// => true
_.isMap(new WeakMap);
// => false
_.isMap()
// => false
_.isMap({})
// => false
_.isMap([])
// => false
_.isMap(1)
// => false
isMap方法在实现上和isSet方法实现类似,lodash内部为了兼容不同环境抽离出了基础方法baseIsMap,该方法主要是浏览器环境下的实现,仅供内部使用。
baseIsMap
在实现上,baseIsMap方法借助getTag获取目标数据类型标签,通过isObjectLike判断目标数据是否属于有效的类对象。
源码如下:
import getTag from './_getTag.js';
import isObjectLike from './isObjectLike.js';
var mapTag = '[object Map]';
function baseIsMap(value) {
return isObjectLike(value) && getTag(value) == mapTag;
}
isMap
isMap方法是lodash对外导出的方法,通过nodeUtil获取node环境下的isMap方法并赋值给nodeIsMap 变量。借助baseIsMap 基础判断方法和baseUnary通用处理方法,在node环境下通过调用baseUnary(nodeIsMap)获取新的处理函数isMap,浏览器环境下则直接复用baseIsMap方法。
源码如下:
import baseIsMap from './_baseIsMap.js';
import baseUnary from './_baseUnary.js';
import nodeUtil from './_nodeUtil.js';
var nodeIsMap = nodeUtil && nodeUtil.isMap;
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
小结
本篇章我们学习了Set和Map的判断方法,通过内部封装的getTag方法和isObjectLike方法实现核心的判断逻辑,通过freeGlobal变量、baseUnary基础方法、nodeUtil变量处理环境的兼容性问题。