Чому недавній перехід на видалення / опущення крапки з комою з Javascript?


79

Здається, останнім часом модно опускати крапки з комою з Javascript. Кілька років тому була публікація в блозі, в якій підкреслювалося, що в Javascript крапки з комою необов’язкові, а суть публікації, здавалося, не повинна турбуватися з ними, оскільки вони непотрібні. Повідомлення, яке широко цитується, не дає жодних вагомих причин не використовувати їх, лише те, що їх відмовитися, має мало побічних ефектів.

Навіть GitHub стрибнув на смужку без крапки з комою, вимагаючи їх опущення в будь-якому внутрішньо розробленому коді, і нещодавнє зобов'язання проекту zepto.js його технічним обслуговувачем видалило з кодової бази всі крапки з комою. Його основними виправданнями були:

  • це питання переваги його команди;
  • менше набирати текст

Чи є інші вагомі причини, щоб залишити їх поза межами?

Відверто кажучи, я не бачу причин їх опускати, і, звичайно, немає причин повертатися за кодом, щоб стерти їх. Це також суперечить рекомендованій практиці ( років ) , для якої я не купую аргумент «культового культу». Отже, чому всі останні крапки з комою-ненавистю? Чи не вистачає нестачі? Або це лише остання пристрасть Javascript?


2
"роки рекомендованої практики" відносять питання про тег опитувань, проведених у чорному списку, що навряд чи робить його авторитетним підтримувати будь-яку думку
gnat

24
@gnat тільки тому, що люди ненавидять, що питання, що знаходиться на SO, не робить його менш вагомим джерелом думки людей.
Рятхал

3
@gnat Питання, які "офіційно вважаються непридатними в StackOverflow" , іноді експертною спільнотою вважають дуже авторитетними. Сумно але правда.
MarkJ

4
@gnat У запитанні до чорного списку насправді є дуже цікаві приклади того, чому опускання ;може зламати ваш код. Тому я б сказав, що це корисна посилання на це питання.
Андрес Ф.

1
Це може бути пов'язане зі зростанням популярності хіпстерів на початку 2010-х.
Олексій

Відповіді:


61

Я припускаю, що моя причина найпізніша: я програмую занадто багато різних мов одночасно (Java, Javascript, PHP) - для цього потрібні ';' тож ніж тренувати мої пальці та очі, що ';' не потрібен для javascript, я завжди завжди додаю ';'

Інша причина - це документація: додавши ";" Я прямо заявляю собі, де очікую закінчення заяви. Потім знову використовую {} теж весь час.

Весь аргумент підрахунку байтів я вважаю дратівливим і безглуздим:

1) для загальних бібліотек, таких як jquery: використовуйте google CDN, і бібліотека, ймовірно, вже буде в кеші браузера

2) версії власних бібліотек і встановити їх для кешування назавжди.

3) gzip та мінімізувати, якщо це справді, справді необхідно.

Дійсно, скільки сайтів мають найбільшу вузьку швидкість завантаження свого JavaScript? Якщо ви працюєте на топ-100 веб-сайтів, таких як Twitter, Google, Yahoo тощо. Решта з нас повинні просто перейматися якістю коду, а не крапками з релігійними війнами.


3
Я здогадуюсь і навпаки. Оскільки python стає все більш популярним для Інтернету, простіше зробити JS схожим на python.
Бен ДеМотт

4
Спробуйте, але тоді ті самі байтові воїни будуть за мною за непотрібним пробілом на початку рядків. (Я хотів би також мати Javascript помилки , тому що я б покладатися на правила відступу Python, а не з допомогою {}
Pat

6
Якщо важливо зменшити кількість байтів, у вас з’явиться щось, що максимально мінімізує файли. Якщо ще не варто використовувати мінімізатор, то не варто турбуватися про видалення ';' щоб заощадити на кількості байтів.
Lawtonfogle

3
кількість байтів насправді не обов'язково зменшується, адже насправді її можна збільшити, оскільки новий рядок часто (не завжди) є насправді двома символами (новий рядок з подальшим поверненням каретки), тому в найбільш простороефективному вигляді новий рядок буде колись символом таким же, як і двокрапка з двома символами (якщо ви зіставите весь JS-код в одному рядку, що часто робиться для розгорнутого коду JS, а не вихідного коду розробки).
ALXGTV

Люди потребують відступів, щоб зрозуміти глибоке гніздування, яке вимагає більше байтів, ніж крапки з комою. Напівколони відволікають відходи натискань на клавіші.
Cees Timmerman

39

Це полегшує ланцюжок методів і робить чистішими чисті

Тож скажімо, я про jQuerying і маю

$('some fancy selector')
  .addClass()
  .attr();

Якщо я хочу додати матеріал і зробити так, щоб мій текст на основі рядків був малим , я повинен додати його вище attr. Тож це одна думка довше, ніж просто "додати в кінці". А хто хоче думати? =)

