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

        

目录

一、typeof操作符

二、instanceof

三、constructor

四、toString


        我们在操作数据的过程中可能要对数据类型进行判断,那么常见的几种判断方法有几种呢,下面我就给大家分享一下

一、typeof操作符

        typeof操作符可以判断除了null以外的基础数据类型,对于数组,对象等引用类型就无法判断了 (函数类型可以判断)

typeof "a"   //string 可以判断字符串类型
typeof undefined    //undefined 可以判断未定义类型
typeof 1    //number   可以判断数字类型
typeof true //boolean  可以判断布尔类型
typeof Symbol(); // symbol 可以判断symbol类型
typeof new Function(); // function 可以判断函数类型
typeof null  //object  无法判断null类型
typeof {}    //object  无法判断对象类型
typeof []    //object  无法判断数组类型

二、instanceof

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

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

        虽然 instanceof 能够判断出 [ ] 是Array的实例,但它认为 [ ] 也是Object的实例,为什么呢?

     从 instanceof 能够判断出 [ ].__proto__ 指向 Array.prototype,而 Array.prototype.__proto__ 又指向了Object.prototype,最终 Object.prototype.__proto__ 指向了null,标志着原型链的结束。因此,[ ]、Array、Object 就在内部形成了一条原型链。

        弊端:instanceof虽然可以判断数组类型,但是仅限于只有一个全局执行上下文,如果网页里有多个框架(例如使用iframe),则可能涉及两 个不同的全局执行上下文,因此就会有两个不同版本的 Array 构造函数。如果要把数组从一个框架传 给另一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组,此时instanceof判断结果为false可以用Array.isArray()来判断比较准确

三、constructor

     当一个函数 F被定义时,JS引擎会为F添加 prototype 原型,然后再在 prototype上添加一个 constructor 属性,并让其指向 F 的引用,所以我们可以用constructor来进行判断类型,如下所示

"a".constructor === String  // true
new Number(1).constructor === Number   //true
true.constructor === Boolean // true
new Function().constructor === Function   //true
new Date().constructor === Date   //true
Symbol(0).constructor === Symbol   //true
new Error().constructor === Error   //true
[].constructor === Array   //true
new Object().constructor === Object  //true

总结:

 1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。

  2. 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object。

四、toString

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

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

Object.prototype.toString.call('') ;   // [object String]

Object.prototype.toString.call(1) ;    // [object Number]

Object.prototype.toString.call(true) ; // [object Boolean]

Object.prototype.toString.call(Symbol()); //[object Symbol]

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 global] window 是全局对象 global 的引用

        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值