js 数据类型的判断

基本数据类型:Undefined、Null、Boolean、String、Number、Symbol、Bigint  

引用数据类型:Object ,如果细分的话有(object,Array,function,Date,RegExp ...)

  • typeof

           使用typeof方法可以判断基本数据类型(除了Null),但是对引用数据类型(除了function)返回的都是object

           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]

 

          

 

上一篇:SQLServer 开启cmd命令


下一篇:1131_使用clang-format进行代码格式排版