js中的typeof用来检查一个变量的数据类型,它返回的是一个字符串。不同类型变量经typeof运算符后返回的值如下:
- undefined:“undefined”
- null:“object”
- string:“string”
- number:“number”
- boolean:“Boolean”
- function:“function”
- object:“object”
需要注意的是null返回的是object。下面再来说一说null和undefined的区别:
- null:表示一个尚不存在的对象,表示一个对象的占位符,意思是这里将来会是一个对象,而现在该对象还没有创建。
- undefined:表示一个还未定义(声明)或者定义了还没有初始化的变量(对象)。
这里要注意,如果一个变量尚未声明,使用if语句检测该变量会报错,而使用typeof将会返回undefined。undefined和null的布尔值都是false。因此,未声明的变量应该用typeof来检测,而不是直接使用if语句。
另外,undefined是从null派生出来的,因此undefined==null返回true。一个没有返回值的function实际上返回的是undefined。
jQuery中推荐了用以下方式来检测一个变量是否定义(声明)了:
- Global Variables: typeof variable === “undefined”
- Local Variables: variable === undefined
- Properties: object.prop === undefined
但是:For undeclared variables, typeof foo will return the string literal “undefined”, whereas the identity check foo === undefined would trigger the error “foo is not defined”. 因此最好使用typeof来检测。
typeof还有一个常见的用法就是检查某个变量是否存在,例如浏览器支不支持某个对象。举个例子,在《JavaScript高级程序设计》中有一段跨浏览器生成XMLHttpRequest对象的代码。
function createXHR(){
if(typeof XMLHttpRequest !="undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject !="undefined"){ //for IE5,6
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
这里的XMLHttpRequest和ActiveXObject都是window下的全局变量,是一个构造函数(typeof检测返回function),如果浏览器支持的话,即该变量存在,直接使用if(window.XMLHttpRequest)可返回true,但是如果浏览器不支持,直接使用if检测一个未定义的变量就会抛出 ReferenceError,而使用typeof则会返回undefined,不会报错。
这里做一个补充,对于通过var声明的变量使用if语句检测会报错,而对于某个对象不存在的属性进行检测是不会报错的,其实,不存在的属性值为undefined。放在if语句中就是false值。像这样检测一个对象的属性是否存在可以直接放到if语句中而不使用typeof。
参考资料:js中undefined,null和typeof运算符