本文已参与「新人创作礼」活动,一起开启掘金创作之路。
javascript逻辑运算符的关联性和优先级
javascript的逻辑运算符其实更像一种选择器,会选择左右一个值作为返回值,而不是返回true或false
逻辑运算符的关联性和优先级:
· &&:采取左关联,优先级高于|| 高于 ?
· || : 采用左关联,优先级低于&&高于?
· ?: 采用右关联,优先级低于前两者。
验证:当两个逻辑运算符,三个操作数时,就会有运算符表达式的执行顺序(优先级)
var a = 42;
var b = ‘foo’;
var c = false;
a&&b||c; //foo
a||b&&c;//42
·因为&&的优先级高于||,所以结果不言而喻。
tip:&&运算符有一个很好的特性,即短路因为当左边表达式为假时,就不会对后边的表达式进行运算。一般用于 if(opts&&opts.cool),当没有opts时,表达式opts.cool会出错,这样用逻辑运算符连接,就起到了保护作用,同样也起到了不必要的代码运算。
·当三种逻辑运算符结合在一起使用就会牵扯优先级,其实更可以认为是更强的绑定。以下是示例可以解释各自的关联性,及优先级。
示例1:
var a = 1 var b = 'foo' var c = false\
console.log(a && b || c && a || b && c || b && a);//结果为foo\
解析:
其实经过了这几步:1.根据关联性进行关联//{[ (a&&b) || (c&&a) ] || (b&&c)} || (b&&a)
-
执行顺序从左到右执行 foo false false 1
-
结果 foo
实例2:console.log(a && b || a || c && b ? b || c && a ? a || b : a && b : a && b);
解析:
步骤:1.(a && b) || a || (c && b) ? (c && a)? (a || b) : (a && b) : (a || b)
2.(a && b) || a || (c && b) {? (c && a)[? (a || b) : (a && b)] : (a || b)}
-
foo fales false 1 foo 1
-
foo ? foo ? 1 : foo : foo
-
foo ? 1 : foo
-
1
复杂的逻辑运算符的结合按照先结合&&用括号标注,然后是 || ,均为左关联,然后是三元运算符?按照右关联。 tips:a||b&&c?a:b,这个的正确表达意思是,(a||b&&c)表达式结果是?的条件,而不是c是?的条件,?按照右关联,所以总起是这样 { [ a || (b&&c) ] ? a : b }