具有逻辑运算符的复数三元运算符

时间:2015-02-08 09:03:07

标签: javascript

嘿伙计们我正在调试一个非常小的java脚本插件,我似乎已经弄清楚了大部分内容但是我在理解下面的功能时遇到了一些困难:

CBPFWTabs.prototype._show = function( idx ) {
        if( this.current >= 0 ) {
            this.tabs[ this.current ].className = '';
            this.items[ this.current ].className = '';
        }
        // change current
        this.current = idx != undefined ? idx : this.options.start >= 0 && this.options.start < this.items.length ? this.options.start : 0;
        this.tabs[ this.current ].className = 'tab-current';
        this.items[ this.current ].className = 'content-current';
    };

我开始浏览每个功能部分并将各个部分组合在一起。最终我非常成功,MDN的优秀文档也有所帮助,但是,我仍然难以理解以下内容:

this.current = idx != undefined ? idx : this.options.start >= 0 && this.options.start < this.items.length ? this.options.start : 0;

三元运算符和逻辑运算符的组合看起来确实令人困惑,为了简化上述我尝试用简单的英语阅读它,我最好的解释是:

如果idx 不等于到未定义且idx 等于到this.current ...我几乎坚持这个,接下来会发生什么我可以'甚至猜。如果有人能够在普通的englsih中解释那条线,那就太好了! 。

编辑:: :我刚刚在评论中阅读了下面发布的一篇非常好的文章链接,所以只是想澄清一下,给出下面的代码行(嵌套的三元运算符):

int i = 5;
string result = i % 2 == 0 ? "a" : i % 3 == 0 ? "b" : i % 5 == 0 ? "c" : i % 7 == 0 ? "d" : "e"; 

最后e的功能更像是开关盒中的默认情况,对不对? 。 谢谢 。

亚历山大

5 个答案:

答案 0 :(得分:1)

您发布的是两个(嵌套的)三元运算符:

this.current = idx != undefined ? idx : c;

... c的结果是:

 (this.options.start >= 0 && this.options.start < this.items.length ? this.options.start : 0);

换句话说,嵌套的三元运算符被评估为第一个三元运算符的false路径。


如果仍然不清楚;想到这就好;

if (idx != undefined) {
    this.current = idx;
} else if (this.options.start >= 0 && this.options.start <  this.items.length) {
    this.current = this.options.start;
} else {
    this.current = 0;
}

答案 1 :(得分:1)

三元运算符a = cond ? b : c可以解释如下:

if (cond) {
    a = b;
} else {
    a = c;
}

正如您所看到的,&#34; c&#34;中有一个嵌套的三元运算符。部分,所以你可以把另一个嵌套if在那里帮助你翻译成英文。 希望能说清楚。

答案 2 :(得分:1)

你可以使用if else来编写这一行:

if(idx != undefined) {this.current = idx
} else if (this.options.start >= 0 && this.options.start < this.items.length) {this.current = this.options.start
} else {this.current = 0}

答案 3 :(得分:1)

将其分解为部分:

this.current = idk != undefined ? idk : ...
如果this.current不是idx,则idx等于undefined

this.current = ... ? ... : this.options.start >= 0 && this.options.start < this.items.length ? this.options.start : ...
否则,如果this.options.start大于或等于0但低于this.options.start,则它将等于this.items.length

this.current = ... ? ... : ... && ... ? ... : 0
否则它将等于0.

尽量避免像这样复杂的三元运算符,简单的if更容易阅读。

答案 4 :(得分:1)

这里使用普通的if / else

if (idx != undefined) {
    this.current = idx;    
} else if (this.options.start >= 0 && this.options.start < this.items.length) {
    this.current = this.options.start
} else {
    this.current = 0;
}

对于赋值操作,可能有助于将其视为/ then / else。虽然您可以将它用于许多其他事情,但通常不建议用于复杂的if / else程序流程。因为沿着几行代码很难遵循它。一个很好的例子,当你觉得使用它的时候会感觉很舒服。

var foo = amount > 5 ? 'greater than 5' : 'less than or equal to 5';
// amount === 7 --> foo is now set to 'greater than 5'
// amount === 4 --> foo is now set to 'less than or equal to 5'

只是一个显示可接受的复杂程度的例子,嵌套2也应该没问题,但我会避免嵌套更多,即使2可以减慢阅读代码的人的速度。