js数据类型分类及判断

分类

ECMAScript 规范中,共定义了 9 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示:

值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(ES6新增) BigInt(ES2020新增)。
引用数据类型:对象(Object)、函数(Function)。

注:在web文档中将函数(Function)归为一类引用类型,Object的子对象(如:数组[Array]、时间对象[Date]等)归类于对象(Object)
注:Number 指-253到253之间的数,超过这个范围,无法精确表示这个整数(丢失精度)。NaN
注:BigInt 可以表示任意大的整数,可以用在一个整数字面量后面加n 的方式定义一个BigInt, 当一个数大于Number的范围时可用BigInt 表示
注:NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字,NaN 与所有值都不相等,包括它自己。

    console.log(typeof NaN);   // 输出 number
    console.log(NaN == NaN);   // 输出 false

判断

使用typeof判断基本类型数据

typeof返回一个表示数据类型的字符串,返回结果包括:number、string、boolean、object、undefined、function 、symbol 、bigint。typeof可以对基本类型number、string 、boolean、undefined、symbol 、bigint做出准确的判断(null除外),而对于引用类型,除了function之外返回的都是object。但当我们需要知道某个对象的具体类型时,typeof就显得有些力不从心了。

    console.log(typeof undefined);   // 输出 undefined
    console.log(typeof null);  // 输出 object
    console.log(typeof false); // 输出 boolean
    console.log(typeof ''); // 输出 string
    console.log(typeof 1); // 输出 number
    console.log(typeof 1n)  //输出 bigint
    console.log(typeof Symbol('1')) //输出 symbol
    console.log(typeof  function () {}); // 输出 function
    console.log(typeof {})   //输出 object
    console.log(typeof new Date())   //输出 object   无法输出具体对象类型Date    
    console.log(typeof new RegExp())   //输出 object  无法输出具体对象类型RegExp  
使用instanceof确定数据的具体类型

当我们认为一个对象可能是某个具体类型时,当又无法确定时可以使用运算符 instanceof,instanceof操作符判断左操作数对象的原型链上是否有右边这个构造函数的prototype属性,也就是说指定对象是否是某个构造函数的实例,最后返回布尔值。

[] instanceof Array; //true
[] instanceof Object; //true
new Date() instanceof Date;//true
new Date() instanceof Object;//true
function Person(){};
new Person() instanceof Person;//true
new Person() instanceof Object;//true

我们发现,虽然 instanceof 能够判断出 [] 是Array的实例,但它认为 [] 也是Object的实例,为什么呢? 我们来分析一下[]、Array、Object 三者之间的关系: 从instanceof 能够判断出 [].proto 指向 Array.prototype, 而 Array.prototype.proto 又指向了Object.prototype,Object.prototype.proto 指向了null,标志着原型链的结束。因此,[]、Array、Object就形成了如下图所示的一条原型链:

image.png

从原型链可以看出,[] 的 proto 直接指向Array.prototype, 间接指向Object.prototype, 所以按照 instanceof 的判断规则,[] 就是Object的实例。

注意:instanceof运算符只能用于对象,不适用原始类型的值。
使用Object.prototype.toString判断具体类型

toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是 toString运行时this指向的对象类型, 返回的类型格式为[object,xxx],xxx是具体的数据类型,其中包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有对象的类型都可以通过这个方法获取到。

Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object Window]

相关资料

JavaScript 数据类型和数据结构
typeof
instanceof
JS数据类型分类和判断

你可能感兴趣的:(js数据类型分类及判断)