类型检测


          内置对象就是JS本事保留的一些对象,像object,array,data,reg,string等这些就是内置的对象(跟保留变量的意思差不对)就是不用你定义,自然而然就在JS里定义好的对象,你拿过来就能用的就是JS的内置对象。
          静态对象就是全局对象,可以在整个JS里调用的公共对象。有点类似于全局变量
          动态对象就是普通的对象了,可以理解为局部对象,只能在某个范围内使用的就是动态对象

      1.   typeof ,是一个运算符,运算中需要一个操作数, 运算的结果就是这个操作数的类型,运算的结果是一个字符串。 他有一定的局限性,对于对象类型的值,只能得到一个”object”结果,却不能精确得到此值的精确类型。
示例:array  json  null  date  reg  error  全部检测成object类型 ;

     2.  instanceof ,ECMA引入了一个java运算符instanceof,也是一个运算符,运算中需要两个操作数, 运算的结果是true或false,表示此值是不是某一个类的示例,能得到一个值的具体类型。检测不到number string bool的类型
示例:function User(){}  var u=newUser;  console.log( u instanceof User );//true

     3.  constructor 本来是原型对象上的属性,指向对象的构造函数 。不过使用constructor也不是很保险的,因为constructor属性是可以被修改的,会导致检测结果不正确。
示例:对于变量num  num.constructor可以指向num的构造函数  所以可以使用  num.constructor == Number来判断num是不是Number类型的。
function User(){}  var u=newUser;  console.log( u.constructor===User);//得到true

      java内置的类型检测机制并非完全可靠。事实上,发生错误否定及错误肯定的情况也不在少数。 比如说typeof操作符,由于它有一些 无法预知的行为,经常导致检测数据类型式得到不靠谱的结果。  再比如,i nstanceof操作符在存在多个全局作用域(像一个页面包含多个frame)的情况下,也是问题多多。
       在检测某个对象到底是原生对象还是开发人员自定义的对象的时候,也会出现问题。出现这个问题的原因是浏览器开始原生支持JSON对象了。因为很多人一直在使用JSON库,而该库定义了一个全局JSON对象。于是开发人员很难确定页面中的JSON对象到底是不是原生。

       4.   解决上述问题的办法都一样,在任何值上调用object原生的toString()方法(用tostring方法进行类型判断),都会返回一个[object 类型名]格式的字符串。 每个类在内部都有一个[[Class]]属性,这个属性中就指定了上述字符串中的构造函数名。
   alert(object.prototype.toString.call(value));         //[object  Array]
由于原生数组的构造函数名与全局作用域无关,因此使用toString()就能保证返回一致的值。
    function isArray(value){
                    return object.prototype.toString.call(value) == [object  Array] 
}
同理,也可以基于之一思想来测试某个值是不是原生函数或正则表达式:
function isFunction(value){
                    return object.prototype.toString.call(value) == [object  Function
}
function isRegExp(value){
                    return object.prototype.toString.call(value) == [object  RegExp
}

5.jquery中$.type的实现
结果就是上一种方法输出的结果的第二个参数
原理:其实jquery就是用 object.prototype.toString.call实现的,把用 object.prototype.toString.call输出结果的字符串数组里面的两个值转换成一个结果类型并返回,若class2type()存储的没有这个变量的类型,那就返回“object”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值