js数据类型判断
js的数据类型主要分为值类型和引用数据类型。值类型有number,string,boolean和undefined 引用类型是:Array,Object,Function和null。接下来我们用几种js方法来判断这些数据类型。
我们先来定义几个变量。
var num = 100;
var str = "string";
var bool = true;
var un = undefined;
var nu = null;
var arr = ["tom","jerry"];
var obj = {
kind:"dog",
yell:"wang"
};
var fn = function(){
console.log("I'm a function");
}
1.用typeof来判断
console.log(typeof num); //number
console.log(typeof str); //string
console.log(typeof bool); //boolean
console.log(typeof un); //undefined
console.log(typeof nu); //object
console.log(typeof arr); //object
console.log(typeof obj); //object
console.log(typeof fn); //function
可以看出来值类型的数据可以用typeof来判断,引用类型的function类型也可以用typeofp来判断。但是引用类型的数据null,Array,Object返回的都是object。所以就需要第二种方法–>instanceof。
2.在引用数据类型的基础上我们用instanceof来判断
console.log(arr instanceof Array); //true
console.log(obj instanceof Object); //true
console.log(fn instanceof Function); //true
我们需要注意值类型的数据和null不能用instanceof来判断,不止会判断不准确甚至还会程序报错。错误代码如下:
console.log(num instanceof Number); //false
console.log(str instanceof String); //false
console.log(bool instanceof Boolean); //false
console.log(un instanceof undefined); //Uncaught TypeError: Right-hand side of 'instanceof' is not an object
console.log(nu instanceof null); //Uncaught TypeError: Right-hand side of 'instanceof' is not an object
用typeof来判断值类型数据用instanceof来判断引用类型数据,难道就没有一种方法既能判断值类型又能判断引用类型吗?有,那就是constructor方法。
3.数据类型用constructor来判断
console.log(num.constructor === Number); //true
console.log(str.constructor === String); //true
console.log(bool.constructor === Boolean); //true
console.log(arr.constructor === Array); //true
console.log(obj.constructor === Object); //true
console.log(fn.constructor === Function); //true
我们需要注意的是null,undefined用constructor会报错。
console.log(nu.constructor === null); //Uncaught TypeError: Cannot read property 'constructor' of null
console.log(un.constructor === undefined); //Uncaught TypeError: Cannot read property 'constructor' of null
好不容易找到一个既能判断值类型又能判断引用类型的函数,但是又不能用于null和undefined。难道没有更好的函数吗?有,那就是我们的第四个函数Object.prototype.toString.call();
4.更好用的数据类型判断函数 Object.prototype.toString.call()。
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(nu) === '[object Null]'); //true
console.log(Object.prototype.toString.call(un) === '[object Undefined]');//true
console.log(Object.prototype.toString.call(num) === '[object Number]');//true
console.log(Object.prototype.toString.call(str) === '[object String]');//true
console.log(Object.prototype.toString.call(bool) === '[object Boolean]');//true
console.log(Object.prototype.toString.call(arr) === '[object Array]');//true
console.log(Object.prototype.toString.call(obj) === '[object Object]');//true
console.log(Object.prototype.toString.call(fn) === '[object Function]');//true
上面的四个方法就能判断数据类型了,需要我们注意的是instanceof,constructor, Object.prototype.toString.call()。还可用于判断其他是数据类型例如:
var date = new Date();
var reg = /^a+b+$/;
console.log(date instanceof Date); //true
console.log(reg instanceof RegExp); //true
console.log(date.constructor === Date); //true
console.log(reg.constructor === RegExp); //true
console.log(Object.prototype.toString.call(date)); //[object Date]
console.log(Object.prototype.toString.call(reg)); //[object RegExp]