判断数据类型的方法

1: typeof

平时我们需要判断数据类型的时候,可能第一个想到的方法就是typeof,但是,我们都知道,是有点小缺陷的

typeof null返回类型错误,返回object

引用类型,除了function返回function类型外,其他均返回object

在这里插入图片描述

其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果。

2:toString 应该是最完美的

const isType = (typing) => value => {
      return Object.prototype.toString.call(value) === `[object ${typing}]`
}

let utils = {}

const arr = ['String', 'Number', 'Null', 'Undefined', 'Function', 'Boolean','Symbol']
	arr.forEach(typing => {
         utils['is' + typing] = isType(typing)
    })

        console.log(utils.isBoolean(true))
        console.log(utils.isString('string'))
        console.log(utils.isNumber(12345))
        console.log(utils.isNull(null))
        console.log(utils.isUndefined(undefined))
        console.log(utils.isFunction(function Foo() { }))
        console.log(utils.isSymbol(Symbol()))

toString()Object 的原型方法,调用这个方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型(注意首字母是大写的)。

对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

以上方法就是通过toString()方法来判断是不是指定的那些数据类型,是的话,返回true,否则返回false

3:constructor

constructor是原型prototype的一个属性,当函数被定义时候,js引擎会为函数添加原型prototype,并且这个prototypeconstructor属性指向函数引用, 因此重写prototype会丢失原来的constructor

不过这种方法有问题:

1:null 和 undefined 无constructor属性,这种方法判断不了。

2:还有,如果自定义对象,开发者重写prototype之后,原有的constructor会丢失,因此,为了规范开发,在重写对象原型时一般都需要重新给 constructor 赋值,以保证对象实例的类型不被篡改。

4:instanceof

instanceof是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 注意的是:instanceof 检测的是原型

在这里插入图片描述

看上面的图片中可以看出,
[]的原型指向Array.prototype,间接指向Object.prototype, 因此[] instanceof Array返回true[] instanceof Object也返回true

instanceof只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值