Топ контрибуторов
loading
loading
Знаете ли Вы, что

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

Лента обновлений
ссылка 12:09:43
Комментарий от Cowboy1992:
ну а ты в шторме проверь . то что сохраняется это фак...
ссылка 12:04:29
Комментарий от Cowboy1992:
да $var1 = 13 это факт ,но выводим то мы $var2 !
ссылка 10:19:37
Комментарий от llandyll:
Сам вопрос изначально сформулирован так, что подталкива...
ссылка 00:08:40
Комментарий от test1428:
Код рабочий , просто не для школы
ссылка Jul 17 22:41
Комментарий от AkiraSan:
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░▓▓▓▓▓░░░░░░░...
Статистика

Тестов: 153, вопросов: 8595. Пройдено: 437037 / 2145186.

Точки с запятой в JavaScript факультативны (перевод)

head tail Статья
категория
Веб технологии
дата05.11.2013
авторschyzoo
голосов2

Точки с запятой в JavaScript факультативны

Оригинал: Mislav Marohnić
Перевод (вольный): schyzoo@gmail.com, 28.10.2013

JavaScript - это скриптовый язык, где точки с запятой в роли разделителей факультативны, как

фа·куль·та·тив·ный (прилагательное)
Необязательный, предоставляемый на выбор, выбираемый по желанию

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

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

"Спецификация таинственна, а реализации JavaScript различаются"

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

Я пишу код без точек с запятой и, судя по моему опыту, не существует интерпретатора Javascript, который не может с этим справиться.

Вы не можете применить минификатор к JavaScript коду без точек запятой

Существуют три уровня уменьшения размера исходных файлов на JavaScript: компрессия (например, gzip), минификация (т. е. удаление ненужных пробелов и комментариев) и обфускация (изменение кода, укорачивание имен переменные и функций).

Компрессия вроде gzip наиболее проста; она требует лишь единовременную настройку сервера, не требует дополнительных усилий от разработчиков и не изменяет ваш код. Было время, когда IE6 не мог с этим справиться, но если мне не изменяет память, он был пропатчен годы назад и распространен через Windows update, и сегодня никто на этот счет больше не парится.

Минификация и обфускация изменяют ваш код. Это инструменты, которые вы применяете к своему исходному коду, говоря "вот несколько JavaScript файлов, попробуй уменьшить их, но не меняй функциональность". Я неохотно использую эти инструменты, потому что многие разработчики говорят, что есл я не использую определенные техники кодирования, такие как использование точек с запятой, они (инструменты) испортят мой код. Я не имею ничего против людей (сообществ), призывающих меня использовать определенные техники кодирования, но я против таких инструментов.

Допустим, что у меня есть код, который работает во всех реализациях JavaScript, которые я учитываю (основные браузеры и некоторые серверные реализации). Если я пропускаю его через минификатор и он портит мой код, то я, к сожалению, вынужден сказать, что ваш минификатор сломан. Если этот инструмент изменяет JavaScript код, ему следовало бы понимать его, какэ то делал бы настоящий интерпретатор.

Пока мы не закончили с минификацией, давайте устроим реальную поверку. Я взял исходник jQuery и убрал из него все точки с запятой, затем пропустил его через Google Closure Compiler. Итоговый размер был 76.673 байта. Размер оригинального "jquery.min.js" был 76.674 (на 1 байт больше). Теперь вы видите, изменений практически не было; и разумеется, его набор тестов отработал как и прежде.

Как такое возможно? Что ж, взгляните на следующий код:

var a=1
var b=2
var c=3

Там 24 байта. Расставьте везде точки с запятой и пропустите через минификатор:

var a=1;var b=2;var c=3;

Те же 24 байта. Таким образом, добавление точек с запятой и удаление переводов строки сэкономили нам там невероятный ноль байт. Радикально. Большее уменьшение размера после минификации получается не удалением символов перевода строки — это всё благодаря удалению комментариев и начальных отступов.

