3

我有一个变量来检查某些值的长度;如果失败,var pass则设置为false. 另一个函数检查电子邮件地址的有效性,如果未通过测试,则将其设置为 false。我正在尝试制作自定义错误消息。

使用像这样的三元运算符还是嵌套的 if 语句更好。还是有更简单的方法来做到这一点?

var mail = true;
var pass = true;
var err = '';

(mail && pass) ? err = 'mail and pass both true' : (!mail && pass) ? err = 'not mail and is pass' : (mail && !pass) ? err = 'is mail and not pass' : err = 'neither pass nor mail';

小提琴

4

5 回答 5

7

“更好”本质上是一种价值判断,因此取决于您。看三元版本,再看if/else版本,决定哪个更易读、更易维护、更清晰。那是你应该选择的。这对编译器无关紧要,无论如何它最终都会做一些非常有效的事情。

于 2012-10-24T21:29:17.087 回答
3

您可能遇到的唯一语法问题是三元运算符的关联性。使用括号来减少歧义会有所帮助。

主要问题是人类几乎无法阅读该行。嵌套的 if 更容易阅读和维护。想象一下自己在两个月后回到那条线并试图破译它。

于 2012-10-24T21:30:01.437 回答
1

只是为了代码的清晰,我会使用 if\else...

于 2012-10-24T21:29:52.483 回答
1

您可以使用一个很好的习语,它看起来有点像查找表:

var mail = true;
var pass = true;
var err = '';

err = ( mail &&  pass)  ?  'mail and pass both true' 
    : (!mail &&  pass)  ?  'not mail and is pass'
    : ( mail && !pass)  ?  'is mail and not pass' 
    :                      'neither pass nor mail';

当然,对于哪个更好,这完全是主观的,但是如果唯一的操作是分配给单个变量,这可能是替换一系列 if 语句的好方法。

也就是说,它确实结合了三进制的视觉紧凑性,同时解决了单行三进制固有的难以辨认的问题。不利的一面是,如果以后的代码要求您做的不仅仅是根据布尔值选择表达式,那么无论如何您都需要将其重构为 if-else 语句......

于 2012-10-24T21:44:58.963 回答
0

现有答案中已经有一些好的想法。只是为了全面起见,这里有一个声明性解决方案:

http://jsfiddle.net/Shedal/4SfTj/1/

var statusStrings = {
    true: {
        true: 'mail and pass both true',
        false: 'is mail and not pass'
    },
    false: {
        true: 'not mail and is pass',
        false: 'neither pass nor mail'
    }
}

var mail = true;
var pass = true;
var err = statusStrings[mail][pass];

document.write(err);
于 2012-10-24T21:35:08.180 回答