$('some fancy selector')
  .addClass()
  // new method calls must go here
  .attr();

Але, коли я скидаю напівколонки, я можу просто додати і назвати це за день

  $('some fancy selector')
    .addClass()
    .attr()
+   .animate()
+   .click()

Крім того, якщо я вирішу виконувати останній метод, мені не доведеться перепризначати напівкрапку та знову забруднювати свою комісію.

  $('some fancy selector')
    .addClass()
    .attr()
    .animate()
-   .click()

На відміну від угго

  $('some fancy selector')
    .addClass()
    .attr()
+   .animate();
-   .animate()
-   .click();

37
Це випадок використання ніші IMO.
JBRWilkinson

9
Але цікаво все-таки.
Джонатан

8
Ви можете мати крапку з комою в кінці нового рядка з відступом як початкову лінію. Потім ви копіюєте та упорядковуєте речі за своїм бажанням. Це також красиво закриває ланцюг.
Nux

11
Чи просто я задаюся питанням, чому хтось не піклується про те, як виглядають акуратні відмінності їхніх зобов'язань? як правило, люди читають код, а не розрізняються.
Жуль

11
@Jules, чистіша різниця означає, що злиття мають більше шансів на успіх.
joeytwiddle

22

напівколонки в JavaScript необов’язкові

Моя особиста причина не використання напівколонок - OCD.

Коли я використовую напівколонки, я забуваю 2% з них і доводиться постійно перевіряти / додавати їх.

Коли я не використовую напівколонки, я ніколи випадково не кладу їх, тому мені ніколи не потрібно перевіряти / видаляти їх.


3
Хороший. Мене спалили крапкою з двома крапками або двома у файлі, який не є належним кольором.
Джонатан

3
Є парсери (наприклад, GeSHi), які не будуть правильно розбирати ваш код, якщо крапки з комою немає. Можна сказати, що люди не будуть робити таких помилок ... Але серйозно - подія, якщо всій вашій команді вдасться запам’ятати, куди потрібно поставити крапки з комою, ви дійсно думаєте, що вони згадають це без ранкової кави? І вони будуть кодувати в багатьох станах розуму. Будьте впевнені в цьому.
Nux

16

Нещодавно я написав аналізатор / аналізатор для JavaScript, де мені довелося ретельно реалізовувати ASI, а також на своїй книжковій полиці є моя копія JavaScript Крокфорда : Хороші частини , котрий прихильники завжди використовують крапки з комою. Намір був хорошим, але це не завжди допомагає на практиці.

Очевидно, що люди, що пишуть рамки, такі як jQuery, zepto тощо, є майстрами синтаксису JavaScript, і тому вони знають різницю між:

return
{
    status: true
};

і

return {
    status: true
};

