如果条件语句,好的做法或不?

一年前,我从经典的OO语言(如Java)转移到JavaScript。 在Java中,绝对不推荐以下代码(甚至不正确):

if(dayNumber = getClickedDayNumber(dayInfo)) { alert("day number found : " + dayNumber); } function getClickedDayNumber(dayInfo) { dayNumber = dayInfo.indexOf("fc-day"); if(dayNumber != -1) //substring found { //normally any calendar month consists of "40" days, so this will definitely pick up its day number. return parseInt(dayInfo.substring(dayNumber+6, dayNumber+8)); } else return false; } 

基本上我只是发现,我可以分配一个variables的值条件语句中的一个值,并立即检查分配的值,如果它是布尔值。

对于一个更安全的赌注,我通常把它分成两行代码,先分配然后检查variables,但是现在我发现了这个,我只是想知道在经验丰富的JavaScript开发人员眼里是否是好的实践?

我不会推荐它。 问题是,它看起来像一个常见的错误,你尝试比较值,但使用单一=而不是===== 。 例如,当你看到这个:

 if (value = someFunction()) { ... } 

你不知道这是他们的意思,或者他们打算写这个:

 if (value == someFunction()) { ... } 

如果你真的想做这个任务,我build议你做一个明确的比较:

 if ((value = someFunction()) === <whatever truthy value you are expecting>) { ... } 

我做了很多次 为了绕过JavaScript警告,我添加了两个parens:

 if ((result = get_something())) { } 

你应该避免它,如果你真的想使用它,写上面的评论,说你在做什么。

我看不出有什么证据certificate这不是好的做法。 是的,这可能看起来像一个错误,但很容易通过明智的评论补救。 举个例子:

 if (x = processorIntensiveFunction()) { // declaration inside if intended alert(x); } 

为什么要允许这个函数第二次运行:

 alert(processorIntensiveFunction()); 

因为第一个版本看起来不好? 我不能同意这个逻辑。

你也可以用Java来做到这一点。 不,这不是一个好习惯。 🙂

(在Javascript中使用===input相等。阅读Crockford关于JS的Good Parts书。)

您也可以在Java中的if语句中进行分配。 一个很好的例子是阅读和写出来的东西:

http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new

代码:

 // Copies src file to dst file. // If the dst file does not exist, it is created void copy(File src, File dst) throws IOException { InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dst); // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } 

有一种情况,当你这样做, while循环。
在阅读文件时,你通常会这样做:

 void readFile(String pathToFile) { // Create a FileInputStream object FileInputStream fileIn = null; try { // Create the FileInputStream fileIn = new FileInputStream(pathToFile); // Create a variable to store the current line's text in String currentLine; // While the file has lines left, read the next line, // store it in the variable and do whatever is in the loop while((currentLine = in.readLine()) != null) { // Print out the current line in the console // (you can do whatever you want with the line. this is just an example) System.out.println(currentLine); } } catch(IOException e) { // Handle exception } finally { try { // Close the FileInputStream fileIn.close(); } catch(IOException e) { // Handle exception } } } 

看看第9行的while -loop。在那里,一个新行被读取并存储在一个variables中,然后循环的内容被运行。 我知道这不是一个if语句,但是我猜while一个while循环也可以包含在你的问题中。

原因是当使用FileInputStream ,每次调用FileInputStream.readLine() ,它都会读取文件中的下一行,所以如果你只用fileIn.readLine() != null没有分配variables,而是调用(currentLine = fileIn.readLine()) != null ,然后从循环内部调用它,你只会得到每一行。

希望你明白,祝你好运!

这不是一个好习惯。 你很快就会对此感到困惑。 它看起来类似于一个常见的错误:滥用“=”和“==”运算符。

你应该把它分成两行代码。 这不仅有助于使代码更清晰,而且将来也容易重构。 想象一下你改变IF条件? 您可能会意外地删除该行,并且您的variables不再获得分配给它的值。

如果您要参考Martin Fowlers的书重构改进现有代码的devise ! 那么有几种情况下,这是很好的做法,例如。 长复杂的条件使用函数或方法调用来断言你的情况:

“动机

程序中最常见的复杂领域之一在于复杂的条件逻辑。 当你编写代码来testing条件,并根据不同的条件做各种事情,你很快就结束了一个相当长的方法。 一种方法的长度本身就是一个难以阅读的因素,但是条件增加了难度。 问题通常在于,条件检查和行动中的代码告诉你发生了什么事情,但是很容易模糊为什么会发生这种情况。

与任何大型代码块一样,可以通过分解代码并用代码块的意图命名的方法调用来代替块代码,从而使您的意图更清晰。 >有条件的情况下,您可以通过为条件部分和每个备选scheme执行此操作而获得进一步的好处。 通过这种方式,您可以突出显示条件,并明确指出您正在分支的内容。 你也强调分支的原因。“

是的,他的答案也适用于Java实现。 尽pipe在示例中它没有将条件函数赋值给一个variables。

我会考虑这更多的一个古老的C风格; 在JavaScript中不是很好的做法,所以你应该避免它。

你可以这样做:

 if (value = /* sic */ some_function()){ use_value(value) }