Один из советов для инструмента jslint :
++ и -
Операторы ++ (увеличение) и - (уменьшение), как известно, вносят свой вклад в плохой код, поощряя чрезмерную хитрость. Они уступают только неисправной архитектуре в плане защиты от вирусов и других угроз безопасности. Существует опция plusplus, которая запрещает использование этих операторов.
Я знаю, что подобные конструкции PHP $foo[$bar++]
могут легко привести к ошибкам, но я не мог найти лучшего способа управления циклом, чем while( a < 10 ) do { /* foo */ a++; }
или for (var i=0; i<10; i++) { /* foo */ }
.
Подсвечивает ли jslint их, потому что есть некоторые похожие языки, в которых отсутствует синтаксис « ++
» и « --
» или они обрабатываются по-разному, или есть другие причины для избежания « ++
» и « --
», которые я мог бы пропустить?
++
не вызывает ошибок. Использование++
«хитрых» способов может привести к ошибкам, особенно если кодовую базу обслуживает несколько человек, но это не проблема для оператора, это проблема для программиста. Я не изучал JS в университете (потому что он еще не существовал), но что с того? Я сделал C, который, конечно, был++
первым, но он также получает "и что?" Я не учился в университете, чтобы изучать конкретный язык, я пошел изучать хорошие практики программирования, которые я могу применить к любому языку.Ответы:
На мой взгляд, всегда использовать ++ и - сами по себе в одной строке, как в:
вместо
Все, что за этим, может запутать некоторых программистов, и, на мой взгляд, оно того не стоит. Циклы for являются исключением, поскольку использование оператора приращения идиоматично и, следовательно, всегда понятно.
источник
i
переменная впоследствии станет составным классом, и в этом случае вы будете без необходимости создавать временный объект. Я считаю, что оператор postfix более эстетичен.Я откровенно смущен этим советом. Часть меня задается вопросом, связано ли это с недостатком опыта (воспринимаемого или действительного) с кодировщиками JavaScript.
Я вижу, как кто-то, просто «взломавший» какой-то пример кода, может совершить невинную ошибку с ++ и -, но я не понимаю, почему опытный профессионал мог бы их избежать.
источник
++
выражение в более запутанном выражении, в котором ++ отличается от x ++, приводит к чему-то непростому для чтения. Идея Крокфорда не в том, могу ли я это сделать? это о том, как я могу избежать ошибок?В С есть история таких вещей:
чтобы скопировать строку, возможно, это источник чрезмерного обмана, на который он ссылается.
И всегда есть вопрос о том, что
или
на самом деле Это определено в некоторых языках, а в других нет гарантии, что произойдет.
Помимо этих примеров, я не думаю, что есть что-то более идиоматическое, чем цикл for, который использует
++
приращение. В некоторых случаях вы можете избежать цикла foreach или цикла while, который проверяет другое условие. Но искажать код, чтобы попытаться избежать приращения, смешно.источник
x = a+++b
->x = (a++)+b
->x = a + b; a++
. Токенизатор жадный.Если вы прочитаете JavaScript The Good Parts, вы увидите, что замена Крокфорда для i ++ в цикле for - это i + = 1 (не i = i + 1). Это довольно чисто и читабельно, и с меньшей вероятностью превратится во что-то «хитрое».
Крокфорд сделал запрещая автоинкрементный и autodecrement в опции в JSLint. Вы выбираете, следовать ли совету или нет.
Мое личное правило - не делать ничего в сочетании с автоинкрементом или автообращением.
Из многолетнего опыта в Си я узнал, что я не получаю переполнения буфера (или индекса массива за пределами границ), если я буду использовать его просто. Но я обнаружил, что переполнение буфера действительно происходит, если я впадаю в «чрезмерно хитрую» практику выполнения других вещей в одном и том же утверждении.
Так что, для моих собственных правил, использование i ++ в качестве приращения в цикле for хорошо.
источник
В цикле это безвредно, но в операторе присваивания это может привести к неожиданным результатам:
Пробел между переменной и оператором также может привести к неожиданным результатам:
В заключение неожиданные результаты также могут быть проблемой:
И это вызывает автоматическую вставку точки с запятой после новой строки:
Ссылки
источник
==
потому что вы не понимаете разницу между==
и===
.a: 2 b: 0 c: 1
. Я не вижу ничего странного или неожиданного в первом примере («оператор присваивания»).Рассмотрим следующий код
так как i ++ оценивается дважды, вывод получен (из отладчика vs2005)
Теперь рассмотрим следующий код:
Обратите внимание, что вывод одинаков. Теперь вы можете подумать, что ++ i и i ++ - это одно и то же. Они не
Наконец, рассмотрим этот код
Выход сейчас:
Так что они не одинаковы, смешивание обоих приводит к не столь интуитивному поведению. Я думаю, что для циклов нормально с ++, но будьте осторожны, когда у вас есть несколько символов ++ в одной строке или той же инструкции
источник
Природа «до» и «после» операторов приращения и убывания может сбивать с толку тех, кто с ними не знаком; это один из способов, которым они могут быть хитрыми.
источник
С моей точки зрения, «явное всегда лучше, чем неявное». Потому что в какой-то момент вы можете запутаться с этим оператором приращений
y+ = x++ + ++y
. Хороший программист всегда делает свой код более читабельным.источник
Наиболее важным обоснованием для избежания ++ или - является то, что операторы возвращают значения и вызывают побочные эффекты в одно и то же время, что усложняет анализ кода.
Ради эффективности я предпочитаю:
Я фанат мистера Крокфорда, но в этом случае я не согласен.
++i
на 25% меньше текста для разбора, чемi+=1
и, возможно, яснее.источник
Я смотрел видео Дугласа Крокфорда об этом, и его объяснение того, что не используется приращение и уменьшение, состоит в том, что
Во-первых, массивы в JavaScript имеют динамический размер, поэтому, извините, если я ошибаюсь, невозможно выйти за границы массива и получить доступ к данным, к которым не следует обращаться с помощью этого метода в JavaScript.
Во-вторых, должны ли мы избегать сложных вещей, конечно, проблема не в том, что у нас есть эта возможность, а в том, что есть разработчики, которые утверждают, что делают JavaScript, но не знают, как работают эти операторы? Это достаточно просто. значение ++, укажите текущее значение и после выражения добавьте к нему единицу, значение ++, увеличьте значение перед тем, как передать его.
Выражения, такие как +++ ++ b, просты для понимания, если вы просто помните выше.
Я полагаю, вы просто должны вспомнить, кто должен читать код, если у вас есть команда, которая знает JS наизнанку, вам не нужно беспокоиться. Если нет, то прокомментируйте, напишите по-другому и т. Д. Делайте то, что вы должны делать. Я не думаю, что инкремент и декремент по своей сути плох, генерируют ошибки или создают уязвимости, возможно, просто менее читабельны, в зависимости от вашей аудитории.
Кстати, я думаю, что Дуглас Крокфорд в любом случае легенда, но я думаю, что он сильно напугал оператора, который этого не заслуживал.
Я живу, чтобы оказаться неправым, хотя ...
источник
Другой пример, более простой, чем некоторые другие, с простым возвратом приращенного значения:
Как вы можете видеть, после оператора return не следует использовать постинкремент / декремент, если вы хотите, чтобы этот оператор влиял на результат. Но return не «ловит» операторы постинкрементного увеличения / уменьшения:
источник
Я думаю, что программисты должны быть компетентными в языке, который они используют; используйте это ясно; и используйте это хорошо. Я не думаю, что они должны искусственно калечить язык, который они используют. Я говорю из опыта. Однажды я работал буквально по соседству с магазином Cobol, где они не использовали ELSE «потому что это было слишком сложно». Reductio ad absurdam.
источник
Как упоминалось в некоторых существующих ответах (что, к сожалению, я не могу комментировать), проблема в том, что x ++ ++ x оценивает разные значения (до и после приращения), что неочевидно и может привести к путанице - если это значение используется. cdmckay предлагает весьма разумно разрешить использование оператора приращения, но только таким образом, чтобы возвращаемое значение не использовалось, например, в отдельной строке. Я бы также включил стандартное использование в цикл for (но только в третьем операторе, возвращаемое значение которого не используется). Я не могу придумать другой пример. Будучи «сожженным» сам, я бы порекомендовал такое же руководство и для других языков.
Я не согласен с утверждением, что эта чрезмерная строгость вызвана неопытностью многих программистов на JS. Это именно тот тип письма, который типичен для «чрезмерно умных» программистов, и я уверен, что он гораздо чаще встречается на более традиционных языках и у разработчиков JS, имеющих опыт работы с такими языками.
источник
По моему опыту, ++ i или i ++ никогда не вызывали путаницы, кроме как при первом знакомстве с работой оператора. Это важно для самых базовых циклов и циклов while, которые преподаются в любой школе или колледже на языках, где вы можете использовать оператор. Лично я считаю, что делать что-то наподобие того, что написано ниже, лучше и читать, чем что-то, когда ++ находится на отдельной строке.
В конце концов, это предпочтение стиля, а не что-то более, что более важно, что когда вы делаете это в своем коде, вы остаетесь последовательными, так что другие, работающие над одним и тем же кодом, могут следовать и не должны обрабатывать одну и ту же функциональность разными способами. ,
Кроме того, Крокфорд, кажется, использует i- = 1, что, на мой взгляд, труднее читать, чем --i или i--
источник
Мой 2cents заключается в том, что их следует избегать в двух случаях:
1) Если у вас есть переменная, которая используется во многих строках, и вы увеличиваете / уменьшаете ее в первом операторе, который ее использует (или последний, или, что еще хуже, в середине):
В подобных примерах вы можете легко пропустить, что переменная автоматически увеличивается / уменьшается, или даже удалить первый оператор. Другими словами, используйте его только в очень коротких блоках или там, где переменная появляется в блоке только на паре операторов close.
2) В случае нескольких ++ и - примерно одной переменной в одном выражении. Очень сложно вспомнить, что происходит в таких случаях:
Экзамены и профессиональные тесты требуют примеров, подобных приведенным выше, и я действительно наткнулся на этот вопрос, когда искал документацию по одному из них, но в реальной жизни не следует заставлять так много думать об одной строке кода.
источник
Является ли Фортран С-подобным языком? У него нет ни ++, ни -. Вот как вы пишете цикл :
Элемент индекса i увеличивается по правилам языка каждый раз в цикле. Если вы хотите увеличить на что-то, отличное от 1, считать в обратном порядке на два, например, синтаксис ...
Является ли Python C-подобным? Он использует определения диапазона и списка и другие синтаксисы, чтобы обойти необходимость увеличения индекса:
Таким образом, основываясь на этом элементарном исследовании ровно двух альтернатив, разработчики языка могут избежать ++ и - предвидя варианты использования и предоставляя альтернативный синтаксис.
Являются ли Фортран и Питон заметно менее сильной ошибкой, чем процедурные языки с ++ и -? У меня нет доказательств.
Я утверждаю, что Фортран и Питон похожи на С, потому что я никогда не встречал человека, свободно владеющего Си, который не мог бы с 90% точностью угадать намерение не скрытого Фортрана или Питона.
источник