JS的逻辑运算结果和其他一些强类型语言差别比较大,也比较容易让人产生困惑,看下面的例子:
<script type="text/javascript">
var a = 40;
var b = "hello";
alert(!!a);//true
alert(!!b);//true
alert(a && b);//alert hello
</script>
我们定义两个变量a、b,对a、b进行两次取反获取它们转换成boolean类型的值均为true。然后將变量a和变量b做逻辑运算,发现结果竟然不是true,而是”hello”。
为了明确JS逻辑运算的最终结果是怎样的,我们需要先了解一下JS中哪些类型的值在做逻辑判断的时候会被认为是false。
- 空字符串
""
- 数值类型(number)中的0和NaN
- null类型
- undefined类型
- boolean类型中的false
<script type="text/javascript">
//alert false
if(""|| 0 || null || undefined || NaN || false )
{
alert(true);
}else
{
alert(false);
}
</script>
执行上面代码对话框中弹出false,其他值在逻辑判断时均被认为是true。
接下来在来解释逻辑运算符||和&&的返回结果是怎么一回事:
事实上,JS以参与逻辑运算的最后一个值作为本次逻辑运算的最终结果,这句话理解起来可能有点困难,我们来看看下面的例子:
var num1 = 40;
var str1 = "hello";
alert(num1 || str1);//40
alert(num1 && str1);//hello
大家都知道 || 运算符是”一真则真”,num1转换为boolean类型为true,已经有一个”true”了,所以 || 运算符后面的部分没有被执行,也就是说str1根本就没有参与该逻辑运算。JS会把num1的值作为本次逻辑运算的结果。
而逻辑运算符&&则是”一假则假”,num1转换为boolean类型为true,能够决定该逻辑运算结果转换为boolean类型真假的是str1。所以JS以str1作为该逻辑运算的结果。
有了这些依据下面的逻辑运算结果就很容易判断了:
var num2 = 0;
var str2 = "wrold";
alert(num2 || str2);//hello
alert(num2 && str2);//0
var num3 = 40;
var str3 = "";
alert(num3 || str3);//40
alert(num3 && str3);//""
num2值为0,转换成boolean类型为false, num2 || str2
逻辑运算的结果由str2决定。num2 && str2
逻辑运算中num2 已经为假,str2未参与逻辑运算,所以以num2作为该逻辑运算的结果。下面的一个例子也是同样的道理。