Год назад я перешел с классических объектно-ориентированных языков, таких как 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;
}
По сути, я только что обнаружил, что могу присвоить переменной значение в операторе условия if и немедленно проверить присвоенное значение, как если бы оно было логическим.
Для большей безопасности я обычно разделяю это на две строки кода, сначала назначаю, а затем проверяю переменную, но теперь, когда я это нашел, мне просто интересно, является ли это хорошей практикой или нет в глазах опытных разработчиков JavaScript?
javascript
Майкл Мао
источник
источник
"The following code is definitely not recommended (or event not correct) in Java..."
Это вообще правильно в JavaScript? Потому что, насколько я понимаю, вы возвращаете целое число (return parseInt(...)
), еслиdayNumber != -1
оно истинно, и логическое значение, если оно ложно.Ответы:
Я бы не рекомендовал это. Проблема в том, что это похоже на обычную ошибку, когда вы пытаетесь сравнить значения, но используете одно
=
вместо==
или===
. Например, когда вы видите это:вы не знаете, хотели ли они это сделать, или они намеревались написать это:
Если вы действительно хотите выполнить задание на месте, я бы также рекомендовал провести явное сравнение:
источник
if (resultArr = myNeedle.exec(myHaystack)) {...}
работает,if ((resultArr = myNeedle.exec(myHaystack)) === true) {...}
но не работает, потому что присвоение resultArr всегда истинно, даже если результат функции - нет. Если кто-нибудь использует эту конструкцию .., не забудьте сначала объявить переменную результата; Использование 'var' в операторе условия if недопустимо.if (!!(value = someFunction()))
, но, как вы сказали, проблема в том, что вы не можете использоватьvar
внутри,if
поэтому вы либо создаете глобал, либо ничего не добиваетесь, поскольку выvalue
все равно должны объявить в отдельной строке. Жаль, мне очень понравилась эта конструкция на C ++.true
только тогда, когда функция возвращаетсяtrue
, но во всех других случаях (включая возвращение массива, строки, числа или нуля) оно оцениваетсяfalse
.Я не вижу доказательств того, что это плохая практика. Да, это может показаться ошибкой, но это легко исправить, если прокомментировать. Взять, к примеру:
Почему этой функции должно быть разрешено запускаться второй раз с:
Потому что первая версия ВЫГЛЯДИТ плохо? Я не могу согласиться с такой логикой.
источник
x = processorItensiveFunction(); if(x) { alert(x); }
if ( ! x = anyFunction() )
это не читается? Это вообще не нуждается в комментариях.if-else
ситуации. Подумайте: если бы исходная информация была верной,if (condition) {...} else if (x = processorIntensiveFunction()) {alert(x)}
ваши предыдущиеx = processorIntensiveFunction();
усилия были бы напраснымиcondition
.Я делал это много раз. Чтобы обойти предупреждение JavaScript, я добавляю две скобки:
Вам следует избегать этого, если вы действительно хотите его использовать, напишите над ним комментарий, рассказывающий, что вы делаете.
источник
if ((a = [1, 2]).length > 0) { console.log(a); }
гдеa
еще нигде не инициализирован, и это действительно сработало (приятно! Значительно упрощает использование регулярного выражения). Верно ли, что мне здесь ничего не нужноvar|const|let
? Вы случайно не знаете, где я могу подробнее прочитать об этом трюке ?Вы можете сделать это и на Java. И нет, это плохая практика. :)
(И используйте
===
в Javascript для типизированного равенства. Прочтите книгу Крокфорда «Хорошие части» по JS.)источник
if (foo = getSomeBoolValue()) { }
Есть один случай, когда вы это делаете с
while
-loops.При чтении файлов вы обычно делаете так:
Посмотрите на
while
-loop в строке 9. Здесь новая строка считывается и сохраняется в переменной, а затем выполняется содержимое цикла. Я знаю, что это неif
заявление, но я думаю, что в ваш вопрос также можно включить цикл while.Причина этого в том, что при использовании a
FileInputStream
каждый раз, когда вы вызываетеFileInputStream.readLine()
, он читает следующую строку в файле, поэтому, если бы вы вызывали его из цикла, простоfileIn.readLine() != null
не назначая переменную, вместо вызова(currentLine = fileIn.readLine()) != null
, а затем вызывали ее из внутри цикла вы получите только каждую вторую строку.Надеюсь, вы понимаете, и удачи!
источник
Вы также можете выполнять присваивания внутри операторов if в Java. Хорошим примером будет чтение и запись чего-либо:
http://www.exampledepot.com/egs/java.io/CopyFile.html?l=new
Код:
источник
Если вы обратитесь к книге Мартина Фаулера « Рефакторинг», улучшающей дизайн существующего кода ! Тогда есть несколько случаев, когда это было бы хорошей практикой, например. длинные сложные условные выражения для использования вызова функции или метода для подтверждения вашего случая:
И да, его ответ также действителен для реализаций Java. В примерах он не назначает условную функцию переменной.
источник
Это не лучшая практика. Вы скоро запутаетесь в этом. Это похоже на обычную ошибку: неправильное использование операторов "=" и "==".
Вы должны разбить его на 2 строки кода. Это не только помогает сделать код более понятным, но и упрощает рефакторинг в будущем. Представьте, что вы меняете условие ЕСЛИ? Вы можете случайно удалить строку, и ваша переменная больше не получит присвоенное ей значение.
источник
Я бы счел это больше стилем C старой школы; это не очень хорошая практика в JavaScript, поэтому вам следует избегать этого.
источник
вы можете сделать что-то вроде этого:
источник
Я приехал сюда из Голанга, где часто можно увидеть что-то вроде
В которой
err
распространяется до этогоif
только блок. Таким образом, вот то, что я делаю в es6, что кажется довольно уродливым, но не делает мои довольно строгие правила eslint жалкими и добивается того же.Дополнительные фигурные скобки определяют новую "лексическую область видимости"? Это означает, что я могу использовать
const
иerr
недоступен для внешнего блока.источник