编写可维护的JavaScript---避免空比较

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 constructor

1
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
3
var 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
6
function 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
7
function 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
10
var 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

baishiwen wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!