美文网首页
js数据类型分类及判断

js数据类型分类及判断

作者: 谢_ffd1 | 来源:发表于2021-03-23 10:44 被阅读0次

    分类

    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数据类型分类及判断

          本文链接:https://www.haomeiwen.com/subject/udstwqtx.html