基本数据类型:Undefined、Null、Boolean、String、Number、Symbol、Bigint
引用数据类型:Object ,如果细分的话有(object,Array,function,Date,RegExp ...)
-
typeof
typeof null 返回object ,这是js早期遗留下来的bug,因为任何对象都会被转化为二进制存储,js中二进制前三位为0的话会被判断为object类型,而null转为二进制都是0,导致判断结果出错
1 typeof '1' // string 2 typeof 1 // number 3 typeof null // object 4 typeof undefined // undefined 5 typeof true // boolean 6 typeof Symbol('1') // symbol 7 typeof 5n // bigint 8 typeof [ ] // object 9 typeof { } // object 10 typeof new Function() // function 11 typeof new Date() // object 12 typeof new RegExp() // object
注意:使用typeof方法返回的结果是小写字符串形式的数据类型
-
instanceof
可以准确的判断引用数据类型,但是不能正确判断基本数据类型,instanceof实际上是用来测试一个对象在原型链中是否存在一个构造函数等prototype属性的
1 [] instanceof Array // true 2 3 {} instanceof Object // true 4 5 new Date() instanceof Date // true 6 7 new Function() instanceof Function // true 8 9 10 1 instanceof Number // false 11 12 13 '1' instanceof String // false 14 15 true instanceof Boolean // false 16 17 null instanceof Object // false 18 19 20 21 function Person() { } 22 23 const person = new Person() 24 25 console.log( person instanceof Person ) // true 26 27 console.log( person instanceof Object ) // true
-
constructor
查看对应的构造函数,constructor是prototype对象上的属性,指向构造函数,constructor除了null和undefined无法判断(因为他们不是由对象构建),其他的数据类型都可以判断
1 "1".constructor===String // true 2 3 [].constructor===Array // true 4 5 true.constructor===Boolean // true
注意:使用Object.create()创建的js对象,没有constructor
constructor属性是可以被修改的,会导致检测出的结果不正确
-
Object.prototype.toString(推荐使用)
Object.prototype.toString.call()是通用于所有的数据类型,返回的是构造函数的类型,
因为实例对象有可能会自定义toString方法,会覆盖Object.prototype.toString,所以在使用时,最好加上call
1 Object.prototype.toString.call('1') // [object String] 2 3 Object.prototype.toString.call(1) // [object Number] 4 5 Object.prototype.toString.call(true) // [object Boolean] 6 7 Object.prototype.toString.call(undefined) // [object Undefined] 8 9 Object.prototype.toString.call(null) // [object Null] 10 11 Object.prototype.toString.call([1,2,3]) // [object Array] 12 13 Object.prototype.toString.call(new Function()) // [object Function] 14 15 Object.prototype.toString.call(new Date()) // [object Date] 16 17 Object.prototype.toString.call(new RegExp()) // [object RegExp] 18 19 Object.prototype.toString.call(new Error()) // [object Error]