@Dale-Lin
2017-03-28T22:56:14.000000Z
字数 1905
阅读 926
JavaScript
Boolean类型是ES中使用得最多的一种类型,要将一个值转换成其对应的布尔值,可以调用转型函数Boolean(),如下例所示:
var message = "Hi!";
var messageAsBoolean = Boolean(message);
可以对任意值调用Boolean()函数,而且总会返回一个布尔值。
对于各种数据类型及其实际值,有下列转换规则:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括±infinity) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
这些转换规则对理解流控制语句自动执行对应的Boolean转换非常重要:
var message = "Hi!";
if (message){
alert("Value is true!");
}
在示例中,警告框将会显示,因为在if判断语句执行时,自动把message转换成了Boolean值true。由于这种自动执行的Boolean值转换的存在,确切的知道在流控制语句中使用的是什么变量至关重要。错误地使用一个变量而不是一个Boolean值,就有可能彻底地改变应用程序的流程。
布尔操作符一共有三个:与(AND)、或(OR)、非(NOT)。
1. 逻辑与
逻辑与操作符由两个和号(&&)表示,有两个操作数:
var result = ture && false;
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作不一定会返回布尔值;此时,它遵循下列规则:
① 如果第一个操作数是对象,则返回第二个操作数(按上一节中的转换表来判断,下同);
② 如果第二个操作数是对象,则只有在第一个操作数求值为true的情况下才会返回第二个操作数对象;
③ 如果两个操作数都是对象,则返回第二个对象;
④ 如果第一个操作数是null,则返回null;
⑤ 如果第一个操作数是NaN,则返回NaN;
⑥ 如果第一个操作数是undefined,则返回undefined;。
逻辑与操作属于短路操作,从倒数三个例子中可以看出,当第一个操作符判断结果是false时,第二个结果将不被判断,直接跳过。注意,在逻辑与中不能使用未声明的对象,否则可能发生错误。
2. 逻辑或
逻辑或操作符由两个竖线符号(||)表示,有两个操作数:
var result = ture || false;
与逻辑与操作类似,如果有一个操作数不是布尔值,则返回的值也不一定是布尔值;此时,它遵循下列规则:
① 如果第一个操作数是对象,则返回第一个操作数;
② 如果两个操作数都是对象,则返回第一个操作数;
③ 如果第一个操作数求值结果为false,则返回第二个操作数;
④ 如果两个操作数都是null,则返回null;
⑤ 如果两个操作数都是NaN则返回NaN;
⑥ 如果两个操作数都是undefined则返回undefined;
与逻辑与操作符类似,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,第二个操作数将被跳过。但当第一个操作数返回的值是false时,第二个操作数如果未被声明,将会出现错误。
我们可以利用这个特性来避免为变量赋null或undefined值:
var myObject = preferredObject || backupObject;
在这个例子中,变量myObject将被赋予两个操作符的值之一。preferred的操作符含有优先赋予变量myObject的值,而backup的操作符负责在preferred的操作符不包含有效值的情况下提供后备值。ECMAScript程序的赋值语句经常会使用这种模式。
3. 逻辑非
逻辑非操作符由一个叹号(!)表示,可以应用于ECMAScript中的任何值。对于任何数据类型,都会返回一个Boolean值:
var result = !"Anything";
逻辑非操作符的作用机制是:首先将一个操作数转换为一个Boolean值(参考第一节),然后求其反。即遵循如下规则:
① 如果操作数是一个对象,则返回false;
② 如果操作数是一个空字符串,则返回true;
③ 如果操作数是一个非空字符串,返回false;
④ 如果操作数是0,返回true;
⑤ 如果操作数是非0数值(包括±infinity),则返回false;
⑥ 如果操作数是null、NaN或undefined,则返回true;
逻辑非操作符也可以用于将一个操作数转换为其对应的Boolean值,即对一个操作数使用两次逻辑非操作符。事实上,其结果与对该操作数调用Boolean()函数相同。