Omitting the second expression when using the if-else shorthand
没有else,我可以写if else的简写吗?
1 2 3
| var x=1;
x==2 ? dosomething() : doNothingButContinueCode(); |
我注意到把null放在其他作品上(但我不知道为什么或者这是个好主意)。
编辑:你们中有些人似乎很困惑为什么我要尝试这个。放心吧,这完全是出于好奇。我喜欢摆弄javascript。
- 我认为有一个var | var语法。小心,因为它可能很难"看到",特别是(IMO)三元是有问题的。节俭地使用。
- @Jaredfarrish不是三元的全部意义,它们比使用if语句更容易"看到"吗?还有,你说的语法是什么,看起来很有趣。
- 不,我觉得在任何情况下都不容易。我心目中的"全部要点"是要么把它全部放在一行("我的代码比你的短"),要么放在具有简单结果的具体的文字案例中。堆叠三元是特别有害的,应避免不惜一切代价。:)
- @哈桑-我见过类似于foo = bar | cat;的东西,如果第一个是假的,在哪里呢?无效的?它"通过"到第二个。不过,我只见过,不使用它。
- 这样做没问题:var foo=bar soap;其中bar是一个falsy值(记住,js有六个不同的falsy值)。这将使foo成为SOAP的价值。我经常在创建"名称空间"时使用它,在这里您永远不知道是否设置了值,比如这样。var ns=ns ns.something=//另一个命名空间。
- @Jaredfarrish:这是a || b或a && b,否则将始终对b进行评估。
- 代码是为了读者的利益,因此,除非一种方法对代码执行有重大影响,而不是对另一种方法有同样的影响,否则简洁性不应使一种方法成为"最佳"。我恰好认为在扫描页面时,完整的if语句更具可读性/解析性。但我相信其他人不同意。
- @Jaredfarrish我很同意你的观点,但是那些特定的情况确实发生了,而且三元在这些情况下确实有助于提高可读性。
- @肯尼特-哦,好的,谢谢。那是一辆XOR吗?
- @Robinheggelundhansen——好的一点,在实践中我比三元更喜欢这种形式。我想我只是对三元有偏见。太容易让"聪明"逃脱,加上一点水和深夜小吃,你的代码中有一个小精灵。
- @Jaredfarrish我只使用三元运算符来设置值,因为它比ifs更不冗长。但对于其他所有内容(或者三元表达式变长和/或变复杂),我使用if构造,因为它更容易阅读。
- @Jaredfarrish是的,你应该只使用你100%知道在做什么的代码。
- @加勒德法里什:以东x1〔8〕或以东x1〔9〕。A和B都需要评估,XOR没有短路。
- @Kennytm-XOR抓到我的山羊。我想江户巫师也在喂它。它在实践中的逻辑作用仍然是个谜。
- @Kennytm——还有,var a = b || c的构造有名字吗?
- @Jaredfarrrish:我不认为有一个特定的名称,但是请参阅stackoverflow.com/questions/1378619/javascript-operator和相关的问题。
- @kennytm-虽然它不一定是这个实践方法的"名称",但我认为"短路"可能是最合适的。
- condition && (codetorun)它们的工作方式是只有当两者都为真时才返回真。所以如果条件为真,它将转到括号中的第二个,所以它首先计算,然后运行它。然后返回真/假。但我们只关心跑步的行为。所以当它的条件为false时,它只返回false,因为不需要评估第二个语句,因为结果将为false。
- 另一边的statement || statement将先运行一个,然后运行第二个。如果第一个是错误的,那么与&&相反。如果只有一条是真的,那么||返回,因此如果第一条语句是假的,那么第二条语句将在括号中进行计算,然后运行并返回。
- 这个问题的正确答案是nickc stackoverflow.com/a/11069295/1044366,不幸的是,它没有被标记为正确答案。
你所掌握的是三元运算符的一种非常不寻常的用法。通常,它在某些其他操作中用作表达式,而不是语句,例如:
1
| var y = (x == 2 ?"yes" :"no"); |
因此,对于可读性(因为您所做的是不寻常的),并且因为它避免了您不想要的"其他",我建议:
1
| if (x==2) doSomething(); |
- 在这里,我们可以添加作为完整命令插入的结束行(我的示例使用jquery fade-in和fade-out函数)x==2?$(element).fadein():$(element).fadein();返回变量(如第一个代码中的var y)不是强制的。
- 您必须使用三个"="符号才能使逻辑完美。如变量y=(x==2??是的:"不";
- @fino在技术上是正确的,但如果在不严格必要的情况下使用它,===通常会导致比它解决的问题更多的问题。例如,您真的希望2匹配,而不是"2"匹配吗?javascript(和类似的语言)可以很容易地忽略哪种语言;例如,文本字段中的用户输入将是一个字符串,可以与没有转换的==的数字2进行比较。===会在那里引起问题。
- @尼克,我认为"严格"是个词。这一切都取决于案件的用途。我应该写"逻辑要完全严格",以便建议坚持-stackoverflow.com/questions/523643/…
这也是一个选项:
只有当x==2的计算结果为真时,才会调用dosomething()。这叫做短路。
它在这种情况下并不常用,您真的不应该编写这样的代码。我鼓励这种更简单的方法:
您应该随时编写可读的代码;如果您担心文件大小,只需在众多JS压缩器中的一个的帮助下创建一个它的小型版本。(例如Google的闭包编译器)
- 哦,短路,对吧。我认为,在大多数中级开发人员和一些"经验丰富的专业人员"中,代码的可读性没有得到充分的重视。
- 从技术上讲,你不需要大括号:if (1 - 1 === 0) $('.woot').text('Woot!');,我一直在用PHP,现在我采用coffeescript,我也在我的javascript中使用它。
- 我个人认为如果这是一个小的如果有一个结果如果是真的。它可以更快更容易地编写x==2&dosomething();
- 6
- 是的,在小型版本中,if loop变为短路。
- 这太糟糕了。
- @Koraytugay你能详细说明你认为什么是可怕的,或者为什么?
- 我希望javascript包含这种类似Ruby的语法:doSomething() if x === 2。我不怀念鲁比,但我怀念那个。
另一种选择:
1
| x === 2 ? doSomething() : void 0; |
- 如果有人不知道为什么使用void 0,我建议阅读此链接
如果你不做其他的,为什么不做:
1
| if (x==2) doSomething(); |
对于三元表达式的一个分支,使用null是可以的。三元表达式在JavaScript中可以作为语句使用。
不过,就风格而言,如果您想调用一个过程,那么用if..else编写这个过程就更清楚了:
1 2
| if (x==2) doSomething;
else doSomethingElse |
或者,在你的情况下,
在这条非常非常非常老的线上再加一点……
假设你的e在一个for循环中,需要用三元运算符来计算一个truthy/falsy值的变量,而如果是falsy值,你想要continue—你会遇到一个问题,因为你没有返回表达式,你返回的是一个没有任何值的语句。
这将产生Uncaught SyntaxError: Unexpected token continue。
1 2 3
| for (var i = 0; i < myArray.length; i++) {
myArray[i].value ? alert('yay') : continue;
} |
因此,如果您确实想返回一个语句,并且仍然使用一行代码,虽然乍一看可能有点奇怪,并且可能不遵循严格的语言用法,但是您可以这样做:
1 2 3
| for (var i = 0; i < myArray.length; i++) {
if (myArray[i].value) alert('yay') ; else continue;
} |
- P.S-此代码可能难以阅读或理解,因此它并不总是最佳选择。只是说…:)
从技术上讲,将空值或0,或者只是一些随机值放在那里就可以了(因为您没有使用返回值)。但是,为什么要使用这个构造而不是if构造?当您以这种方式编写代码时,您试图做的事情就不那么明显了,因为您可能会将人们和no op混淆(在您的情况下为空)。
可能是最短的
1 2 3 4 5
| let x=1, y=2;
let dosomething = s=>console.log(s);
x-2||dosomething('x do something');
y-2||dosomething('y do something'); |