分类: C#/.net
2017-04-04 21:05:21
三目运算符相信大家都很熟悉了:
foo ? 'foo == true' : 'foo == false'
而三目运算符?:?:?.....的调用方式大家也不陌生, 就相当于一堆if - else if语句:
foo ? 'foo == true' : bar ? 'bar == true' : 'bar == false'
但是在zepto.js里有一段代码:
slice.call(
isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class element.getElementsByTagName(selector) : // Or a tag element.querySelectorAll(selector) // Or it's not simple, and we need to query all )
这里的三目运算符用的是??::的形式,我搞不太懂,所以打算做个实验搞懂它:
var bool1 = true, bool2 = true, val1 = 'val1', val2 = 'val2', val3 = 'val3'; console.log(bool1 ? bool2 ? val1 : val2 : val3);
用表格记录下4个不同点情况:
bool1 bool2 值 true true val1 true false val2 false true val3 false false val3
可以看出上面的代码等价于:
console.log(bool1 ? ( bool2 ? val1 : val2 ) : val3);
条件(三元)运算符 -mdn上说三目运算符具有右结合性,根据以上两个例子,我总结三目运算符右结合性的意思是:
比如:
?:?:?:?:?:
可以取为
?:(?:(?:(?:(?:))))
而
???:::
可以取为
?(?(?:):):
然后根据你加上的括号,可以写出等价的if判断语句,这样就能理解复杂三目运算符所包含的意义了。
注意,三目运算符中"?"和":"是成对出现的,最起码数量上,有几个"?"就会有几个":".