在js中写出如下的答案 :
var a = 2;
var b = 3;
var andflag = a && b ;
var orflag = a || b;
问andflag 和orflag 分别是什么?
起初我认为: andflag 和orflag 的值都为 true; 毕竟 && 和 || 都是求Boolean ,后来发现,我错了。
答案应该是 andflag = 3,orflag = 2;

其实,&&和||返回的是两个操作数的其中一个。

&&,左操作数为假值时,返回左操作数,否则返回右操作数。

||,左操作数为假值时,返回右操作数,否则返回左操作数。

假值有空字符串"",数值0和-0,NaN,false,null和undefined。

仔细想想,&&如果左边为真值,结果就取决右边的操作数。而||如果左为假,则结果取决于右。

所以我觉得,js这样做,无伤大雅,并且提供了更好的灵活性。

&&和||还有一个"短路"原则:

当左边的结果能决定整个&&/||的结果时,不会执行右边的计算。比如 2*0 && (i++)+2 这个表达式,先计算&&左边的2*0得到一个假值0,这个时候无论右边是真是假都不会影响结果(为假,对于js来说就是返回左边的值),所以就不会去执行右边的运算,也就是说右边的(i++)+1根本就不会得到执行。

关于优先级和运算顺序:

看了上面短路的例子,很多人就会说了,i++的优先级不是很高吗?为什么得不到执行?

其实,优先级不会直接决定执行顺序,他是用来决定操作数属于哪个运算符的(或者说决定操作数之间的结合),比如说1+2*3,这个中间的2,是根据优先级,把中间的2给了*,而不是给+,所以这里是2和3结合。

再比如1||2&&3,这里&&的优先级更高,所以2和3结合。也就是相当于1 || (2&&3),这里会先计算1,是一个真值,根据短路原则,就不会去执行右边的计算了,直接返回1,作为整体的结果。

在运算过程中,首先js 会将 && 和|| 两边的值转成Boolean 类型,然后再算值 ,&&运算如果返回true,则取后面的值,如果|| 返回true,则取前面的值 , 而其中数值转换成boolean 的规则 是:

对象、非零整数、非空字符串返回true,其它为false ;

a && b 的运算就是 :因为 a 和 b全是非零整数,所以 a 和 b 也就是true ,而 true && true 返回 true ,则取后面的b ,同理 a 和b 全是非零整数,a 和b 全是true ,则true || true 返回 true ,取|| 前面的值 也就是2;

同样:该逻辑运算符支持短路原则:

如 var a = “” || null || 3 || 4 —-> var a = fasel || false || true || true 结果为true 则返回第一个true,即是3

var b = 4 && 5 && null && 0 ——> var b = true && true && false && false 结果是false 则返回第一个false 即是null

发表回复

后才能评论