方法一:typeof
使用typeof
运算符可以检测基本类型及 function
,遇到数组或null无法准确识别
typeof (123); // number
typeof ("abc"); // string
typeof (true); // boolean
typeof (function(){}) // function
typeof (new Date()) // object
typeof ([]) // object
typeof (null) // object
方法二:instanceof
使用 instanceof
运算符通过检测对象的原型判断当前对象是否是指定对象的实例,从而达到检测类型的效果。而在JavaScript
中基本数据类型并不是对象,或者说是一个 包装对象
,无法通过原型获取信息因此使用instanceof
运算符不能判断基本数据类型。
[] instanceof Array; // true
[] instanceof Object; // true
{name: 10} instanceof Object; // true
({}) instanceof Object; // true
/* 注意:左侧表达式是一个花括号对象时需要在外层添加括号,否则会报错 */
123 instanceof Number; // false
123 instanceof Object; // false
"string" instanceof Number; // false
"string" instanceof Object; // false
let n = new Number(1);
n instanceof Number; // true 变量n是通过对象Number实例出来的,实际类型是一个对象,所以属于Number
Object.prototype.toString
使用Object.prototype.toString
方法将变量的原型通过call
或apply
绑定并转换成字符串来获取变量的类型
Object.prototype.toString.apply(""); // [object String]
Object.prototype.toString.call(""); // [object String]
Object.prototype.toString.call(function(){}); // [object Function]
Object.prototype.toString.call(123); // [object Number]
functino Per(){
}
let p = new Per();
Object.prototype.toString.call(p); // [object object]
constructor
通过使用变量构造器的引用来获取识别变量的数据类型
(123).constructor == Number // true
(123).constructor == Ojbect // false
({}).constructor == Object // true
"123".constructor == String // true
"".constructor == Object // false
[].constructor == Array // true
[].constructor == Object // false
总结
typeof
运算符可以用来检测基本的数据类型,在检测对象或 null
时不能获取正确的值;
instanceof
运算符与typeof
运算符相反,在检测基本数据类型、 null
或 undefined
时不能获取正确变量类型,能正确识别内置对象及自定义对象的实例;
Object.prototype.toString
方法可以正常获取基本类型及内置对象的实例的类型,但当对象为自定义构造函数实例时,不能正确识别到构造函数,如上面Object.prototype.toString
方法中最后的案例。
constructor
构造器可以识别拥有构造器属性的变量,但对于没有构造器属性的变量如null
或undefined
使用则会报错