После прочтения «Шаблонов JavaScript»: «JavaScript: хорошие детали» Дугласа Крокфорда и «Столбцы JavaScript» Стояна Стеванова, я пытаюсь точно определить, что означает «чрезмерная хитрость». Они оба говорят, что это происходит при использовании либо ++
, либо --
в вашем коде, но не может найти фирменное определение для этого термина, либо внутри SO, либо через поиск Google. Есть идеи?Что такое «чрезмерная хитрость»?
ответ
Вы можете услышать это от самого здесь Crockford: http://www.youtube.com/watch?feature=player_detailpage&v=47Ceot8yqeI#t=4140s
Простой ответ заключается в том, что ++
и --
действуют на переменную, и обычно делают это в то же время, как вы делаете что-то еще, чтобы этой переменной. Например, можете ли вы быстро решить, что это делает?
y += x++ + ++y; // what is y now?
Мора StackOverflow обсуждение: Why avoid increment ("++") and decrement ("--") operators in JavaScript?
Я не знаю о вас, но могу сразу сказать, что это сохраняет код в индексе 1. И я использую Python 80% времени, этот язык даже не * имеют * post/pre-increment/-decrement. Являются ли разработчики JS неспособными запомнить совершенно простой смысл этих операторов? Не то, что побочные эффекты в * сложных выражениях * не путают. Но ваш пример кажется мне очень довольным. И многие разработчики на C и C++, похоже, отлично справляются с этими операторами, несмотря на то, что их использование на C и C++ было еще сложнее из-за потенциала неопределенного поведения. – delnan
Извините, это надуманный пример. Как насчет 'y + = x ++ + ++ y'? – Interrobang
Это действительно сложно, я предлагаю вам использовать это вместо этого. Обратите внимание, что вышеупомянутые разработчики C и C++ согласятся, что это feindish (только отчасти потому, что это неопределенное поведение на их языках). – delnan
Речь идет о маленьких трюках, которые встроены. Например, avar++
является псевдонимом для avar = avar + 1
.
JavaScript заполнен операторами и другими вещами, облегчающими программирование, но это всего лишь трюки. Вероятно, это он.
Кроме того, как Джонатан отметил: Why avoid increment ("++") and decrement ("--") operators in JavaScript?
... кроме того, что 'var' является зарезервированным словом. ;-) – PPvG
Nitpicking ... ;-) –
'avar ++' is ** не ** псевдоним для 'avar = avar = avar + 1', в контексте выражений. '++ avar' есть. Preincrement изменяет значение переменной, но оценивает предыдущее значение. Может быть, Crockford * is * right ... – delnan
Чрезмерное trickiness субъективно. Из-за этого нет четкого определения.
Некоторые скажут, что C код строковой копии (while (*p++ = *q++);
) является чрезмерно сложным, некоторые говорят, что это не так.
Вот довольно продолжительное обсуждение со ссылками:
Why avoid increment ("++") and decrement ("--") operators in JavaScript?
Я думаю, что часть этой идеи в том, что при использовании этих операторов в любом месте, но с единственная переменная на одной строке, они становятся запутанными для всех, кто не находится в голове разработчика.
Вот довольно продолжительная дискуссия со ссылками: http://stackoverflow.com/questions/971312/why-avoid-increment-and-decrement-operators-in-javascript – Jonathan
Здесь много замечательных ответов, и я получаю это сейчас. Спасибо за помощь всем! – kaidez