Атипичное использование для операторов JavaScript и - Javascript - PullRequest
4 голосов
/ 09 ноября 2011

Если я правильно помню из «Javascript: The Good Parts» Крокфорда, он не в пользу использования операторов ++ или -, но я также склонен напоминать, что он не предоставляет Особенно сильный аргумент против них.

Ниже приведено использование этих операторов, которые я считаю полезными для того, чтобы мой код был максимально сжатым, особенно когда имеешь дело с функциями / методами, которые возвращают -1, когда 0 является первым возможным допустимым возвращаемым значением (вместе с положительными целыми числами) , Меня заинтересуют другие нетипичные способы использования ++ и / или - которые дают веские аргументы в пользу использования этих операторов, когда они имеют смысл.

Я не считаю это дубликатом Зачем избегать операций увеличения ("++") и уменьшения ("-") в JavaScript? , а скорее это следствие: когда не избегайте их, а используйте их в своих интересах. Конечно, я могу ошибаться, и по какой-то причине я не думаю о том, почему следующее чревато опасностью, несмотря на то, что мне кажется изящным - если я упускаю что-то неоптимальное в следующем, я хотел бы знать это тоже

var substrIdx = str.indexOf(substr);
if (++substrIdx) {
  doSomething(--substrIdx);
}

Ответы [ 4 ]

5 голосов
/ 09 ноября 2011

Краткость - это не то же самое, что читабельность или ремонтопригодность, а элегантность - в глазах сопровождающего. Код, который вы разместили, кажется мне излишне непрозрачным.

За последние пару десятилетий я разработал интенсивное отвращение к коду, которое не сразу очевидно, даже если очевидный метод требует немного больше кода. Неявный и магический код почти всегда менее удобен в обслуживании, если в миксе более одного человека.

Конкретный комментарий: я не понимаю, почему вы считаете свой код более лаконичным, элегантным или читабельным, чем:

var substrIdx = str.indexOf(substr);
if (substrIdx >= 0) {
  doSomething(substrIdx);
}

Это также немного менее эффективно, потому что вы выполняете две операции и сравнение, а не просто сравнение. Кроме того, вы неправильно трактуете целое число как логическое значение, что почти всегда является плохой идеей с точки зрения обслуживания.

Наконец, как уже упоминалось ниже, вы мешаете минимизаторам Javascript, и с точки зрения краткости в конце, единственное, что беспокоит пользователя, - это скорость загрузки страницы ...

4 голосов
/ 09 ноября 2011

Если я упускаю что-то неоптимальное в следующем, я бы тоже хотел это знать

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||, но приращение и уменьшение все еще длиннее.

2 голосов
/ 09 ноября 2011

Ну, это точно " нетипично ". Это также " умный ". В " boy, я надеюсь, мне никогда не придется поддерживать код, написанный таким образом " вен " умный ".

Код должен быть читабельным. Мы тратим намного больше времени на чтение кода, чем на его написание. Это не так.

0 голосов
/ 09 ноября 2011

Единственный случай, который я считаю приемлемым, - это когда результат приращения не сохраняется, поэтому не имеет значения, будет ли он до или после приращения и не будет источником ошибок.

 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++;
 }
...