javascript类型判断

通常为了快捷我们都会使用 typeof 操作符去判断变量的类型,但是这种做法不能准确判断出变量的类型。

比如:

typeof [];    // 返回 'object'
typeof {};    // 返回 'object'
typeof new Number(1);    // 返回 'object'
typeof new Array('a', 'b');    // 返回 'object'
typeof new String('abc');  
// 返回 'object'
typeof new Function();  // 返回 'function'

typeof 操作符在判断 new 出来的对象时除了 new Function 其他通常返回 'object'。

因此为了能准确判断类型,我们找到了一个更好的方法就是通过 call 调用 Object 原型上的 toString 方法来获取变量的具体类型。

Object.prototype.toString.call( obj );

我看了下jquery里面的用来判断变量类型的 type 函数,实现得相对复杂。

其用法类似是这样的:

var abc = 'abc';
if( jQuery.type( abc ) === 'string' ) {
    //是字符类型的话就执行这里
}else{
    //不是就执行这里
}

jQuery.type 函数最终返回传进去变量的类型,还需要我们通过运算符比较来判断。

觉得有些多余,不如像下面这样来的方便快捷:

var abc = 'abc';
if( isType(abc, 'string') ) {
    //true
}else{
    //false
}

isType 函数接受一个字符串参数,直接返回 true 还是 false。

我是这样实现的:

function isType( obj, type ) {
    var toStr = Object.prototype.toString;
    var toLower = toStr.call( obj ).toLowerCase();
    return toLower.indexOf( '[object ' + type + ']' ) !== -1;
}

还有一个通过正则来实现的版本:

function isType( obj, type ) {
    var toStr = Object.prototype.toString.call( obj );
    return (new RegExp('\[object ' + type + '\]' , "i")).test( toStr );
}

在javascript里类型判断非常常用,于是我把这个函数直接添加到 Object.prototype 上,这样的话每个变量都能继承这个函数了。

Object.prototype.isType = function( type ) {
    var toStr = Object.prototype.toString;
    var toLower = toStr.call( this ).toLowerCase();
    return toLower.indexOf( '[object ' + type + ']' ) !== -1;
};

这样加上去的话就方便多了:

'abc'.isType( 'string' )    // 返回true
'abc'.isType( 'number' )    // 返回false

['a', 'b', 'c'].isType( 'array' )    // 返回true
['a', 'b', 'c'].isType( 'string' )    // 返回false

(123).isType( 'number' )    // 返回true
(123).isType( 'string' )    // 返回false

new Date().isType( 'date' )    // 返回true
new Date().isType( 'number' )    // 返回false
原文地址:https://www.cnblogs.com/ruleblog/p/4521288.html