isBoolean()
在Lodash中,isBoolean()是一个用于检查给定值是否为布尔值的函数。它接受一个参数并返回一个布尔值,如果参数是布尔值则返回true,否则返回false。
它的源码如下:
function isBoolean(value) {
return (
value === true ||
value === false ||
(isObjectLike(value) && getTag(value) == "[object Boolean]")
);
}
在return中的第一第二行很好理解,但为什么会有第三行呢?
原因是JavaScript 中还存在布尔对象这一概念,布尔对象不会等于true或者false,它是 Boolean 对象的实例,其 typeof 值为 "object"。
console.log(typeof new Boolean(false)); //object
console.log(new Boolean(false) === false); //false
布尔对象满足两个条件:
一、它是一个对象。
二、它的Object.prototype.toString() 值为"[object Boolean]"。
要判断value是否是一个布尔对象就需要用到isObjectLike()与getTag()。
isObjectLike()
isObjectLike()用于判断是否是一个对象且不为null,在lodash源码中有大量的应用。
function isObjectLike(value) {
return typeof value === "object" && value !== null;
}
因为null在js中会被识别为对象,所以这里做了处理
getTag()
getTag()用于判断value的数据类型。
function getTag(value) {
if (value == null) {
return value === undefined ? "[object Undefined]" : "[object Null]";
}
return toString.call(value);
}
因为Js中 null == undefined 为true,为了识别value到底是null还是undefined,所以在这里对两者做了判断。
toString.call(value) 常用于判断数据类型 ,相当于调用了Object.prototype.toString.call(value) 。
通过 (isObjectLike(value) && getTag(value) == "[object Boolean]"),我们就可以轻松地判断出value是否是布尔值啦
本文用于记录自己的源码学习,欢迎大家指出错误