Where is JavaScript?

lodash源码学习 - 类型检测

类型检测的坑是JS coder在日常开发工作中常常遇到的,本文在阅读了`lodash`相关源码的基础上,来介绍下`lodash`处理类型检测的一些基本思路和方法。

一些特殊的工具函数

原生性检测 - isNative

lodash初始化分别构造了针对原生函数的正则reIsNative和针对IE<9场景下Host Object的正则reIsHostCtor

              
  • 1
  • 2
/^function.*?\(\) \{ \[native code\] \}$/ // reIsNative /^\[object .+?Constructor\]$/ // reIsHostCtor

通过对传入参数调用toString方法去进行检测

是否对象化检测 - isObjectLike

做对象化检测来确定能否调用toString等对象方法

基础类型检测

isArray

首先会取原生方法Array.isArray,若不存在且参数为ObjectLike,则调用toString方法检查是否为'[object Array]'

isBoolean

首先判断是否与truefalse严格相等,若非且参数为ObjectLike则调用toString方法检查是否为'[object Boolean]'

isNumber

首先用typeof判断value == 'number',若非且参数为ObjectLike则调用toString方法检查是否为'[object Number]'

isString

首先用typeof判断value == 'string',若非且参数为ObjectLike则调用toString方法检查是否为'[object String]'

isObject

做了非空检查排除null

isUndefinedisNull

这两者比较单一,直接用严格相等做判断

总结,基础类型和function的检测可以通过typeof加严格相等来测试,typeof的坑在于对于Array,Null等特殊对象使用typeof一律返回object,下附JavaScript Garden整理出来的表格

              
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
Value function typeof ------------------------------------- "foo" String string new String("foo") String object 1.2 Number number new Number(1.2) Number object true Boolean boolean new Boolean(true) Boolean object new Date() Date object new Error() Error object [1,2,3] Array object new Array(1, 2, 3) Array object new Function("") Function function /abc/g RegExp object new RegExp("meow") RegExp object {} Object object new Object() Object object

特殊对象检测

isDate

判断参数为ObjectLike则调用toString方法检查是否为'[object Date]'

isFunction

判断参数为ObjectLike则调用toString方法检查是否为'[object Function]'

isRegExp

判断参数为ObjectLike则调用toString方法检查是否为'[object RegExp]'

特殊类型检测

isNaN

              
  • 1
return isNumber(value) && value != +value;

本文于 2016-4-2  发布在  编程  分类下, 当前已被围观 249 次

并被添加「 JavaScript 」标签

本站使用「 署名 4.0 国际」创作共享协议