Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нужно ли ставить ; в JS? (https://javascript.ru/forum/misc/33788-nuzhno-li-stavit-%3B-v-js.html)

Shitbox2 08.12.2012 13:30

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

Ну и в дополнение, какой оптимизатор посоветуете? Есть ли он онлайн?

schmetterling 08.12.2012 13:37

Цитата:

Сообщение от Shitbox2
есть подозрения, что многие оптимизаторы кода заглохнут из-за этого. Опасения оправданы?

Да, те, которые regExp-ами удалят лишние пробелы. Там даже не сами оптимизаторы заглохнут, а ваш код после них.

Ставьте точки с запятой только после тех строк, что не оканчиваются на фигурную закрывающую скобку.

Посоветую Google Closure Compiler.

Gvozd 08.12.2012 13:46

Цитата:

Сообщение от Shitbox2
лично мне удобнее их вовсе не ставить

за неделю написания кода с точками с запятой, легко можно приобрести эту полезную привычку.
А полезная она в первую очередь в плане читаемости и поддерживаемости кода другими программистами.
Именно поэтому все крупные проекты на JS написаны именно с точкой с запятой.
Некоторые проекты обычно идут дальше, и валидируют свой код через JSHINT/JSLINT, что позволяет вычистить код от потенциальных ляпов, и неоднозначных моментов, вплоть стандарта форматирования кода

Shitbox2 08.12.2012 15:37

Не поверите, но навыки форматирования кода я перенял из twitter bootstrap, хотя там JSHINT тоже используется...

dmitriymar 08.12.2012 15:51

Цитата:

Сообщение от Shitbox2
Не поверите, но навыки форматирования кода я перенял из twitter bootstrap, хотя там JSHINT тоже используется...

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

tenshi 08.12.2012 19:19

> многие оптимизаторы кода заглохнут из-за этого. Опасения оправданы?

нет. а вообще - взял бы и проверил.

> А так же интерприиатор тратит время на авторасстановку.

не знаю как интерприиаторы, а интерпретаторы ничем таким не занимаются.

> (function(){ /*код*/ })()

void function(){ /*код*/ }()

> А полезная она в первую очередь в плане читаемости и поддерживаемости кода другими программистами.

никакой особой читаемости оно не добавляет. только лишняя пунктуация.

dmitriymar 08.12.2012 19:23

Цитата:

Сообщение от tenshi
> А так же интерприиатор тратит время на авторасстановку.
не знаю как интерприиаторы, а интерпретаторы ничем таким не занимаются.

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

tenshi 08.12.2012 20:06

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

http://habrahabr.ru/post/136860/

BallsShaped 08.12.2012 20:07

У меня в пятницу как раз была проблема из-за того, что забыл поставить ; после функции. В результате посли сжатия получилось что-то вроде этого:
... = function (){ ... }(function(){ ... })

Причем проблема была в том, что это не вызывало никаких ошибок, просто пропала часть функционала:)

tenshi 08.12.2012 20:19

> У меня в пятницу как раз была проблема из-за того, что забыл поставить ;

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

dmitriymar 08.12.2012 20:35

tenshi,
механизм не важен -интерпретатор здесь абстракция. ключевое -
Цитата:

Сообщение от tenshi
который последовательно анализирует лексемы и на основе их типа - помещает её в ту или иную часть дерева

что соответствует
Цитата:

Сообщение от tenshi
А так же интерприиатор тратит время на авторасстановку.

против чего ты возражал
Цитата:

Сообщение от tenshi
не знаю как интерприиаторы, а интерпретаторы ничем таким не занимаются.


Hoshinokoe 08.12.2012 20:44

Shitbox2,

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

И ответ на ваш вопрос:
"На практике надо ставить везде, ибо все так или иначе сжимают скрипты. И отсутствие точки с запятой может вызвать ошибку в сжатом скрипте, которую крайне сложно найти. "

tenshi 08.12.2012 22:09

> против чего ты возражал

и где ты узрел в моих словах автоподстановку, если в синтаксическое дерево лексема ";" даже не попадает?

> И ответ на ваш вопрос:

это из комментария, а статья о противоположном. и на практике надо выбирать толковые инструменты, а не подстраиваться под кривые.

> И всё же спасенные микросекунды не стоят того, чтобы отказываться от явного разделения конструкций.

переводы строк вполне себе явные и более естественные разделители. попробуй поработать, например, с питоном и поймёшь, что семиколоны - не более чем атавизм

Shitbox2 09.12.2012 14:18

Цитата:

нет, проблема была в том, что ты начал выражение со скобки. не начинай выражения со скобок и не будет у тебя больше никогда таких проблем.
Может быть проще принять такой синтаксис
;(function(){ ... })()
Тогда ; придется ставить лишь в исключительных ситуациях, а не после каждой строки?

