咨询电话:024-31891684

网站建设|注册|登录 | 易势大连分公司

沈阳网站制作易势最专业!

 

网站制作技术之javascript篇当前位置:首页>主要服务>网站制作>JS/Jquery

网站制作技术之javascript篇

   -----JavaScript 类型检测方法

 

  在JavaScript中要检测一个变量是不是基本类型?typeof操作符是最佳的工具。更具体的说,typeof是确定一个变量是字符串、数值、布尔值、还是undefined的最佳工具。如果变量的值是一个对象或null,则typeof操作会像下面例子中所示的那样返回“object”。

 

var s = "w3ctech";

var b = true;

var i = 22;

var u;

var n = null;

var o = new Object();

alert(typeof s); //string

alert(typeof i); //number

alert(typeof b); //boolean

alert(typeof u); //undefined

alert(typeof n); //object

alert(typeof o); 

 

    虽然在检测基本数据类型时typeof是非常得力的助手,但是在检测引用类型的值时, 这个操作符的用处不大。通常,我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,ECMAScript提供了instanceof操作符,其语法如下:

 

result = variable instanceof constructor

 

    如果变量是给定引用类型(由构造函数表示)的实例,那么instanceof操作符就会返回true。请看下面的例子:

 

alert(person instanceof Object); //变量person 是 Object吗?

alert(colors instanceof Array); //变量colors 是 Array吗?

alert(pattern instanceof RegExp); //变量pattern 是 RegExp吗?

 

    根据规定,所有引用类型的值都是Object的实例。因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true。当然如果使用instanceof操作符检测基本类型的值,则始终会返回false。因此基本类型不是对象。
    注意:使用typeof操作符检测函数时,该操作符会返回“function”。在Safari和Chrome中使用typeof检测正则表达式时,这个操作符会错误地也返回“function”。
safari 和 chrome中,这个bug产生的原因是, 正则对象实现了调用接口,即内部的[[Call]]方法. 譬如/\d/('123');早期的firefox也存在这个bug.后来被修复了.safari,chrome的 typeof运算符调用的内部方法的逻辑,就是简单的看这个对象是不是实现了[[Call]]接口.实现了,就认为是一个函数对象. 其实对于safari,还有一些host object.也存在此类问题.譬如某些和DOM相关的东西.就不一一列举了.
    补充:instanceof 运算符的本意不是类型检查,而是检测.instanceof 左边的运算元,是否是右边运算元的一个实例.所以变相的提供了一种类型检查的能力.但这个是不可靠的. 比如 arr instanceof Array. 如果 arr是其他窗体内创建的数组.这个检测就会失败. 因为它是另外窗体的Global.Array的实例.而不是当前窗体的.
还有一种极端情况:

var arr = [];

arr.__proto__ = {};

arr instanceof Array;//false

 

    所以才有借助ECMAScript object内部属性[[Class]]的需求.即{}.toString.call(arr)的出现.那么还有没有其他办法呢? 答案是yes. 参考下面的代码:

 

var arr =[];

arr.constructor && arr.constructor == Array.toString();// true.

 

    原理是通过比较对象构造器的字符串表示.当然,严格来说.这些信息都是可以后期伪造或更改的. 所以还是{}.toString.call是最靠谱的做法.但,你应该了解,从性能角度来说. typeof的性能是最佳的. 而 constructor 和{}.toString.call 在IE系则是constructor的性能要比后者高那么一丁点.而在非IE.后者的效率要比constructor方式性能高10倍左右. 所以最佳实践不用说了,只要不是 object.建议使用typeof.否则用{}.toString.call.

 

上一条资讯|返回栏目页|下一条资讯

沈阳网站制作--网站前台效果

易势网站制作,以DIV+CSS为主,js/jQuery为辅,制作利于优化,页面美观的优质网站!

top

网络策划公司|新浪官方微博|大连网站建设