前言:
众所周知,js数据类型有基础数据类型和引用数据类型
-
基础数据类型
string,number,boolean,null,undefined symbol(es6新增,表示独一无二的值),Bigint(es10新增)(BigInt数据类型提供了一种方法来表示大于2^53-1的整数) -
引用数据类型
object ,function , array
检测的方法有 typeof, instanceof , Object.prototype.toString.call()
typeof 3 //"number"
typeof '2' //'string'
typeof true//’boolean'
typeof undefined//'undefined'
typeof function (){} //'function'
typeof [] //'object'
typeof {} //'object'
//对null判断结果是object,这也是typeof不足之处
instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型
console.log(2 instanceof Number) //false
console.log("hello" instanceof String) //false
console.log([] instanceof Array) //true
var aa=function(){}
console.log( aa instanceof Function)//true
var ss={}
console.log(ss instanceof Object) //true
constructor (constructor 属性返回数组的构造函数)虽然都可以判断基础类型和引用类型,但是里面有个坑,就是创建一个对象,更改它的原型,constructor就变得不可靠了
function Fn(){};
Fn.prototype=new Array();
var f=new Fn();
console.log(f.constructor===Fn); // false
console.log(f.constructor===Array); // true
Object.prototype.toString.call()都可以检测,比较全面
Object.prototype.toString.call(1)//[object Number]
Object.prototype.toString.call("1")//[object String]
Object.prototype.toString.call(ture)//[object Boolean]
Object.prototype.toString.call(null)//[object Null]
Object.prototype.toString.call(undefined)//[object Undefined]
Object.prototype.toString.call(/123/g) //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call(function(){})//[object Function]