码迷,mamicode.com
首页 > 其他好文 > 详细

三目(三元)运算符??::的形式

时间:2017-04-04 14:06:53      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:evel   document   zh-cn   eid   不同   developer   order   nbsp   三元   

三目运算符相信大家都很熟悉了:

foo ? ‘foo == true‘ : ‘foo == false‘

而三目运算符?:?:?.....的调用方式大家也不陌生, 就相当于一堆if - else if语句:

foo ? ‘foo == true‘ : bar ? ‘bar == true‘ : ‘bar == false‘

但是在zepto.js里有一段代码:

1 slice.call(
2         isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn‘t have getElementsByClassName/TagName
3           maybeClass ? element.getElementsByClassName(nameOnly) : // If it‘s simple, it could be a class
4           element.getElementsByTagName(selector) : // Or a tag
5           element.querySelectorAll(selector) // Or it‘s not simple, and we need to query all
6       )

这里的三目运算符用的是??::的形式,我搞不太懂,所以打算做个实验搞懂它:

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);

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Conditional_Operator上说三目运算符具有右结合性,根据以上两个例子,我总结三目运算符右结合性的意思是:

从最右边取":", 然后看它左边相邻的符号,如果是"?",那么它和这个"?"结合起来,可以用一个()把它俩包住;如果左边相邻的符号是":",那么取左边的":",再重复这个判断.

比如:

?:?:?:?:?:

可以取为

?:(?:(?:(?:(?:))))

???:::

可以取为

?(?(?:):):

然后根据你加上的括号,可以写出等价的if判断语句,这样就能理解复杂三目运算符所包含的意义了。

注意,三目运算符中"?"和":"是成对出现的,最起码数量上,有几个"?"就会有几个":".

 

三目(三元)运算符??::的形式

标签:evel   document   zh-cn   eid   不同   developer   order   nbsp   三元   

原文地址:http://www.cnblogs.com/yinyueleiming/p/6664879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!