JavaScript中对象类型判断的几种方法

JavaScript中检测对象类型的运算符有:typeof、instanceof,还有对象的constructor属性

1. typeof 运算符

    typeof是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number""string""boolean""object""function""undefined"(可用于判断变量是否存在)。但 typeof 的能力有限,其对于DateRegExp类型返回的都是"object"。如:

    typeof {}; // "object"  
    typeof []; // "object"  
    typeof new Date();// "object" 

   所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof 运算符或对象的constructor 属性。

2. instanceof 运算符

    instanceof 运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object 是 class 或构造函数的实例,则instanceof 运算符返回 true。如果 object 不是指定类或函数的实例,或者 object 为 null,则返回false。如: 

    [] instanceof Array; // true  
    [] instanceof Object; // true  
    [] instanceof RegExp; // false  
    new Date instanceof Date; // true 

    所以,可以用instanceof运算符来判断对象是否为数组类型: 

    function isArray(arr)  {
        return arr instanceof Array;  
    }

3. constructor 属性。

    JavaScript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,常用于判断未知对象的类型。如给定一个求知的值通过typeof运算符来判断它是原始的值还是对象。如果是对象,就可以使用constructor属性来判断其类型。所以判断数组的函数也可以这样写: 

    function isArray(arr){ 
        return typeof arr == "object" && arr.constructor == Array; 
    } 

    很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。例如: 

    <script> 
        window.onload=function(){ 
            var iframe_arr=new window.frames[0].Array; 
            alert(iframe_arr instanceof Array); // false 
            alert(iframe_arr.constructor == Array); // false 
        } 
    </script> 

    <body> 
        <iframe></iframe> 
    </body> 

但是当遇到框架时,以上方法还是不精确,所以最好采用以下最精确的办法:

3. 跨原型链调用toString()方法:Object.prototype.toString()

当Object.prototype.toString(o)执行后,会执行以下步骤: 
1)获取对象o的class属性。 
2)连接字符串:"[object "+结果(1)+"]" 
3)返回 结果(2) 

例如: 

Object.prototype.toString.call([]); // 返回 "[object Array]" 
Object.prototype.toString.call(/reg/ig); // 返回 "[object RegExp]" 

**jQuery中采用的就是这种方法**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值