2016-01-17 5 views
5

Я попытался найти хорошие ресурсы в пустой записи, но кажется, что ничего не появляется. Даже на MDN, им нечего сказать об этом.В чем смысл использования пустой инструкции в JavaScript?

т.е:

for(var i = 0; i < a.length; a[i++] = 0); 

if((a==0) || (b == 0)); 

Я хотел бы знать, что некоторые реальные примеры, которые следует использовать пустые заявления по их проекту. В чем причина этого?

+5

Позвольте мне процитировать комментарий кода чуть выше цикла for: '// Назначить все значения массива 0' – Aprillion

+0

Это полезно для [code golf] (http://codegolf.stackexchange.com). Например, это экономит 2 байта, потому что вам не нужен блок кода, заключенный в скобки '{}': 'for (a = 0; a ++ <100; b = a, c = b + a);' – insertusernamehere

ответ

2

Примеры, которые вы указали, не имеют большого смысла. Лучше написали

for (var i = 0; i < a.length;) a[i++] = 0; 
for (var i = 0; i < a.length; i++) a[i] = 0; 
; // the comparisons really don't do anything (assuming a and b are no objects) 
(a==0) || (b = 0); // Oh wait, that's the one given by @Shomz 
if (a != 0) b = 0; 

Однако для пустой инструкции существуют приложения реального мира. Я просто перечислю 3, которые приходят на ум:

  • function x() { 
        … 
    }; 
    

    точкой с запятой, где она не принадлежит (например, после того, как функции декларации выше) делает пустое заявление.

  • ; 
    … 
    

    leading semicolon on your script files помогает защититься от багги включений или конкатенации файлов.

  • while (!check_for_finish()); // do nothing 
    

    Пустого тело цикла может быть использован для занятых ожидающих петель (не рекомендуется) и подобными.

2

нет/ленив. нет абсолютно никакой разницы

for(var i = 0; i < a.length;) a[i++] = 0; 

и просто минимальная разница

for(var i = 0; i < a.length; i++) a[i] = 0; 

первый один является несколько мс быстрее после нескольких миллиардов шагов итерации; ака. преждевременная оптимизация

EDIT:

if((a==0) || (b == 0)); 

это не имеет никакого смысла, так как он ничего не делает.

но как

как выражения
a==0 || (b=0); 

//or maybe sth like this: 

//var noop =()=>void 0; //FYI 

typeof a === "function" || (a = noop); 

довольно полезен для меня, так как они короткие, и читаемые и дополнительные Условного оператор не добавляет никакого значения для удобства чтения и понимания (по крайней мере, когда вы знаете, это шаблон).

+3

Вы протестировали Это? Я уверен, что это не быстрее. – Bergi

+0

Да, это потому, что в 'a [i ++] = 0' i ++ (приращение и получение значения i) обрабатываются как одна команда, а в' a [i] = 0; i ++; 'они два; но, как я сказал, преждевременная оптимизация. Каждая функция-вызов или деоптимизированная функция и многое другое более эффективно влияет на производительность, чем эта оптимизация. – Thomas

+0

Что означает «инструкция»? Вы не можете просто подсчитать токены JS. – Bergi

1

Первый, очевидно, проходит через массив и присваивает все значения нулю, без кода, указанного в инструкции.

Другой выглядит как опечатка, потому что это бесполезно.

Однако, что-то вроде

if((a==0) || (b = 0)); 

будет иметь смысл, как это было бы присвоить b к нулю в случае a не равен нулю.

var a = 1, b = 1; 
 
if((a == 0) || (b = 0)); 
 

 
alert("a: " + a + ", b: " + b);

+0

У вас есть странное определение 'make sense' -' if (a === 0) b = 0; 'или даже' b = (a === 0? 0: b) 'оба более читаемы IMO – Aprillion

+0

Очевидно, что нет рекомендуемая практика или что-то, что я предлагаю, или что-то, что я бы написал, но ** ответ на вопрос **. Есть назначения в условных выражениях, вероятно, больше, чем вы ожидаете увидеть. Придумывание более читаемых вариаций было бы неуместным и утомительным здесь. Сосредоточьтесь на вопросе. – Shomz

+0

, пожалуйста, позвольте мне добавить акцент на вопрос OP: «реальные примеры того, что один ** должен ** использовать пустые утверждения» – Aprillion

1

Я не думаю, что они действительно полезны, но я могу ошибаться. Можно попытаться использовать побочные эффекты оценки условий в if, но я не вижу веских оснований для этого.

0

Первый пример for(var i = 0; i < a.length; a[i++] = 0); полезно ИМО, и причины будут:

  • Дать меньше без ущерба для читаемости.
  • красота!
  • Рассказывать людям: Эй, я про JS-кодер. :)

Второй if((a==0) || (b == 0)); кажется, не имеет ничего.

0

Предположим, у вас есть две функции X и Y и давайте предположим, что Y должны быть выполнены только тогда, когда X возвращается true, в такой ситуации вы будете писать:

if(X() && Y()); 
+1

Нет. Вы должны написать 'if (X()) Y();' (или 'X() && Y();'). Нет пустой инструкции. – Bergi

+1

Почему не 'X() && Y()'? – Oriol

1

Мой любимый использование потому что он должен ждать, пока условие станет истинным.

while (!condition); 
// do what happens once your condition is met 

Это приятно читать, на мой взгляд, но то же самое можно сделать с { } вместо пустого оператора.

Смежные вопросы