数据类型的判断

js中数据类型的判断

  • JS中有七种数据类型,七种数据类型又分为基本数据类型和引用数据类型,其中,基本数据类型存储在栈中,引用数据类型存储在堆中。
  • 基本数据类型:String、Number、Boolean、Null、Undefined、Symbol(ES6新增)。
  • 引用数据类型:Object
  • 对于基本数据类型来说,如果使用字面量的方式,那么这个变量只是个自变量,只有在必要的时候才会转换为相应的类型。

typeof

typeof对于基本数据类型来说,除了null都可显示正确类型

    console.log(typeof 1);//number
    console.log(typeof "1");//string
    console.log(typeof true);//boolean
    console.log(typeof undefined);//undefined
    console.log(typeof Symbol());//symbol
    console.log(typeof null);//object

对于typeof null结果为object,是因为在JS的最初版本中,使用的是32位系统能够,为了性能考虑使用低位存储了变量的信息,000开头代表是对象,然而null表示为全零,所以将它错误的判断为object。虽然现在内部类型判断码已经改变了,但是对于这个Bug却是一直流传下来。

typeof对于对象,除了函数都会显示object,因此typeof并不能准确判断变量到底是什么类型

    console.log(typeof []);//object
    console.log(typeof {});//object
    console.log(typeof console.log);//function

instanceof

若想正确判断一个对象的正确类型,可以使用instanceof

    console.log([] instanceof Array);//true
    console.log({} instanceof Object);//true
    console.log(console.log instanceof Function);//true

instanceof操作符是用来检测对象的原型链是否指向构造函数的prototype对象,因此可以用来检验对象的正确类型,也正因如此,instanceof不可用来检测基本数据类型

function A() {}
let a=new A;
console.log(a instanceof A);//true
//修改a的__proto__指向后,a instanceof A结果变为false
a.__proto__={};
console.log(a instanceof A);//false

constructor

在每个对象的__proto__中都有一个constructor属性,指向创建该对象的构造函数,因此,也可以使用constructor来判断一个对象的类型。

    console.log([].constructor=== Array);//true
    console.log({}.constructor===Object);//true
    console.log(console.log .constructor===Function);//true

完美方法:Object.prototype.toString.call(xx)

    //判断数值型
    console.log(Object.prototype.toString.call(1));// [object Number]
    //判断字符串
    console.log(Object.prototype.toString.call("1"));//[object String]
    //判断布尔值
    console.log(Object.prototype.toString.call(true));//[object Boolean]
    //判断undefined
    console.log(Object.prototype.toString.call(undefined));//[object Undefined]
    //判断Null
    console.log(Object.prototype.toString.call(null));//[object Null]
    //判断symbol
    console.log(Object.prototype.toString.call(Symbol()));//[object Symbol]
    //判断函数
    console.log(Object.prototype.toString.call(console.log));//[object Function]
    //判断数组
    console.log(Object.prototype.toString.call([]));//[object Array]
    //判断对象
    console.log(Object.prototype.toString.call({}));//[object Object]
    //判断日期类型
    console.log(Object.prototype.toString.call(new Date()));//[object Date]
    //判断正则表达式
    console.log(Object.prototype.toString.call(/123/));//[object RegExp]
    //判断自定义类型
    function Person(){}
    let person=new Person()
    console.log(Object.prototype.toString.call(person));//[object Object]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值