携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
前言
在lodash里的is系列是判断数据是否属于特定目标类型的一系列方法,在 《lodash里常用的类型判断 》这篇文章里已经讲解了一部分is系列的方法,除了对常用的类型判断,还可以对特定类型进行判断,下面我们来判断一下lodash里的is系列的其他方法。
isObjectLike
isObjectLike方法可以检查参数是否是类对象。 如果一个值是类对象,那么它不应该是 null,而且 typeof 后的结果是 "object"。
使用如下:
_.isObjectLike({});
// => true
_.isObjectLike([1, 2, 3]);
// => true
_.isObjectLike(_.noop);
// => false\
_.isObjectLike(null);
// => false
源码如下:
function isObjectLike(value) {
return typeof value === 'object' && value !== null
}
isPlainObject
isPlainObject方法可以检查参数是否是普通对象。也就是说该对象由 Object 构造函数创建,或者 [[Prototype]] 为 null 。
示例如下:
function Foo() {
this.a = 1;
}
_.isPlainObject(new Foo);
// => false
_.isPlainObject([1, 2, 3]);
// => false
_.isPlainObject({ 'x': 0, 'y': 0 });
// => true
_.isPlainObject(Object.create(null));
// => true
isPlainObject源码的实现上需要借助封装的getTag方法和isObjectLike方法,getTag方法在前面篇章 《 关于lodash内部方法getTag的实现 》 已经介绍过了,getTag方法主要获取目标数据的数据类型标签。
isPlainObject内部实现主要是通过Object.getPrototypeOf方法去原型链查找。
源码如下:
import getTag from './.internal/getTag.js'
import isObjectLike from './isObjectLike.js'
function isPlainObject(value) {
if (!isObjectLike(value) || getTag(value) != '[object Object]') {
return false
}
if (Object.getPrototypeOf(value) === null) {
return true
}
let proto = value
while (Object.getPrototypeOf(proto) !== null) {
proto = Object.getPrototypeOf(proto)
}
return Object.getPrototypeOf(value) === proto
}
isArguments
isArguments方法可以检查 value 是否是一个类 arguments 对象。
使用如下:
_.isArguments(function() { return arguments; }());
// => true
_.isArguments([1, 2, 3]);
// => false
isArguments方法在实现上同样是借助getTag方法获取指定数据的类型标签,通过isObjectLike判断指定数据是否属于对象类型。
源码如下:
import getTag from './.internal/getTag.js'
import isObjectLike from './isObjectLike.js'
function isArguments(value) {
return isObjectLike(value) && getTag(value) == '[object Arguments]'
}
isLength
isLength方法为检查参数是否为有效的类数组长度。 使用如下:
_.isLength(3);
// => true
_.isLength(Number.MIN_VALUE);
// => false
_.isLength(Infinity);
// => false
_.isLength('3');
// => false
源码如下:
const MAX_SAFE_INTEGER = 9007199254740991
function isLength(value) {
return typeof value === 'number' &&
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER
}
isArrayLike
isArrayLike方法可以检查 参数value 是否是类数组。 如果一个值被认为是类数组,那么它不是一个函数,并且value.length是个整数,大于等于 0,小于或等于 Number.MAX_SAFE_INTEGER。
使用如下:
_.isArrayLike([1, 2, 3]);
// => true
_.isArrayLike(document.body.children);
// => true
_.isArrayLike('abc');
// => true
_.isArrayLike(_.noop);
// => false
isArrayLike方法在实现上需要借助isLength方法判断参数是否是有效的长度。 源码如下:
import isLength from './isLength.js'
function isArrayLike(value) {
return value != null && typeof value !== 'function' && isLength(value.length)
}
isArrayLikeObject
isArrayLikeObject方法类似isArrayLike方法。除了它还检查参数value是否是个对象。
使用如下:
_.isArrayLikeObject([1, 2, 3]);
// => true
_.isArrayLikeObject(document.body.children);
// => true
_.isArrayLikeObject('abc');
// => false
_.isArrayLikeObject(_.noop);
// => false
isArrayLikeObject方法在实现上借助isArrayLike方法判断和isObjectLike方法判断,仅当二者同时成立时返回true。 源码如下:
import isArrayLike from './isArrayLike.js'
import isObjectLike from './isObjectLike.js'
function isArrayLikeObject(value) {
return isObjectLike(value) && isArrayLike(value)
}
小结
本篇章我们主要在lodash里的is系列基础上,介绍对象类型和数组类型的判断拓展,各个方法在实现上相互依赖,同时也供后续方法实现提供复用。