我有一个变量来检查某些值的长度;如果失败,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';
答案 0 :(得分:7)
“更好”本质上是一种价值判断,所以这取决于你。查看三元版本,查看if/else
版本,并确定哪个版本更具可读性,可维护性和清晰性。那是你应该选择的那个。这对编译器来说无关紧要,无论如何,编译器最终会做一些非常有效的事情。
答案 1 :(得分:3)
您可能遇到的唯一语法问题是三元运算符的关联性。使用括号来减少歧义有助于。
主要问题是人类几乎无法读取该行。嵌套ifs更容易阅读和维护。想象一下自己在两个月后回到那条线并尝试破译它。
答案 2 :(得分:1)
只是为了清晰的代码我会在\ else ...
时使用答案 3 :(得分: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语句...
答案 4 :(得分: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);