Атипичное использование для операторов JavaScript и - Javascript
Если я правильно помню из "Javascript: The Good Parts" Крокфорда, он не одобряет использование операторов ++ или -, но я также склоняюсь к тому, что он не дает особо веских аргументов против них.
Ниже приведено использование этих операторов, которые я нашел полезными для того, чтобы мой код был как можно более кратким, особенно когда имеешь дело с функциями / методами, которые возвращают -1, когда 0 является первым возможным допустимым возвращаемым значением (вместе с положительными целыми числами). Меня заинтересуют другие нетипичные способы использования ++ и / или - которые дают веские аргументы в пользу использования этих операторов, когда они имеют смысл.
Я не считаю это дубликатом Почему в JavaScript не используются операторы увеличения ("++") и уменьшения ("-")? скорее это следствие: когда не избегать их, а использовать их в своих интересах. Конечно, я могу ошибаться, и по какой-то причине я не думаю о том, почему следующее чревато опасностью, несмотря на то, что мне кажется изящным - если я упускаю что-то неоптимальное в следующем, я хотел бы знать это тоже
var substrIdx = str.indexOf(substr);
if (++substrIdx) {
doSomething(--substrIdx);
}
4 ответа
Если я упускаю что-то неоптимальное в следующем, я бы тоже хотел это знать
var substrIdx = str.indexOf(substr); if (++substrIdx) { doSomething(--substrIdx); }
Это неоптимально. Это сбивает с толку людей, требует отправки большего количества кода через браузер и требует, чтобы интерпретатор выполнял больше работы во время выполнения.
Кто-то пытается выяснить, что это такое, должен подумать о состоянии substrIdx
в разных точках кода - "он подчиняется договору indexOf
здесь, но там это больше, чем контракт indexOf
и после if
это не имеет четкого отношения к substr
.".
Это также дольше, чем
var substrIdx = str.indexOf(substr);
if (substrIdx>=0) {
doSomething(substrIdx);
}
миниферам сложнее минимизировать, потому что substrIdx
больше не единственное назначение var
, Хороший минификатор превратит последний в нечто вроде
var substrIdx = str.indexOf(substr);
substrIdx<0||doSomething(substrIdx);
но меньше будет делать работу с ненужным назначением. Они сравниваются довольно хорошо при закрытии компилятора:
var a=str.indexOf(substr);++a&&doSomething(--a)
против
var a=str.indexOf(substr);a>=0&&doSomething(a)
потому что закрытие компилятора упускает возможность включить a>=0&&
в a<0||
но увеличение и уменьшение все еще длиннее.
Краткость - это не то же самое, что читабельность или ремонтопригодность, а элегантность - в глазах сопровождающего. Код, который вы разместили, кажется мне излишне непрозрачным.
За последние пару десятилетий я разработал интенсивное отвращение к коду, которое не сразу очевидно, даже если очевидный метод требует немного больше кода. Неявный и магический код почти всегда менее удобен в обслуживании, если в миксе более одного человека.
Конкретный комментарий: я не понимаю, почему вы считаете свой код более кратким, элегантным или читабельным, чем:
var substrIdx = str.indexOf(substr);
if (substrIdx >= 0) {
doSomething(substrIdx);
}
Это также немного менее эффективно, потому что вы выполняете две операции и сравнение вместо простого сравнения. Кроме того, вы неправильно трактуете целое число как логическое значение, что почти всегда является плохой идеей с точки зрения обслуживания.
Наконец, как упоминалось ниже, вы мешаете минимизаторам Javascript, и с точки зрения краткости в конце, единственное, что беспокоит пользователя - это как быстро загружается страница...
Ну, это, безусловно, "нетипично". Это также "умный". В "мальчике" я надеюсь, что мне никогда не придется поддерживать код, написанный как"вена"умного".
Код должен быть читабельным. Мы тратим гораздо больше времени на чтение кода, чем на его написание. Это не так
Единственный случай, который я считаю приемлемым, - это когда результат приращения не сохраняется, поэтому не имеет значения, будет ли он до или после приращения и не будет источником ошибок.
var j=0;
// These three examples are OK in my mind
for (var i=0; i < 20; i++) {
doSomething()
}
while ( i < 100) {
if (someTest()) {
j++;
}
i++;
}