Опустить Semi-Colons-это удобство, которое JavaScript вам предоставляет. JavaScript позволяет вам опустить полуколоны в местах, где они обычно появляются, то есть в конце утверждений или по соглашению перед новым линейным символом.
const foo = "food"; const randomNumber = Math.random()
Который можно переписать как
const foo = "food" const randomNumber = Math.random()
Это стало возможным благодаря автоматическому полуколонковому правилам вставки, включенным в официальную спецификацию ECMASCRIPT.
Это удобство, хотя, если не правильно понято, может представить много сценариев JavaScript Gotcha. Итак, в этой статье я расскажу о том, как работает автоматическая полуколона.
Может быть, не очевидно, что два фрагмента кода, приведенные ниже, дают совершенно разные результаты,
/**/ const val = "foo"; ['semi'] console.log(val) //foo
const foo = {
semi: 'not semi'
}
const val = foo
['semi']
console.log(val) //not semi
Если вам интересно, почему это так, вот что в спецификации Ecmascript 6 говорится о том, как должна работать автоматическая полуколона вставка:
Когда, когда сценарий или модуль проанализируют слева направо, встречается токен (называемый токеном оскорбительного Следующие условия верны:
- Токен оскорбительный отдел отделен от предыдущего токена по крайней мере одним линитором
- Оскорбительный токен}
- Предыдущий токен), и вставленная полуколон будет проанализирована как завершающая полуколон заявления DO WHILE
Я попытался объяснить приведенные выше правила с примером кода ниже
/* Rule 1.1 */
const foo = 'food'
const bar = 'bar' /* Yo, I found token const on a new line, parsing it with the previous line as a single statement doesn't make sense, insert semi-colon before line 3 */
/* Rule 1.2 */
const baz = () => {
const boo = true
return boo } /* Found token }, insert semi-colon before it, parse previous statement */
/* Rule 1.3 */
do {
const GT = foo + 'bar'
} while (baz()) /* Insert semi-colon after closing parentheses, gold could be on the next line for all I care */
Другой способ подвести итог первого правила, – это, –
«Эй, JS Engine, если нет ошибки, проанализирующей код, продолжайте и игнорируйте новую линейную символ. Если есть ошибка разбора, сделайте все эти проверки и вставьте полуколон, где это необходимо ».
Здесь важно отметить, что браузеры не будут вставлять полуколоны в конце строки, если он будет анализ новой строки вместе с предыдущей строкой в качестве единого оператора, все еще приводит к действительному JavaScript. Вернемся к примеру в начале этой статьи:
const foo = {
semi: 'not semi'
}
const bar = foo
['semi']
Хотя ['semi'] находится на новой линии, анализ его вместе с предыдущей строкой все еще приводит к действительному JavaScript. Так что это проанализировано как const ['semi'] , что приводит к «не полу» Опустив полуколоны, разработчики должны заботиться о том, чтобы начать новые линии с этими персонажами:
- [
- (
- +
- /
- –
- {
const one = '1' const two = 1 +one // this is a common technique for converting type 'string' to 'number' console.log(two) // 11
Обычно можно увидеть код, аналогичный примеру ниже в проектах JS, и может не стать сразу очевидным, почему он анализирует как правильную грамматику JavaScript, но это благодаря автоматическому полуколонному вставку, которые мы только что обсудили.
object .childObject .method()
В спецификации также указывается, что,
Когда, когда сценарий или модуль проанализируются слева направо, встречается токен, который разрешается некоторым производством грамматики, но производство является ограниченным производством, и токен будет первым жетоном для терминала или непонцеминального сразу же после следующего. аннотация «[нет линетерминатора здесь]» в пределах ограниченного производства (и, следовательно, такой токен называется ограниченным токеном), а ограниченный токен отделяется от предыдущего токена как минимум одним линейным Ограниченный токен.
Это просто говорит, что ни одна строка не разрывается после определенных токенов (ключевых слов), таких как возврат, перерыв, экспрессия постфикса ( – -, ++), брось и т. Д.
return //semi-colon is automatically inserted here
4 // no
break //semi-colon is automatically inserted here
a //no
continue //semi-colon is automatically inserted here
a = 4
const arr = arr () //semi-colon is automatically inserted here
=> {} // no
...
Я надеюсь, что теперь вы сможете написать JavaScript без полуколонов с большей уверенностью:)
Оригинал: “https://dev.to/promhize/what-you-need-to-know-about-javascripts-automatic-semi-colon-insertion-78a”