为什么要重写typeof方法?
typeof 可以准确的判断除object以外的基础数据类型,但不能区分object类型的具体类型,比如 Array 、Date、NULL、NaN 以及自定义类。
观察上面的结果:
typeof NaN
的结果是number,可以通过isNaN()来判断(存在局限性,详情点击查看)typeof []
的结果是object,可以通过Array.isArray()来判断(存在局限性,详情点击查看)- typeof null
的结果是object
重写typeof代码:
// 该方法不包含NaN的类型判断 function myTypeOf (target) { var template = { '[object Array]': 'array', // 数组 '[object Object]': 'object', // 对象 '[object Number]': 'number - object', // 数据对象(用new Number()定义出来的) '[object Boolean]': 'boolean - object', // 用new Boolean()定义出来 '[object String]': 'string - object' // 用new String()定义出来的 } if (target === null) { return "null" } else if (typeof(target) === 'object') { // 返回object时具体区分 var str = Object.prototype.toString.call(target); return template[str] } else { // 原始值 return typeof(target); } }