Дополнение: многие отметили, что их минификаторы переписывают это выражение как var a=1,b=2,c=3. Я в курсе, что некоторые инструменты делают это, но целью этой статьи является освещение того, как точки с запятой соотносятся с пробельными символами. Если минификатор способен переписывать выражения (напр., Closure Compiler), это значит, что он также может автоматически расставлять точки с запятой.

Кроме того, некоторое рекомендуют приучаться использовать фигурные скобки для блоков даже тогда, когда они состоят из одной стоки (из одного предложения - прим. пер.)

// до
if(condition) stuff()

// после
if(condition){
  stuff()
}

// после минификации
if(condition){stuff()}

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

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

  • Ruby — заигрывание с пробелами в выражениях, содержащих операторы и вызовы методов, может поломать код
  • Python — охх
  • HTML — смотрите пояснение о Kangax’s HTML minifier
  • Haml шаблоны

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

Это хороший стиль написания кода

Также знакомое как:

  • Хорошо иметь их для порядка
  • JSLint будет ругаться
  • Дуглас Крокфорд так сказал

Это еще один способ сказать "другие так делают", и так говорят люди в ходе онлайн-дискуссий в (довольно распостраненном) случае дефицита аргументов.

Мой совет по поводу JSLint: не используйте его. Зачем вам это делать? Если вы поверили, что он помогает вам иметь меньше багов в вашем коде, вот вам горячая новость; только люди могут обнаруживать и устранять программные баги, не инструменты. Так что вместо инструментов найдите больше людей, которые будут смотреть на ваш код.

Дуглас Крокфорд также говорит "четыре пробела", только большинство популярных JavaScript библиотек написаны с использованием табуляций или двойных пробелов. Сообщества при различных проектах различны, и так и должно быть. Как я уже говорил ранее: позвольте людям и себе самим определять стиль написания кода, а не какому-то отдельному человеку или инструменту.

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

Что касается стилей кодирования, они существуют для того, чтобы код было удобнее читать и проще понимать группе людей, ответственных за его разработку. Поразмыслите, могли бы точки с запятой на самом деле улучшить читабельность вашего кода. Больше всего ее улучшат начальные отступы, пустые строки для разделения блоков, пробелы для отбивки выражений и грамотное именование переменных и функций. Посмотрите на один обфусцированный код; в нем есть некоторое количество точек с запятой. Способствуют ли они понятности? Нет, но что действительно могло бы помочь, так это множество пробелов и оригинальных имен переменных.

"Вставка точек с запятой аукается в предложениях return"

Когда я искал "JavaScript точка с запятой вставка", то нашел следующую наиболее часто упоминаемую в блогах проблему:

function add() {
  var a = 1, b = 2
  return
    a + b
}

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

return;
  a + b;

Увы, эта функция не возвращает сумму, которую мы ожидали! Но знаете что? Эта проблема не решается добавление точки запятой после вашего любимого return выражения (т. е., после a + b). Она решается удалением перевода строки после слова return:

return a + b

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

Единственная реальная ловушка, при кодировании без точек с запятой

Вот единственная вещь, о который вы должны быть знать, если решили писать код без точек с запятой:

// осторожно: испортится
a = b + c
(d + e).print()

Фактически, это вычислится следующим образом:

a = b + c(d + e).print();

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

Простое решение: когда строка начинается с открывающейся круглой скобки, поставьте перед ней (скобкой) точку с запятой.

;(d + e).print()

Это может быть не слишком элегантно, зато свою задачу выполняет. Michaeljohn Clement развивает мысль еще дальше:

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

Примите этот совет как правило, и все будет в порядке.

Для закрепление материалы рекомендуем к прохождению тесты:
Тест знаний JavaScript - Основы
Тест знаний JavaScript - Средний уровень

Если Вам понравилась статья, проголосуйте за нее

Голосов: 2  loading...
djnaumov   kulick86