1 // && 等价于:
2 function AND () {
3 for (var i = 0; i < arguments.length; i++) {
4 if (!arguments[i]) {
5 return arguments[i];
6 }
7 }
8 return arguments[i-1];
9 }
10
11 // || 等价于:
12 function OR () {
13 for (var i = 0; i < arguments.length; i++) {
14 if(arguments[i]) {
15 return arguments[i];
16 }
17 }
18 return arguments[i-1];
19 }
(注:在这里我同时也想对 ! 这个运算符做讲解,但考虑到内容和篇幅的问题,暂时不做深入探究,仅做简单讲述。 ! 运算符实际上运行机制与 && 和 || 是一样的,首先会对参数值做判断,如果是一个布尔值,则进行取反运算,如果是一个非布尔值,则先进行隐式转换,再进行取反运算。而我们通常写的 if (something) 语句,实际上的意思 if (!!something))
然后我们可以这样使用:
1 var a = ["hello", undefined, "world"]; 2 console.log(AND.apply(null, a)); //undefined 3 var b = ["", 0, NaN]; 4 console.log(OR.apply(null, b)); //NaN
进而,我们就可以推断出一下结论:
1 a = x || y;
2 //等价于:
3 a = x ? x : y;
4
5 a = x && y;
6 //等价于:
7 a = x ? y : x;
这通常也是一些压缩工具所做的事情,它们尽可能的将繁杂的条件判断语句转换成 && 或者 || ,因为这样代码更加的精简,但是可读性则就不那么可观了。
对于最开始的那一段代码:
1 if( "hello" && 0 ) { 2 console.log(true); 3 } else { 4 console.log(false); 5 }
我们现在就要这样解释:首先这是个与运算符,与运算符的作用是取第一个假值,如果所有的值都为真,那么则返回最后一个值。所以在这条语句中,第一个值是 "hello" ,因为该值是一个非布尔值,JS 引擎会先将它隐式转换成布尔值,而该值不在假值的范围内,所以会被转化成 true 。随后 JS 引擎会继续查找,第二个值是 0 ,该值同样也不是一个布尔值,所以 JS 引擎也会先将它隐式转换成布尔值,而该值在假值的范围内,所以会被转化成 false ,满足 && 运算符的查找条件,则将值 0 返回。而条件判断语句接受到了值 0 ,该值不是一个布尔类型的值,所以会先对它进行隐式转换,而该值在假值范围内,所以会被转化成 false ,然后控制台会输出 false。
所以说以后当我们看到 && 和 || 时候,就不要仅仅的从字面上的意义去理解了,在看完了这篇文章之后,你就可以很自豪很有底气的对别人说,你真的会用逻辑运算符吗?
好了,就这么两个小玩意居然背后也有着这么多的精髓,看来知识的深度是无穷的。