Hoshinokoe, спасибо за статью, читаю...

tenshi 09.12.2012 14:23

лучше всё же такой
Цитата:

Сообщение от tenshi (Сообщение 220304)
void function(){ /*код*/ }()


Shitbox2 09.12.2012 14:31

А почему он должен работать? Т.е., если записать
string function(){ return 'str' }()
то ф-я выполнится? Что-то не нашел такого в синтаксисе...

Из статьи
Цитата:

Когда программа встречает токен, недопустимый грамматикой, вставляется ";", если (а) в этом месте присутствует перенос строки
Вот теперь проблема с выражением, начинающимся со скобок (и с новой строки) становится не ясна. Либо оптимизатор не полностью поддерживает стандарт языка.

P.S. По своему опыту знаю, что пропуск точек с запятой мешает автоформатированию в jsfiddle и т.п. средах, что немного угнетает...

tenshi 09.12.2012 15:46

нет такого синтаксиса. просто есть оператор void.

BallsShaped 09.12.2012 19:15

Цитата:

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

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

tenshi 09.12.2012 19:22

какая прелесть)

tenshi 09.12.2012 22:12

> Не вижу ни одной веской причины, почему это обязательно необходимо предпочесть этому

меньше нагромождение скобочек, например

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

как и твоя приязнь. о чём спор?

> new function(){ /*код*/ }

тут создаётся лишний объект

tenshi 10.12.2012 00:48

> пруф или сам знаешь кто

я тебе рассказал как работают парсеры. не веришь - открой исходники и посмотри.

> var q = 1 var w = 11

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

if( false ) ; else alert(1)
if( false ) {} else alert(1)

nerv_ 10.12.2012 01:11

Цитата:

Сообщение от Shitbox2
JS работает и без ; в конце строки и лично мне удобнее их вовсе не ставить, но есть подозрения, что многие оптимизаторы кода заглохнут из-за этого. Опасения оправданы?

точки с запятой - это как бриться по утрам, приводиться себя в порядок. Побрился, вышел на улицу и тебе все деФченки улыбаются :) А не побрился..., фу таким быть :p

vashurin 10.12.2012 08:20

Цитата:

Сообщение от Shitbox2 (Сообщение 220221)
JS работает и без ; в конце строки и лично мне удобнее их вовсе не ставить, но есть подозрения, что многие оптимизаторы кода заглохнут из-за этого. Опасения оправданы?

Ну и в дополнение, какой оптимизатор посоветуете? Есть ли он онлайн?

Заглохнут. Да и понять будет не возможно, что вообще написано.
Вот 2 кода, первый без ";", а второй с ";". Первый не читаемый и не рабочий. Второй читаем и работает.
function A(){
	this.method1 = function(){alert('ok')}
}
var a=new A (function(){alert('ok')})()


function A(){
	this.method1 = function(){alert('ok');}
}
var a=new A; (function(){alert('ok')})();

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

tenshi 10.12.2012 11:23

> точки с запятой - это как бриться по утрам, приводиться себя в порядок. Побрился, вышел на улицу и тебе все деФченки улыбаются А не побрился..., фу таким быть

ну так и побрей свой код от этой щетины ;;;;

> покажи ка замеры тестирования скорости

а у самого ручки отсохли? http://jsperf.com/semicolons

> ответь ка из каких токенов состоит лексема декларации функции, просто я вижу ты разбираешься, а я вот все понять этот момент ни как не могу) не поможешь братишка)?

читай. вникай. развивайся.

> А вот тут ты нам наглядно продемонстрировал что это не просто ни чего не делающий оператор, а именно разделитель выражений

в таком случае {} - тоже всего-лишь разделитель выражений

tenshi 10.12.2012 11:27

Цитата:

Сообщение от vashurin (Сообщение 220589)
Притом первый код я разбил на строки, а так, это был реальный кусок кода, который был вытянут в строку после сжатия какой то программой оптимизации.

ну так не используй эту "какую-то" программу оптимизации.

vashurin 10.12.2012 11:33

Цитата:

Сообщение от tenshi (Сообщение 220602)
ну так не используй эту "какую-то" программу оптимизации.

:) tenshi, вы работали когда нибудь с чужим кодом?
Код был не мой, и сжимал его программой не я (даже не знаю чем вообще его сжимали). Просто будучи фрилансером, однажды разбирал чужой код. Для клиента была тайна, покрытая мраком, почем после оптимизации рабочий код, переставал работать. А автор кода "канул в лету". Оказалась как раз дело в ";".

Хотя, tenshi, лучше не ставьте ";", честное слово, мне больше денег будет . :)

tenshi 10.12.2012 11:39

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


Часовой пояс GMT +3, время: 04:57.