JavaScript的类型检测

JavaScript检测类型的方法:typeof,instanceof运算符,对象的constructor属性,跨原型链调用toString()方法。
     1.typeof方法
          可判断“string”,“number”,“object”,“function”,“boolean”,“undefined”(可用于判断变量是否存在),可是其能力有限的,对于于数组,日期,正则类型只能返回object。 
    2.instanceof运算符
           其要求左边的左边的运算数是一个对象,右边的运算数是是对象类的名字或是构造函数 。如果左边对象是其对象类或是构造函数的实例,则返回true,若不是,则返回false。
 
[ ]  instanceof  Array ;  // true
new  date  instanceof  Date ;  //true
[ ]  instanceof  RegExp ; //false
 
    3.对象的constructor属性
          每一个对象都有一个construtor属性,这个属性引用了初始化该类型的构造函数,常用于判断位置对象的类型(前提是该类型需是对象),用typeog方法判断该类型是否是对象,然后利用constructor方法。
 
//  
founction  isArray ( arr ) {
     return  typeof  arr == "object" &&  arr . constructor  ==  Array ;
}
 
    通常可以用第二个和第三个方法检测数组对象类型,但是在检测跨框架(cross-frame)的页面中的数组时,会失败。原因就是在不同框架中创建的数组不会共享prototype属性,随后新出现了一种准确的检测方法:Object.prototype.Tostring()可以解决上面的跨框架问题。
 
// 
function  isArray ( arr ) {
     return  Object . protoytpe . toString . call ( arr )  ===  "[object Array]" ;
}
     
 

编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:

1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。

2. 数组的长度一致。

3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.

 
// 
function  arraysSimilar ( arr1 arr2 ) {
     // 
            if ( ! ( arr1  instanceof  Array )  ||  ! ( arr2  instanceof  Array )) {
                 return  false ;
            }
         //   
            if ( arr1 . length != arr2 . length ) {
                 return  false ;    
            }
         //   
            function  type_element ( ele ) {
                 if ( ele === null ) {
                      return  "null" ;
                 }
                 else  if ( ele === window ) {
                      return  "window" ;
                 }
                 else  if ( ele  instanceof  Date ) {
                      return  "Date" ;
                 }
                 else  if ( ele  instanceof  Array ) {
                      return  "Array" ;
                 }
                 else  return  typeof ( ele ) ;
            }
            var  e_arr1 = [ ] ;
            var  e_arr2 = [ ] ;
            for ( var  i = 0 ; i < arr1 . length ; i ++ ) {
                 e_arr1 . push ( type_element ( arr1 [ i ])) ;
                 e_arr2 . push ( type_element ( arr2 [ i ])) ;
            }
            var  a1 = e_arr1 . sort ( ) ;
            var  a2 = e_arr2 . sort ( ) ;
            for ( var  i = 0 ; i < arr1 . length ; i ++ ) {
                 if  ( a1 [ i ] != a2 [ i ]) {
                      return  false ;
                 }
            }
            return  true ;
         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值