1. 检测原始值
在JavaScript中有5种原始类型,字符串、数字、布尔值、null、undefined。
如果想检测一个值是字符串、数字、布尔值、undefined中的一个时,最佳选择是使用typeof运算符:
对于字符串: typeof返回 “string”;
对于数字: typeof返回 “number”;
对于布尔值: typeof返回 “boolean”;
对于undefined: typeof返回 “undefined”;
用typeof检测这四种原始值是非常安全的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 检测字符串
if ( typeof name === "string" ){
// do something ...
}
// 检测数字
if ( typeof count === "number" ){
// do something ...
}
// 检测布尔值
if ( typeof found === "boolean" ){
// do something ...
}
// 检测undefinded
if ( typeof myApp === "undefined" ){
// do something ...
}
typeof运算符的独特在于,将其用于一个未声明的变量也不会报错。未定义的变量和值为undefined的变量通过typeof都返回undefined。
对于null,一般不用于检测语句,简单的和null比较通常不会包含足够的信息以判断值的类型是否合法。
2. 检测引用值
引用类型有:Object、Array、Date和Error
用typeof检测引用类型都返回“object”,所以检测引用值的类型的最好方法是使用instanceof运算符。
基本语法: value instanceof constructor1
2
3
4
5
6
7
8
9
10
11
12// 检测日期
if ( value instanceof Date ) {
// do something ...
}
// 检测正则
if ( value instanceof RegExp ) {
// do something ...
}
// 检测Error
if ( value instanceof Error ) {
// do something ...
}
instanceof 的一个特性是它不仅检测构造这个对象的构造器,还检测原型链。1
2
3var now = new Date();
console.log( now instanceof Object ); // true, 每个对象都继承自Object
console.log( now instanceof Date ); // true
因为上面这个原因,使用value instanceof Object 来判断对象是否属于某个特定类型的做法并非最佳。
instanceof 运算法也可以检测出自定义的类型,这也是检测自定义类型的唯一方法:1
2
3
4
5
6function Person( name ){
this.name = name;
}
var me = new Person( "xiaoming" );
console.log( me instanceof Object ); // true
console.log( me instanceof Person ); // true
1) 检测函数
检测函数最好的方法是typeof。
2) 检测数组
1
2
3
4
5
6
7function isArray(value){
if ( typeof Array.isArray === "function" ){
return Array.isArray(value);
} else {
return Object.prototype.toString.call(value) === "[object Array]";
}
}
3. 检测属性
判断属性是否存在的最好的方法是使用in运算符。in运算法仅仅会简单的判断属性是否存在,而不会去读属性的值。如果实例对象的属性存在、或继承自对象的原型,in运算符都会返回true:
1
2
3
4
5
6
7
8
9
10var object = {
count:0,
related:null
};
if ( "count" in object ){
// do something...
}
if ( "related" in object ){
// do something...
}
如果只想检测实例对象的某个属性是否存在,使用hasOwnProperty()方法,所有继承自Object的js对象都有这个方法,如果实例中存在这个属性则返回true(如果这个属性只存在原型里,则返回false)。
[参考资料]:
编写可维护的JavaScript,Nicholas C. Zakas 著,李晶 郭凯 张散集 译, Copyright 2012 Nicholas Zakas,978-7-115-31008-8