js判断数据类型常用的四种方法

首先说一下js中的数据类型

基本数据类型:String、Number、Boolean、null、undefined、Symbol

引用数据类型:Object

 1.typeof

    const a1 = Symbol('a1')
    console.log(typeof '11');//string
    console.log(typeof 1);//number
    console.log(typeof true);//boolean
    console.log(typeof null);//object
    console.log(typeof undefined);//undefined
    console.log(typeof a1);//symbol
    console.log(typeof [1,2,3]);//object
    console.log(typeof {name:'11'}); //object

值得注意的是:null会被typeof检测为object

因为js数据类型在底层都是以二进制的形式表示的,二进制的前三位为0会被typeof判断为对象类型,而null的二进制位恰好都是0

2.instanceof

    const a1 = Symbol('a1')
    var f = function(params) {}
    
    var str = new String('lrn')
    console.log('11' instanceof String);//false 必须new后才为true
    console.log(str instanceof String);//true

    var num = new Number(1)
    console.log(1 instanceof Number);//false
    console.log(num instanceof Number);//true

    var boo = new Boolean(true)
    console.log(true instanceof Boolean);//false
    console.log(boo instanceof Boolean);//true

    console.log(a1 instanceof Symbol);//false(Symbol函数不能使用new命令)
    console.log([1,2,3] instanceof Array);//true
    console.log(f instanceof Function);//true 
    console.log(null instanceof Null)//Null is not defined
    console.log(undefined instanceof Undefined);//Undefined is not defined

instanceof实现原理:遍历左边变量的原型链,直到找到右边变量的prototype

instanceof只可以判断通过构造函数创建的基本数据类型(不包括null、undefined、symbol)和引用数据类型

3.Object.prototype.toString.call(适用于所有类型)

    const a1 = Symbol('a1')
    var b = new Set()
    var c = new Map()
    console.log(Object.prototype.toString.call('1',1,false));//[object String]
    console.log(Object.prototype.toString.call(1));//[object Number]
    console.log(Object.prototype.toString.call(false));//[object Boolean]
    console.log(Object.prototype.toString.call(null));//[object Null]
    console.log(Object.prototype.toString.call(undefined));//[object Undefined]
    console.log(Object.prototype.toString.call(a1));//[object Symbol]
    console.log(Object.prototype.toString.call(b));//[object Set]
    console.log(Object.prototype.toString.call(c));//[object Map]

4.constructor

    var f = function(params) {}
    const a1 = Symbol('a1')
    console.log(f.constructor);//ƒ Function()
    console.log([1,2,3].constructor);//ƒ Array()
    console.log({'name':'李四'}.constructor);//ƒ Object()
    console.log(true.constructor);//ƒ Boolean()
    console.log('1'.constructor);//ƒ String()

    console.log(123.constructor);//报错
    var num = new Number(12)
    console.log(num.constructor);//ƒ Number()
    
    console.log(a1.constructor);//ƒ Symbol() 
    console.log(null.constructor);//Cannot read properties of null
    console.log(undefined.constructor);//Cannot read properties of undefined

可见constructor无法判断null、undefined和直接赋值的数字

总结:

基本数据类型(除null)建议用typeof

引用数据类型用instanceof和constructor

Object.prototype.toString.call适用于一切类型

如有错误和建议,欢迎批评指正

               

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值