JavaScript, хоча і потужний, також є мовою для початківців, і удача пояснює це тому, хто тільки вивчає, що таке forцикл. Як і ознайомлення більшості людей з новим вмінням, є кілька складніших речей, які ви не хочете пояснювати відразу, тому натомість ви вирішите прищепити віру вантажному культу певним речам лише для того, щоб збити їх із землі. Таким чином, у вас є два варіанти викладання початківця, як писати JavaScript:

  1. Скажіть їм: "дотримуйтесь цього правила і не запитуйте чому", кажучи їм завжди класти крапку з комою в кінці кожного рядка. На жаль, це не допомагає у наведеному вище прикладі чи будь-якому іншому прикладі, коли ASI заважає. І програвач-містер або пані-початківець збивається з пантелику, коли код вище не працює.
  2. Скажіть їм: "дотримуйтесь цих двох правил і не запитуйте, чому", кажучи їм не турбуватися крапками з комою в кінці кожного рядка, а натомість завжди a) Дотримуйтесь returnз a {і b) Коли рядок починається з a (, додайте це з a ;.

Вибір варіанту 2 - це кращий набір правил "культового культу", яких слід дотримуватися (це призведе до дуже мало помилок, пов'язаних з ASI), і навіть якщо ви глибоко розумієте тему, у вас менше небажаних символів на екрані.


8
Гаразд, я кусаю. Допоможіть мені зрозуміти різницю синтаксису між двома наведеними вище прикладами. Моє непідготовлене око бачить лише різницю у форматуванні.
Джессі К. Слікер

9
Або, з іншого боку, я наткнувся на відповідь у випадковій випадковості. У першому прикладі значення returnвважається одиночним твердженням, а рядок - еквівалентом крапки з комою. Другий приклад фактично повертає об’єкт. Хитрість.
Джессі К. Слікер

9
Я не думаю, що я можу погодитися з думкою, що JavaScript - мова для початківців, у JavaScript є безліч невідповідностей та сюрпризних ефектів, які не мають простих пояснень. Мова для початківців IMO не була б такою, я б назвав JavaScript проміжною мовою.
Рятхал

2
@Ryathal Я розумію, до чого ти стикаєшся, але називаючи це проміжною мовою, змушує мене замислитися, на яких мовах він взаємодіє. Ви робите це звуком так, ніби це крок на шляху до чогось іншого, а не до місця призначення.
Рахіт

9
Уточнювальна точка: returnприклад насправді є винятком із звичайної поведінки JS, яка полягає у спробі звести лінії разом, якщо пропущено напівколону. return, breakі continueвсі проявляють цю виняткову поведінку, в якій останній рядок завжди трактується як кінець висловлювання. (Джерело - "JavaScript: остаточний посібник" Фланагана, стор. 25-26). Особисто я прагну до ідеї "коду найменшого сюрпризу". Залишання напівколонок, як правило, призводить до більше сюрпризів, ніж будь-що інше (я, як правило, також тримаю фігурні дужки навіть для простих заяв).
Кайл

16

Немає такого перевантаження інформацією, лише поганий дизайн.

- Едвард Туфте

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

Менше візуальних елементів на екрані означає менше роботи для нашого мозку для аналізу фактичної корисної інформації.

let foo = 1

vs.

let /* variable */ foo = 1; // EOL

Звичайно, перебільшений приклад, але він ілюструє загальний принцип: Додаткові візуальні елементи слід додавати лише тоді, якщо вони служать цілі. Отже, чи служать крапки з комою?

Історичні причини використання крапки з комою в JavaScript були:

  • Зберігайте схожість з C / Java
  • Уникайте проблем із сумісністю із погано написаними браузерами та інструментами
  • Допомагаючи людям і машинам виявляти помилки коду
  • Автоматична вставка з крапкою з комою несе пенальті за продуктивність

Проблеми сумісності сьогодні майже не є проблемою. Сучасні вкладиші можуть так само добре виявляти будь-які помилки коду без крапки з комою. Подібність C / Java / PHP все ще може бути увагою (див. Прийняту відповідь Пат), але тільки те, що інші мови містять зайві синтаксичні елементи, не означає, що ми повинні зберігати їх у JavaScript, тим більше, що багато інших мов (Coffeescript, Python, Рубі, Скала, Луа) їх не вимагають.

Я зробив швидкий тест, щоб переконатися, чи є покарання продуктивності у V8. Це Io.js розбирає JavaScript-файл у розмірі 41 Мб (повторюється Лодаш 100 разів) крапками з комою, а потім видаляється крапкою з комою:

$ time node lodashx100.js
node lodashx100.js  2.34s user 1.30s system 99% cpu 3.664 total
$ time node lodashx100s.js
node lodashx100s.js  2.34s user 1.15s system 99% cpu 3.521 total

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


Я би заперечував проти цього аргументу про те, щоб залишити непотрібні елементи в навантаженні, яке зараз має робити розум, щоб додати його в необов'язковий синтаксис. Тепер крапка з комою не є величезною ментальною напругою, якщо її опустити. Це питання, з яким я стикався з Ruby та Scala. Коли це стає ланцюжком дзвінків із дзвінками всередині дзвінків, і всі вони опущені у кожного батька, це тягар, що розривається.
Сеамус

8

Вибір конвенції програмування фактично такий же, як і вибір підмножини цільової мови. Ми все це робимо з звичайних причин: читабельність коду, ремонтопридатність, стабільність, портативність тощо - при цьому потенційно жертвуючи гнучкістю. Ці причини є справжніми діловими причинами.

Такі причини, як "збереження натискань клавіш" та "програмісти повинні вивчити правила JavaScript", є незначними діловими причинами, тому вони не мають невеликої практичної ваги.

У моєму випадку мені потрібно було швидко швидко працювати в JavaScript, тому використання обмеженого набору мов було моєю перевагою. Тож я вибрав підмножину JSLint JavaScript, увімкнув додатки Rockstar JSLinter в Eclipse до самих обмежувальних налаштувань, на які я міг стояти, і не оглядався назад.

Я вдячний, що зможу уникнути деталей різниці між "==" та "===", або деталями вставлення крапки з комою, тому що у мене вже є миль високий список завдань, і ці деталі не будуть допоможіть виконати ці завдання на секунду раніше.

Звичайно, найважливішим у конвенції є послідовність, і мислення про неї як про підмножину мови допомагає посилити цей імператив. І хоча це може не допомогти відповісти на питання ОП, я думаю, що це може допомогти в практичному обрамленні цього питання.


5

Досить старе питання, проте я дивуюсь, що ніхто не згадав:

Мінімізація. Якщо вам трапляється змішувати фрагмент JavaScript, який не закінчує явно символи з комою з двокрапкою, можливо, вам важко намагатися з’ясувати, що не так з фрагментом, який працював перед зміною і зараз не працює.

Неоднозначність: напівколонки необов’язкові, правдиві, однак, усунувши їх із вихідного коду, ви можете залишити кілька неоднозначних сценаріїв аналізатору, щоб вирішити самостійно. Якщо ви пишете 100 рядків коду для інтернет-магазину, так, можливо, це не має значення, але більш серйозні завдання вимагатимуть 100% ясності.

Давно я прочитав дуже приємну аналогію про щось інше, але це дуже правда і в цьому випадку: (У нашому випадку) Усунення напівколонок - це як переправа на червоне світло. Зрештою, у вас може бути гаразд, або вас може вдарити вантажівка.

Чому в наші дні він стає популярнішим?

Я особисто вважаю, що запуск JavaScript на сервері мав багато наслідків для самої спільноти JavaScript. У нашому випадку, очевидно, ніхто не збирається мінімізувати JavaScript на стороні сервера (оскільки вихідний код не повинен надсилатися до веб-браузера клієнта), тому відсутність напівколонок виглядає набагато безпечніше, що правда; однак інші розробники, які навчаються з цих книг, статей та відео, вони, на жаль, відкидають той факт, що JavaScript на стороні сервера не зовсім такий, як JavaScript на стороні клієнта.


Мініфішери можуть залишати в однозначних новинках або вставляти напівколонки, коли напівколонки відсутні без штрафу за розмір. Я не знаю, які (якщо такі є) мініфієри роблять це. Небезпека все ще існує принаймні в деяких з них, тому ваша думка все-таки дотримується на практиці.
outis

3

Є вагомі причини утримувати їх.

Вони насправді необов’язкові, JS може додавати їх назад із автоматичною вставкою з комою, коли вони відсутні, але це не те саме.

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

JSLint не схвалює.


3

JavaScript не потребував напівколонок для припинення висловлювань протягом більше десяти років. Це тому, що символи нового рядка вважаються термінаторами висловлювань (я вважаю, що це також згадується в ранніх специфікаціях ECMAScript). Це дійсно має багато сенсу, тим більше, що насправді немає вагомих причин [про що я знаю], чому JavaScript потребує частого використання напівколонок, але не інших інтерпретованих декларативних мов, таких як Ruby або Python.

Вимагання напівколонок може полегшити написання аналізатора для мови, але якщо кожен перекладач там підтримує пропуск напівколонок, то в чому саме справа?

Що зводиться до того, наскільки знаючий програміст: якщо ви знаєте, що можете опустити напівкрапку, сміливо робіть це, розуміючи, що це може бути, а може і не бути наслідком. Людина є машиною для прийняття рішень, і майже всі рішення вимагають певного компромісу або компромісу. Компроміс із просто киданням напівколонок навколо вашого коду (навіть у місцях, де вони не потрібні) полягає в тому, що ваш код стає менш читаючим (залежно від того, кого ви запитуєте), а JSLint не поскаржиться (кого це хвилює ). З іншого боку, компроміс із пропусканням напівколонок полягає в тому, що 90% програмістів JavaScript будуть вас за це карати, але ви, можливо, отримаєте насолоду від того, щоб писати більше JavaScript через нього.

Що вам краще звучить; прийняття обґрунтованих рішень або сліпе прийняття рішень / стад-менталітет?


Мені було б цікаво дізнатись, чому це отримало зворотний зв'язок. JavaScript не потребує напівколонок для припинення операторів; він, безумовно, може їх використовувати, але вони аж ніяк не є вимогою. Якби вони були потрібні, тоді б чужі пояснення не спрацювали. Це свідчить про факт (так, факт), що ви можете написати цілу програму JavaScript з кількома точками без крапки з комою. Крім того, я не бачу, як розуміння того, як працює інструмент, і використання власних міркувань для прийняття рішень якимось чином не викликає сумнівів на відміну від «просто роби це». Ось що відоме як релігія.
Ворон

Я не заявив, але проблема може полягати в тому, що це фактично неправильно, як написано. Нові рядки не вважаються термінаторами тверджень у JavaScript. Ви можете залишити крапки з комою через функцію, яку називають автоматичною вставкою крапки з комою, яка дозволяє їй автоматично виправляти помилки розбору в певних обставинах. Люди, які виступають за крапку з комою, стверджують, що багато програмістів javascript, здається, погано розуміють це правило. Здається, ваш пост є аргументом на їх користь. (Справедливо кажучи, я здебільшого погоджуюся з вашою тезою, але з різних причин)
Тім Сегуїн,

@TimSeguine Так, я написав це ще до того, як я краще зрозумів. Я все ще не думаю, що об'єктивно неправильно не використовувати крапки з комою до тих пір, поки люди, які роблять це, розуміють, що саме це роблять. Я повинен переробити свою посаду або, можливо, позбутися її, оскільки достатньо інших прислухалися до цього. Дякую за ввічливу критику! :)
Ravenstine

2

У мене є дві теорії:

А)

Річ у цьому виборі полягає в тому, що тоді, коли застосовувались JSLint тощо, ви вирішили витратити велику кількість часу на лову незрозумілих помилок синтаксису або розумну кількість часу, застосовуючи стандартну політику щодо коду.

Однак, коли ми рухаємося до коду Unit Test -driven та безперервної інтеграції, час (і взаємодія людини), необхідний для виявлення синтаксичної помилки, значно зменшився. Відгуки від тестів швидко вкажуть, чи працює ваш код, як очікувалося, задовго до того, як він наблизиться до кінцевого споживача, так навіщо витрачати час на додавання необов'язкового багатослів’я?

Б)

