Lodash源码阅读-isDate

180 阅读1分钟

baseIsDate 是 isDate 浏览器环境下的实现

功能概述

baseIsDate 函数是 Lodash 中用于判断一个值是否为 Date 对象的内部工具函数。它通过组合使用 isObjectLike 和 baseGetTag 两个基础函数,实现了对日期类型的精确判断。

源码实现

// baseIsDate
function baseIsDate(value) {
  return isObjectLike(value) && baseGetTag(value) == dateTag;
}

实现原理解析

1. 对象特征检查

函数首先通过 isObjectLike(value) 进行初步的类型过滤:

  • 确保传入的值不是 null
  • 确保传入的值是对象类型(typeof value === 'object')

这一步骤是必要的,因为:

// 非对象类型直接返回 false
isObjectLike(null); // => false
isObjectLike(undefined); // => false
isObjectLike(1); // => false
isObjectLike("date"); // => false

2. 日期标签匹配

函数通过 baseGetTag(value) == dateTag 进行精确的类型判断:

  • baseGetTag 函数返回对象的原始类型标签
  • dateTag 常量值为 '[object Date]'

这种实现方式的优势:

// Date 对象返回 true
baseIsDate(new Date()); // => true

// 非 Date 对象返回 false
baseIsDate({}); // => false
baseIsDate([]); // => false
baseIsDate("2023-01-01"); // => false

总结

baseIsDate 函数通过巧妙地结合 isObjectLike 和 baseGetTag 两个基础函数,实现了对 Date 类型的精确判断。