具有函数的JavaScript三元运算符示例


91

我正在使用jQuery 1.7.1

我刚刚开始使用JavaScript三元运算符替换简单的if / else语句。我已经在几个地方成功地做到了。当我确信可以成功完成其他工作时,我感到很惊讶,但是无论如何我还是尝试了。

这是原始语句:

function updateItem() {
    $this = $(this);
    var IsChecked = $this.hasClass("IsChecked");
    if (IsChecked == true){
        removeItem($this);
    } else {
        addItem($this);
    }
}

这是使用三元运算符的相同功能:

function updateItem() {
    $this = $(this);
    var IsChecked = $this.hasClass("IsChecked");
    (IsChecked == true) ? removeItem($this) : addItem($this);
}

我很惊讶,因为我看到的所有示例都只设置了这样的变量:

x = (1 < 2) ? true : false;

我的问题是这是否是“正常”使用,并且可以在大多数JavaScript版本中使用吗?哪里会失败?还有其他不太明显的用途吗?

更新-感谢您的“真实世界”建议!!!

我使用它作为我的功能:

function updateItem() {
    $this = $(this);
    $this.hasClass("IsChecked") ? removeItem($this) : addItem($this);
}

这是正常现象,并且可以正常工作。通常,使用三元运算符时,可读性很难,但在您的情况下,看起来很好。
Selvakumar Arumugam 2012年

1
嗯....您也可以这样做,因为它们都接受相同的参数(IsChecked ? removeItem : addItem)($this)。但是,要回答您的问题,是的,这很正常,使用三元运算符也没有错,只要它们在需要的情况下不损害可维护性或可读性即可。jsfiddle.net/vsB3f
Kevin B

if($this.hasClass("IsChecked")) removeItem($this); else addItem($this)是正确的方法。三元运算符不是针对此类情况的,而是针对诸如此类的事情foo(isChecked ? 'bar' : meow());(例如,当您关心在then / else块中所做的任何事情的“返回值”时)
ThiefMaster 2012年

1
在您的示例中,跳过第一行以支持此操作: $(this).hasClass("IsChecked") ? removeItem($this) : addItem($this); 我可以按一行原样理解您的代码,因此符合我的经验法则(请参见下面的文章)。为我工作。
超现实主义梦想

Answers:


189

呵呵,您的问题中有一些令人兴奋的三元语法用法;我最喜欢最后一个...

x = (1 < 2) ? true : false;

这里完全不需要使用三进制-您可以简单地编写

x = (1 < 2);

同样,三元语句的条件元素始终被评估为布尔值,因此您可以表示:

(IsChecked == true) ? removeItem($this) : addItem($this);

简单如下:

(IsChecked) ? removeItem($this) : addItem($this);

实际上,我也将删除该IsChecked临时文件,使您拥有:

($this.hasClass("IsChecked")) ? removeItem($this) : addItem($this);

至于这是可以接受的语法,当然可以!这是在不影响可读性的情况下将四行代码简化为一行的好方法。我唯一要提的建议是避免在同一行上嵌套多个三元语句(这就是疯狂!)


请注意您可能希望避免在类名使用上例(变成器isChecked是核对)stackoverflow.com/questions/1547986/...
阿德里安成为

JS具有一流的功能:($this.hasClass("isChecked") ? removeItem : addItem)($this)
Clojure17年

22

三元样式通常用于节省空间。从语义上讲,它们是相同的。我更喜欢使用完整的if / then / else语法,因为我不喜欢牺牲可读性-我是老派,并且我喜欢用花括号。

完整的if / then / else格式几乎用于所有内容。如果您在每个分支中进入较大的代码块,具有多分支的if / else树或长字符串中包含多个else / if,则它特别受欢迎。

当您基于简单条件为变量分配值或您做出多个决策且结果很简短时,三元运算符很常见。您引用的示例实际上是没有意义的,因为表达式将在没有任何额外逻辑的情况下求值为两个值之一。

好主意:

this > that ? alert(this) : alert(that);  //nice and short, little loss of meaning

if(expression)  //longer blocks but organized and can be grasped by humans
{
    //35 lines of code here
}
else if (something_else)
{
    //40 more lines here
}
else if (another_one)  /etc, etc
{
    ...

不太好:

this > that ? testFucntion() ? thirdFunction() ? imlost() : whathappuh() : lostinsyntax() : thisisprobablybrokennow() ? //I'm lost in my own (awful) example by now.
//Not complete... or for average humans to read.

if(this != that)  //Ternary would be done by now
{
    x = this;
}
else
}
    x = this + 2;
}

一条非常基本的经验法则-您能一口气理解整个事情还是更好?三元还可以。否则将其展开。


7

您发布的示例没有特别棘手的地方。

在三元运算符中,将评估第一个参数(条件条件),如果结果为true,则评估并返回第二个参数,否则,将评估并返回第三个参数。这些参数中的每一个都可以是任何有效的代码块,包括函数调用。

这样想:

var x = (1 < 2) ? true : false;

也可以写成:

var x = (1 < 2) ? getTrueValue() : getFalseValue();

这是完全有效的,并且这些函数可以包含任何任意代码,无论它是否与返回值有关。此外,三元运算的结果不必分配给任何东西,就像函数结果不必分配给任何东西一样:

(1 < 2) ? getTrueValue() : getFalseValue();

现在,只需将它们替换为任意函数,就可以得到与示例类似的东西:

(1 < 2) ? removeItem($this) : addItem($this);

现在,您的最后一个示例实际上根本不需要三进制,因为可以这样编写:

x = (1 < 2);  // x will be set to "true"

6

如果您要嵌套三元运算符,我相信您想做这样的事情:

   var audience = (countrycode == 'eu') ? 'audienceEU' :
                  (countrycode == 'jp') ? 'audienceJP' :
                  (countrycode == 'cn') ? 'audienceCN' :
                  'audienceUS';

写入/读取的效率比:

var audience = 'audienceUS';
if countrycode == 'eu' {
   audience = 'audienceEU';
} else if countrycode == 'jp' {
   audience = 'audienceJP';
} else if countrycode == 'cn' {
   audience = 'audienceCN';
}

与所有良好的编程一样,空白对于那些在完成项目后必须阅读您的代码的人来说,一切都很好。


6
强烈不同意您上述关于嵌套三元数更易于阅读和调试的评论。就个人而言,我宁愿将嵌套的else / if块替换为查找表或switch语句。
JonnyReeves 2013年

@JonnyReeves同意-通常,在检查不同条件(例如,对数字

6

我还想从我身上添加一些东西。

使用三元运算符调用函数的其他可能语法为:

(condition ? fn1 : fn2)();

如果必须将相同的参数列表传递给两个函数,则可能会很方便,因此您只需编写一次即可。

(condition ? fn1 : fn2)(arg1, arg2, arg3, arg4, arg5);

您甚至可以将三元运算符与成员函数名称一起使用,我个人非常想节省空间:

$('.some-element')[showThisElement ? 'addClass' : 'removeClass']('visible');

要么

$('.some-element')[(showThisElement ? 'add' : 'remove') + 'Class']('visible');

另一个例子:

var addToEnd = true; //or false
var list = [1,2,3,4];
list[addToEnd ? 'push' : 'unshift'](5);

2

我知道问题已经回答。

但是,我要在这里补充一点。这不仅是对还是错。见下文:

var val="Do";

Var c= (val == "Do" || val == "Done")
          ? 7
          : 0

如果val为Do或Done,则c为7,否则为零。在这种情况下,c将为7。

这实际上是此运算符的另一个角度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.