Ледачі програмісти зроблять усе, щоб полегшити власне життя за короткий термін. Менше набрати -> менше зусиль -> простіше. (також, якщо не потрібно робити крапку з комою, ви уникнете напруження кільця пальця правої руки, уникаючи деякої RSIness).

(NB: Я не погоджуюся з ідеєю пропустити щось, що роз'єднує твердження).


1
jshint все ще є важливим інструментом.
Райнос

Що стосується \n;\n
розрізнення

2
@Raynos Насправді я виявив, що JSLint, як правило, трохи марний зі складністю деяких рамково-важких кодів, з якими часто працюю. Плюс,; \ n і \ n не однакові за будь-яких обставин , інакше ніколи не буде потреби в.
Ед Джеймс

7
jslint марний, але jshint - це інший інструмент.
Райнос

0

Я їх не залишаю, але я змінюю правила, коли їх вставляти.

Правила, якими користується більшість людей, є

  • Перед закінченням кожного рядка
  • За винятком того, що рядок закінчується }випискою з функції оператора
  • Але лише оператор функції, а не присвоєння функції буквально

Моє правило: На початку кожного рядка, починаючи з вступного дужки / дужки.

Шахта простіша, тому легше стежити і менш схильна до помилок. Крім того, невелика кількість крапки з комою полегшує пошук помилок, видалених.


Ще один аргумент полягає в тому, що сумнозвісна return\nvalueпомилка походить від того, що не знає про ASI. Моє правило змушує вас знати про ASI, тому люди, які використовують моє правило, рідше потрапляють у пастку цієї помилки.


0

Кількість байтів Розумієте, зловмисники зазвичай так намагаються вписатись в один рядок коду. Технічно кажучи, це не було б можливим без напівколонок. Я припускаю, що це скоріше міра безпеки, ніж просто програмна вимога. Так чи інакше, це значно зменшило б XSS, коли воно стане вимогою, а не пропозицією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.