lodash里的is系列(五)

100 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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变量处理环境的兼容性问题。