六种数据类型:
number、string、boolean、undefined、null、object
ES6:symbol 独一无二的值
ES10:bigint
四种方式:
//typeof()
console.log( typeof(a) );//返回表示数据类型的字符串
//instanceof操作符
console.log( a instanceof number ); // 返回true或false
//constructor
console.log( a.__proto__.constructor == Student.prototype.constructor );
//Object.prototype.toString.call()
console.log.( Object.prototype.toString.call(a) );
每种方式都有缺陷:
topeof():只能判断基本数据类型,判断引用数据类型只能返回Object;
instanceof 和 constructor :不能很好的解决内置数据类型的判断,instanceof对null和underfined不起作用,constructor对array无法很好的判断
Object.prototype.toString.call()主要用于判断内置数据类型
如果想要完美的判断数据类型需要多种方式配合使用
方式一:typeof
typeof 可以用来判断基础数据类型,但无法判断引用数据类型(array、object)
//用法 :typeof 要判断的数据 或 typeof(要判断的数据)
//例:
console.log(typeof "");//string
console.log(typeof 1);//number
console.log(typeof true);//boolean
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof []);//object
console.log(typeof function(){});//function
console.log(typeof {});//object
//返回结果为表示数据类型的字符串
方式二:instanceof
判断new关键字创建的引用数据类型不包括null和underfined
//用法: console.log( 要判断的数据 instanceof 数据类型) 例:
console.log("1" instanceof String);//false
console.log(new String(1) instanceof String);//true
console.log(1 instanceof Number);//false
console.log(new Number(1) instanceof Number);//true
console.log(true instanceof Boolean);//false
console.log(new boolean(false) instanceof boolean);//true
console.log([] instanceof Array);//true
console.log(function(){} instanceof Function);//true
console.log({} instanceof Object);//true
方式三:constructor
constructor 基本上可以应对基本数据类型和引用数据类型的判断,但如果声明了一个构造函数,并且把它的原型指向了Array,constructor也显得力不从心
//用法: console.log( (要判断的数据).constructor === 数据类型 ) 例:
console.log( ("1").constructor === String );//true
console.log( (1).constructor === Number );//true
console.log( (true).constructor === Boolean );//true
console.log( ([]).constructor === Array );//true
console.log( (function(){}).constructor === Function );//true
console.log( ({}).constructor === Object );//true
//声明了一个构造函数,并且把它的原型指向了Array,constructor也显得力不从心
function Fn(){}
Fn.prorotype=new Array();
var f=new Fn();
console.log( f.constructor === Fn );//false
console.log( f.constructor === Array );//true
方式四:Object.prototype.toString.call() (推荐)
判断数据类型的一种完美解决方案
//用法及演示:
var a = Object.prototype.toString;
console.log( a.call("aaa") );//[object String]
console.log( a.call(1) );//[object Number]
console.log( a.call(true);//[object Boolean]
console.log( a.call(null) );//[object Null]
console.log( a.call(underfined) );//[object Underdined]
console.log( a.call([]) );//[object Array]
console.log( a.call(function(){}) );//[object Function]
console.log( a.call([]) );//[object Object]
//声明了一个构造函数,并且把它的原型指向了Array
function Fn(){};
Fn.prototype=new Array();
console.log( Object.prototype.toString.call(Fn) );//[object Function]