js中判断数据类型的方法大全总结。

发布于:2019-12-25 11:34:08

在实际开发中js中判断数据类型是非常常用的,方法有typeof,instanceof,Object.prototype.toString()等,可根据实际情况分别选择使用。

一、typeof判断数据类型。

javascript是一种弱类型语言脚本,因此需要有一种手段来检测给定变量的数据类型——typeof 就是负责提供这方面信息的操作符。对一个值使用typeof操作符可能返回下列某个字符串:

  • "undefined"——如果这个值未定义;
  • "boolean"——如果这个值是布尔值;
  • "string"——如果这个值是字符串;
  • "number"——如果这个值是数值;
  • "object"——如果这个值是对象或null;
  • "function"——如果这个值是函数。
let info = {
    a:null,
    b:[],
    c:{},
    d:0,
    e:false,
    f:undefined,
    g:null,
    h:NaN,
    i:'',
    j:new Date(),
    k:new RegExp()
}
for(let key in info){

    console.log(key,":",info[key],"--",'typeof 判断出的结果:',typeof info[key]);

    /*
     * 结果:
     * 
    a : null--typeof 判断出的结果: object  //不严谨
    b : []--typeof 判断出的结果: object  //不严谨:实际应用中数组和对象一般类型是分开的,用typeof判断数组不严谨
    c : {}--typeof 判断出的结果: object  
    d : 0--typeof 判断出的结果: number  
    e : false--typeof 判断出的结果: boolean  
    f : undefined--typeof 判断出的结果: undefined  
    g : null--typeof 判断出的结果: object  //不严谨
    h : NaN--typeof 判断出的结果: number  //不严谨
    i : ''--typeof 判断出的结果: string 
    j : new Date()--typeof 判断出的结果: object  
    k : new RegExp()--typeof 判断出的结果: object  

    */
}

二、toString()判断数据类型, Object.prototype.toString.call()或Object.prototype.toString.apply()。

一般数据类型都能够判断,最准确最常用的一种。为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Object.prototype.toString.call() 或者 Object.prototype.toString.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg。

let info = {
    a:null,
    b:[],
    c:{},
    d:0,
    e:false,
    f:undefined,
    g:null,
    h:NaN,
    i:'',
    j:new Date(),
    k:new RegExp()
}
for(let key in info){

    console.log(key,':',Object.prototype.toString.call(info[key]));

    /*
     * 结果:
     * 
    a :  [object Null]
    b :  [object Array]
    c :  [object Object]
    d :  [object Number]
    e :  [object Boolean]
    f :  [object Undefined]
    g :  [object Null]
    h :  [object Number]
    i :  [object String]
    j :  [object Date]
    k : [object RegExp]

    */
}

三、可用A intanceof B来判断,A是否是B的实例。

instanceof 运算符判断一个对象是否是另一个对象的实例。返回true或false。 instanceof 运算符用来检测 constructor.prototype 是否存在于参数 obj 的原型链上(或者说:检测obj的原型链上是否存在constructor.prototype )

let info = {
    a:null,
    b:[],
    c:{},
    d:0,
    e:false,
    f:undefined,
    g:null,
    h:NaN,
    i:'',
    j:new Date(),
    k:new RegExp()
}
console.log(info['a'] instanceof Object) //null---false
console.log(info['b'] instanceof Array) //[]---true
console.log(info['h'] instanceof Number) //NaN---false

四、总结:

1.大部分类型都可以用typeof来进行判断,但对于数组array,null和对象obejct用typeof判断并不严谨。当遇到这些时候一般判断方法如下。

let Person = function(){}
let info = {
    a:null,
    b:[],
    c:{},
    d:0,
    e:false,
    f:undefined,
    g:null,
    h:NaN,
    i:'hello',
    j:new Date(),
    k:new RegExp(),
    m:new Person ()
}
for(let key in info){
    if(info[key] instanceof Array){//判断数组,只能是数组。

    //1.用 info[key] instanceof Array
    //2.用Object.prototype.toString.call(info[key]) == '[object Array]'
    //3.Array.isArray(info[key]),返回true或false
    console.log("判断数组-------------",info[key]);

    }else if(info[key] == null||info[key] == undefined){//判断null,undefined一样。

    //1.用 info[key] == null
    //2.用Object.prototype.toString.call(info[key]) == '[object Null]'
    //undefined '[object Undefined]'

    console.log("判断null或undefined-------------",info[key]);

    }else if(info[key] instanceof Person){//判断是否是Person的实例,可排除Array,null,Object的影响

    //1.用 info[key] instanceof Person
    //2.用Object.prototype.toString.call(info[key]) == '[object Object]'
    console.log("判断是否是Person的实例-------------",info[key]);    

    }else if(info[key] instanceof Object){

    //判断对象,包括所有对象,因为所有的对象都继承了Obejct的原型。除了Object.create(null)创建的对象。
    //由于上面if中已经截断了数组的判断,所以不会走这里。
    //1.用 info[key] instanceof Object
    //2.用Object.prototype.toString.call(info[key]) == '[object Object]'

    console.log("判断是否是Object的实例-------------",info[key]);    

    }else{
    //关于判断数字,包括NaN。字符串。bool值,undefined。
    //1.可用typeof判断类型。
    //2.Object.prototype.toString.call(info[key])判断类型。
    //3.字面量定义的变量,不可用instanceof判断 。如果用new Number(value),new String(value),new Blooean(value),可用instanceof判断

    console.log("其他:",info[key]);
    }

}

结果: 1.png

2.用Object.prototype.toString.call() 或者 Object.prototype.toString.apply()一般数据类型都能够判断,最准确最常用的一种。

3.所有的类型都可以用typeof来判断,但是有时候会出现不是想要的结果,如:

  • typeof (数组):返回'object' ,而我们想要的是数组,而不是可能为{},null。

  • typeof (NaN):返回'number',而我们想要的是纯数字。因为NaN不等于NaN,即NaN===NaN为false。则可用下面方法判断:


var arr = [NaN,1,3];
for(var val of arr){
    if(val===val){//过滤NaN
        console.log(val);
    }
}
  • typeof (null):返回'object',而我们想要的是对象

  • typeof (对象):返回'object',只要是对象都返回'object',因为所有的对象都继承了Obejct的原型,除了Object.create(null)创建的对象。

评论

点赞

收藏

0/500 字数

发布

取消