js中数据类型的判断
- JS中有七种数据类型,七种数据类型又分为基本数据类型和引用数据类型,其中,基本数据类型存储在栈中,引用数据类型存储在堆中。
- 基本数据类型:String、Number、Boolean、Null、Undefined、Symbol(ES6新增)。
- 引用数据类型:Object
- 对于基本数据类型来说,如果使用字面量的方式,那么这个变量只是个自变量,只有在必要的时候才会转换为相应的类型。
typeof
typeof对于基本数据类型来说,除了null都可显示正确类型
console.log(typeof 1);//number
console.log(typeof "1");//string
console.log(typeof true);//boolean
console.log(typeof undefined);//undefined
console.log(typeof Symbol());//symbol
console.log(typeof null);//object
对于typeof null结果为object,是因为在JS的最初版本中,使用的是32位系统能够,为了性能考虑使用低位存储了变量的信息,000开头代表是对象,然而null表示为全零,所以将它错误的判断为object。虽然现在内部类型判断码已经改变了,但是对于这个Bug却是一直流传下来。
typeof对于对象,除了函数都会显示object,因此typeof并不能准确判断变量到底是什么类型
console.log(typeof []);//object
console.log(typeof {});//object
console.log(typeof console.log);//function
instanceof
若想正确判断一个对象的正确类型,可以使用instanceof
console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(console.log instanceof Function);//true
instanceof操作符是用来检测对象的原型链是否指向构造函数的prototype对象,因此可以用来检验对象的正确类型,也正因如此,instanceof不可用来检测基本数据类型
function A() {}
let a=new A;
console.log(a instanceof A);//true
//修改a的__proto__指向后,a instanceof A结果变为false
a.__proto__={};
console.log(a instanceof A);//false
constructor
在每个对象的__proto__中都有一个constructor属性,指向创建该对象的构造函数,因此,也可以使用constructor来判断一个对象的类型。
console.log([].constructor=== Array);//true
console.log({}.constructor===Object);//true
console.log(console.log .constructor===Function);//true
完美方法:Object.prototype.toString.call(xx)
//判断数值型
console.log(Object.prototype.toString.call(1));// [object Number]
//判断字符串
console.log(Object.prototype.toString.call("1"));//[object String]
//判断布尔值
console.log(Object.prototype.toString.call(true));//[object Boolean]
//判断undefined
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
//判断Null
console.log(Object.prototype.toString.call(null));//[object Null]
//判断symbol
console.log(Object.prototype.toString.call(Symbol()));//[object Symbol]
//判断函数
console.log(Object.prototype.toString.call(console.log));//[object Function]
//判断数组
console.log(Object.prototype.toString.call([]));//[object Array]
//判断对象
console.log(Object.prototype.toString.call({}));//[object Object]
//判断日期类型
console.log(Object.prototype.toString.call(new Date()));//[object Date]
//判断正则表达式
console.log(Object.prototype.toString.call(/123/));//[object RegExp]
//判断自定义类型
function Person(){}
let person=new Person()
console.log(Object.prototype.toString.call(person));//[object Object]