如果条件语句,好的做法或不?
一年前,我从经典的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) }