本文分析一个用于判断JavaScript数据类型的 is 函数。该函数利用 Object.prototype.toString 获取对象内部[[Class]]属性,通过 slice 截取类型字符串。针对 null 和 undefined 的特殊返回值,代码进行了单独处理,并探讨了声明 undefined 局部变量的性能优化意图。
JavaScript 类型判断 is 函数源码实现
代码如下:
var is = function(obj,type){
var toString=Object.prototype.toString,undefined;
return obj===null&&type==='Null'||
obj===undefined&&type==='Undefined'||
toString.call(obj).slice(8,-1)===type;
}
//原文中有小括号包裹每个逻辑与运算,但根据运算符优先级,括号可以省略
//第一行声明undefined,个人理解是为了提高性能,不必再去顶级作用域中查询undefined. 根据ECMA-262标准,Object.prototype.toString() 方法返回对象实例的类型信息,其返回格式为包含 '[object ', class 名称以及 ']' 的字符串。
因此,通过 slice 方法截取第8位到倒数第1位之间的字符,即可获取具体的类型值(class)。
其中 null 与 undefined 属于例外情况,因为直接调用 toString 时它们返回的是
IE浏览器中显示为 [object Object]
标准浏览器中显示为 [object Window](或特定宿主环境对象)。
鉴于上述差异,代码中对这两种类型进行了单独判断处理。
相关文章:javascript 深拷贝