Фигурные скобки javascript: javascript — Для чего нужны фигурные скобки при обявлении переменной?

Квантификатор {} фигурные скобки в регулярных выражениях — efim360.ru

 

В этой публикации мы рассмотрим такой вид префикса квантификатора (QuantifierPrefix) для шаблона (Pattern) регулярного выражения (RegExp), который обозначается фигурными скобками. В стандарте ECMAScript описаны три способа производства префикса квантификатора с фигурными скобками:

Производство префикса QuantifierPrefix :: { DecimalDigits } оценивается следующим образом:

1. Пусть i будет MV (mathematical value) из Десятичных Цифр (см. 12.8.3).
2. Верните два результата i и i.

 

Производство префикса QuantifierPrefix :: { DecimalDigits , } оценивается следующим образом:

1. Пусть i будет MV (mathematical value) из Десятичных Цифр (см.  12.8.3).
2. Верните два результата 
i
и +∞.

 

Производство префикса QuantifierPrefix :: { DecimalDigits , DecimalDigits } оценивается следующим образом:

1. Пусть i будет MV (mathematical value) первой из десятичных цифр DecimalDigits.
2. Пусть j будет MV (mathematical value) второй из десятичных цифр DecimalDigits.
3. Верните два результата i и j.

Рассмотрим их отдельно.

 

Префикс Квантификатора —

{ DecimalDigits }

Видео

Этот синтаксис предполагает заполнение фигурных скобок одним целым числом.

Как это работает? Целое число указывает на количество повторений символа в последовательности по которому будет происходить сопоставление.

Есть строка:

var stroka = "eeefffiiimmm"

Мы хотим сопоставить строку по шаблону, который найдёт два подряд символа «f«. Мы бы могли записать это так:

/ff/

Префикс квантификатора фигурных скобок с одним целым числом даёт нам возможность указать какое количество раз будет сопоставлен символ в шаблоне регулярного выражения. То есть мы теперь можем записать так:

/f{2}/

Пример из консоли браузера:

/ff/.exec(stroka)
["ff", index: 3, input: "eeefffiiimmm", groups: undefined]
/f{2}/.exec(stroka)
["ff", index: 3, input: "eeefffiiimmm", groups: undefined]

Скриншот выводов:

Идентичное сопоставление обычной дизъюнкции и префикса квантификатора с фигурными скобками и одним целым числом — JavaScript

Оба варианта записи дают нам идентичный результат. Но мы «вешали» префикс квантификатора на один символ. А как он будет работать с последовательностью символов?

 

Пример. Есть другая строка:

var stroka = "eeefifififimmm"

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

/fififi/

С префиксом, по логике, регулярное выражение должно выглядеть так:

/fi{3}/

Пример из консоли браузера:

/fififi/.exec(stroka)
["fififi", index: 3, input: "eeefifififimmm", groups: undefined]
/fi{3}/.exec(stroka)
null

Но мы получим null, потому что префикс квантификатора сработает только по соседнему левому одному символу «

i«. В результате шаблон примет вид «fiii«. В нашей строке такой последовательности символов нет, а значит метод exec() вернёт нам null.

 

Чтобы мы могли решить задачу так, как запланировали, нам нужно обернуть последовательность символов «fi» в круглые скобки:

/(fi){3}/

После этого мы получим нужный нам результат:

var stroka = "eeefifififimmm"
stroka.replace(/(fi){3}/,"")
"eeefimmm"

Мы воспользовались Атомом (Atom) для шаблона регулярного выражения. Его производство выглядит описано ниже.

Производство Atom :: (

GroupSpecifier Disjunction ) оценивается следующим образом:

1. Оцените Дизъюнкцию (Disjunction) с аргументом direction, чтобы получить Сопоставитель Matcher m.
2. Пусть parenIndex будет числом скобок с левым захватом во всем регулярном выражении, которое встречается слева от этого Атома Atom. Это общее количество узлов синтаксического анализа Атома Atom :: ( GroupSpecifier Disjunction ), предшествующих или включающих этот Атом Atom. 
3. Верните новый Сопоставитель Matcher с параметрами (x, c), который фиксирует направление direction, m и parenIndex и при вызове выполняет следующие шаги:
   а. Утверждено: x - это Состояние (State).
   b. Утверждено: c - это Продолжение (Continuation).
   c. Пусть 
d
будет новым Продолжением с параметрами (y), которое захватывает x, c, direction и parenIndex и при вызове выполняет следующие шаги: i. Утверждено: y - это Состояние (State). ii. Пусть cap будет копией Списка y из captures. iii. Пусть xe будет endIndex для x. iv. Пусть ye будет endIndex из у. v. Если direction = 1, тогда 1. Утверждено: xeye. 2. Пусть s будет Списком, элементы которого являются символами Input с индексами от xe (включительно) до ye (исключая). vi. Иначе, 1. Утверждено: направление direction равен -1. 2. Утверждено: yexe. 3. Пусть
s
будет Списком, элементы которого являются символами Input с индексами от ye (включительно) до xe (исключая). vii. Установите cap[parenIndex + 1] в s. viii. Пусть z будет Состоянием (ye, cap). ix. Верните c(z). d. Верните m(x, d).

GroupSpecifier у нас пустой, а Дизъюнкция(Disjunction) содержит последовательность символов «fi«. Только в сочетании «(fi){3}» последовательность символов «fi» будет умножена на 3 и «преобразована» в нужную нам «fififi«.

 

Префикс Квантификатора —

{ DecimalDigits , }

Видео

Этот синтаксис предполагает заполнение

фигурных скобок одним целым числом и запятой. Как это работает? Первое целое число указывает на минимальное количество повторений символа в последовательности. Запятая и скобка обозначает бесконечное количество повторений символа в последовательности. Сопоставляется диапазон.

Есть строка:

var stroka = "eeefffiiimmm"

Есть регулярное выражение вида:

/f{1,}/

Результат сопоставления найдёт первую возможную последовательность до бесконечности повторения символа «f«. Проверим на замене методом replace()

stroka.replace(/f{1,}/,"")
"eeeiiimmm"

Будет найдена самая длинная последовательность символов «f» и заменена.

Эквивалент бесконечности повторения одного символа подряд — JavaScript

 

Видео

Этот синтаксис предполагает заполнение фигурных скобок одним целым числом одной запятой и одним целым числом. Как это работает? Первое целое число указывает на минимальное количество повторений символа в последовательности. Второе целое число указывает на максимальное количество повторений символа в последовательности. Сопоставляется диапазон.

Есть строка:

var stroka = "eeefffiiimmm"

Есть регулярное выражение вида:

/f{1,3}/

Такая запись найдёт те места в строке слева-направо, где будут последовательно расположены один или три символа «f«.

stroka.replace(/f{1,3}/,"")
"eeeiiimmm"

В итоге мы получим строку без символов «

f«, потому что в строке символ встречается три раза, а это подпадает под условие.

 

Другой пример:

"ef-X-eeff-X-eeefff-X-eeeeffff".replace(/f{2,4}/,"")
"ef-X-ee-X-eeefff-X-eeeeffff"

Сопоставление сработает один раз т. к. нет  никаких флагов. Слева направо первым встречается один символ «f«. Он не попадает под условие префикса квантификатора т.к. символ один, а не два.

Вторым встречается два подряд символа «f«. Это попадает под условие. Происходит замена. Остальные последовательности с символом «f» остаются на своих местах т.к. метод замены уже отработал с регулярным выражением.

Замена от двух до четырёх повторений символа по строке единожды слева-направо — JavaScript

 

Другой пример:

"ef-X-eeff-X-eeefff-X-eeeeffff".replace(/f{3,4}/
g
,"") "ef-X-eeff-X-eee-X-eeee"

В этом примере диапазон повторений символа «f» от 3 до 4 раз подряд. Шаблон регулярного выражения сопоставляется ГЛОБАЛЬНО по всей строке т. к. установлен флаг «g» для регулярного выражения. После первого найденного сопоставления будет продолжено по остаткам строки.

Замена трёх-четырёх повторений символа глобально по строке — JavaScript

Пример работы префикса квантификатора с дизъюнкцией из двух символов:

"efi-X-eefifi-X-eeefififi-X-eeeefifififi".replace(/(fi){3,4}/,"")
"efi-X-eefifi-X-eee-X-eeeefifififi"
"efi-X-eefifi-X-eeefififi-X-eeeefifififi".replace(/(fi){3,4}/g,"")
"efi-X-eefifi-X-eee-X-eeee"

Скрин из браузера

Работа префикса квантификатора диапазона с последовательностью символов

 

Информационные ссылки

JavaScript | Квантификаторы *(звёздочка), +(плюс), ?(вопрос)

ECMAScript | Квантификатор (Quantifier) | Регулярные выражения (Regular Expression)

JavaScript | Как экранировать круглую скобку в регулярных выражениях?

Стандарт ECMAScript — Раздел «22.2.2.3 Disjunction» — https://tc39. es/ecma262/#sec-disjunction

ECMAScript | Атом (Atom) | Регулярные выражения (Regular Expression)

Упрощенный синтаксис функций | Основы JavaScript

Для перемещения по курсу нужно зарегистрироваться

1. Введение ↳ теория

2. Hello, World! ↳ теория / тесты / упражнение

3. Инструкции ↳ теория / тесты / упражнение

4. Арифметические операции ↳ теория / тесты / упражнение

5. Ошибки оформления (синтаксиса и линтера) ↳ теория / тесты / упражнение

6. Строки ↳ теория / тесты / упражнение

7. Переменные ↳ теория / тесты / упражнение

8. Выражения в определениях ↳ теория / тесты / упражнение

9. Именование ↳ теория / тесты / упражнение

10. Интерполяция ↳ теория / тесты / упражнение

11. Извлечение символов из строки ↳ теория / тесты / упражнение

12. Типы данных ↳ теория / тесты / упражнение

13. Неизменяемость и примитивные типы ↳ теория / тесты / упражнение

14. Функции и их вызов ↳ теория / тесты / упражнение

15. Сигнатура функции ↳ теория / тесты / упражнение

16. Вызов функции — выражение ↳ теория / тесты / упражнение

17. Функции с переменным числом параметров ↳ теория / тесты / упражнение

18. Детерминированность ↳ теория / тесты / упражнение

19. Стандартная библиотека ↳ теория / тесты / упражнение

20. Свойства и методы ↳ теория / тесты / упражнение

21. Цепочка вызовов ↳ теория / тесты / упражнение

22. Определение функций ↳ теория / тесты / упражнение

23. Возврат значений ↳ теория / тесты / упражнение

24. Параметры функций ↳ теория / тесты / упражнение

25. Необязательные параметры функций ↳ теория / тесты / упражнение

26. Упрощенный синтаксис функций ↳ теория / тесты / упражнение

27. Логика ↳ теория / тесты / упражнение

28. Логические операторы ↳ теория / тесты / упражнение

29. Результат логических операций ↳ теория / тесты / упражнение

30. Условные конструкции ↳ теория / тесты / упражнение

31. Тернарный оператор ↳ теория / тесты / упражнение

32. Конструкция Switch ↳ теория / тесты / упражнение

33. Цикл while ↳ теория / тесты / упражнение

34. Агрегация данных ↳ теория / тесты / упражнение

35. Обход строк в цикле ↳ теория / тесты / упражнение

36. Условия внутри тела цикла ↳ теория / тесты / упражнение

37. Инкремент и декремент ↳ теория / тесты / упражнение

38. Цикл for ↳ теория / тесты / упражнение

39. Модули ↳ теория / тесты / упражнение

Порой обучение продвигается с трудом. Сложная теория, непонятные задания… Хочется бросить. Не сдавайтесь, все сложности можно преодолеть. Рассказываем, как

Не понятна формулировка, нашли опечатку?

Выделите текст, нажмите ctrl + enter и опишите проблему, затем отправьте нам. В течение нескольких дней мы улучшим формулировку или исправим опечатку

Что-то не получается в уроке?

Загляните в раздел «Обсуждение»:

  1. Изучите вопросы, которые задавали по уроку другие студенты — возможно, ответ на ваш уже есть
  2. Если вопросы остались, задайте свой. Расскажите, что непонятно или сложно, дайте ссылку на ваше решение. Обратите внимание — команда поддержки не отвечает на вопросы по коду, но поможет разобраться с заданием или выводом тестов
  3. Мы отвечаем на сообщения в течение 2-3 дней. К «Обсуждениям» могут подключаться и другие студенты. Возможно, получится решить вопрос быстрее!

Подробнее о том, как задавать вопросы по уроку

404: Страница не найдена

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

Что я могу сделать сейчас?

Если вы впервые посещаете TechTarget, добро пожаловать! Извините за обстоятельства, при которых мы встречаемся. Вот куда вы можете пойти отсюда:

Поиск
  • Узнайте последние новости.
  • Наша домашняя страница содержит самую свежую информацию о Java-разработке.
  • Наша страница «О нас» содержит дополнительную информацию о сайте, на котором вы находитесь, TheServerSide. com.
  • Если вам нужно, свяжитесь с нами, мы будем рады услышать от вас.

Просмотр по категории

SearchAppArchitecture

  • Почему контрактное тестирование может быть необходимо для микросервисов

    Разработчики сталкиваются с многочисленными проблемами, пытаясь выполнить традиционное сквозное интеграционное тестирование микросервисов. Контракт …

  • Растущая роль разработчиков, ориентированных на данные

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

  • 12 рекомендаций по безопасности API для защиты вашего бизнеса

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

ПоискSoftwareQuality

  • Чтобы безопасность API была успешной, разработчикам нужны интегрированные инструменты

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

  • Документация по API может улучшить или испортить опыт разработчиков

    На конференции API World на этой неделе эксперты освещают проблемы, связанные с плохой документацией API, и предлагают способы их устранения, например отказ от …

  • Разработчики хотят повышения производительности и эффективности в Java 20

    Java 20, вероятно, будет включать полезные функции, такие как улучшения параллелизма и профилирования, но добавочные обновления …

SearchCloudComputing

  • С помощью этого руководства настройте базовый рабочий процесс AWS Batch

    AWS Batch позволяет разработчикам запускать тысячи пакетов в AWS. Следуйте этому руководству, чтобы настроить этот сервис, создать свой собственный…

  • Партнеры Oracle теперь могут продавать Oracle Cloud как свои собственные

    Alloy, новая инфраструктурная платформа, позволяет партнерам и аффилированным с Oracle предприятиям перепродавать OCI клиентам в регулируемых . ..

  • Dell добавляет Project Frontier для периферии, расширяет гиперконвергентную инфраструктуру с помощью Azure

    На этой неделе Dell представила новости на отдельных мероприятиях — одно из которых демонстрировало программное обеспечение для управления периферийными устройствами, другое — углубление гиперконвергентной инфраструктуры …

ПоискБезопасность

  • Гигиена безопасности и управление позой требуют новых инструментов

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

  • Оборудование для включения в набор компьютерных криминалистических инструментов

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

  • Советы начинающим компьютерным криминалистам

    Для тех, кто хочет стать следователем компьютерной криминалистики, узнайте о карьере и о том, чего ожидать, а также почему …

ПоискAWS

  • AWS Control Tower стремится упростить управление несколькими учетными записями

    Многие организации изо всех сил пытаются управлять своей огромной коллекцией учетных записей AWS, но Control Tower может помочь. Услуга автоматизирует…

  • Разбираем модель ценообразования Amazon EKS

    В модели ценообразования Amazon EKS есть несколько важных переменных. Покопайтесь в цифрах, чтобы убедиться, что вы развернули службу…

  • Сравните EKS и самоуправляемый Kubernetes на AWS Пользователи

    AWS сталкиваются с выбором при развертывании Kubernetes: запустить его самостоятельно на EC2 или позволить Amazon выполнить тяжелую работу с помощью EKS. См…

Фигурные скобки. Зачем нужны фигурные скобки в JavaScript

Фигурные скобки в JavaScript и C

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

После того, как я написал JavaScript и большую часть дня переключился на C#, первое, о чем я начал думать, это что происходит с фигурными скобками.

В JavaScript фигурные скобки начинаются на той же строке, что и оператор. В C# есть разрыв строки.

Проблема

 // JS
if(somethingIsTrue){ // <= фигурная скобка на той же строке
   //сделай что-нибудь...
 }
//С#
если (что-то верно)
 { // <= фигурная скобка на новой строке
   //сделай что-нибудь...
 } 

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

Оказывается, это не так, и причина в том, чего я не ожидал.

JavaScript

Во-первых, давайте взглянем на правильно написанный код JavaScript.

 //JS
функция сделать что-то () {
   возвращаться{
      имя: 'Волк',
      профессия: «Крутой код-блогер»,
      SpiritAnimal: 'Pabst Blue Ribbon'
   }
}
сделай что-нибудь()
// возвращает {
      имя: 'Волк',
      профессия: «Крутой код-блогер»,
      SpiritAnimal: 'Pabst Blue Ribbon'
   } . ..как и ожидалось 

Теперь предположим, что мы разработчик C# и пишем JavaScript (невероятно распространенное явление).

Мы добавим наши фигурные скобки на новую строку, как в C# (я это все время вижу…).

 //JS, но с '{' в новой строке
функция сделать что-то()
  {
   возвращаться
   {
      имя: 'Волк',
      профессия: «Крутой блоггер по коду»,
      SpiritAnimal: 'Pabst Blue Ribbon'
   }
}
сделай что-нибудь()
// возвращает `Undefined` 

Что?

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

И это хуже, чем вы можете себе представить...

Решение

На самом деле это вызвано совершенно другим спором.

Это происходит из-за ASI компилятора JavaScript или автоматической вставки точки с запятой.

Это звучит совершенно безумно, но я объясню.

Пожалуйста, воздержитесь от смертельных угроз, когда я говорю это, но ТРЕБУЕТСЯ точка с запятой в JavaScript.

Если поискать в Stack Overflow и Reddit, а также в огромном сообществе JS, вы увидите, что разработчики убивают других разработчиков из-за этого.

Вы можете быть разработчиком типа «не ставить точку с запятой в моем коде никогда не повредит мне», и это нормально, но вам повезло. Добавление точки с запятой к ASI в компиляторе может привести к ошибкам, которые практически невозможно исправить. Мы обсудим это в ближайшее время.

Компилятор JS будет добавлять точки с запятой для вас... иногда.

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

  1. Перед разрывом строки, когда за разрывом строки следует ключевое слово «var», «let» или «const».

     let a = 1 // <= точка с запятой вставляется автоматически
    let b = 2 // <= точка с запятой вставляется автоматически 
  2. После ключевого слова-терминатора, такого как «возврат», «продолжить», «разрыв» или «бросок», если за этим ключевым словом в той же строке ничего не следует.
 если (что-то верно)
{
   return // <= точка с запятой вставляется автоматически
  {
    theThingIsTrue: 'yes'// <= точка с запятой вставляется автоматически
  } // <= точка с запятой вставляется автоматически
} // <= точка с запятой автоматически вставляется 

Приведенный выше оператор вернет undefined из-за автоматической вставки точки с запятой после ключевого слова return.

Если бы наши фигурные скобки были размещены в соответствии с обычными стандартами JavaScript, это вернуло бы объект, который мы ожидали.

Еще большая проблема

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

 переменная а = 1
переменная б = 1+а
(функция () {
   // Какой-то код...
   // представим, что это компонент Angular (или другой фреймворк)
})() 

Теперь я добавлю автоматически вставляемые точки с запятой:

 var a = 1 // <= точка с запятой вставляется автоматически
переменная б = 1+а
(функция () {
   // Какой-то код. ..
   // представим, что это компонент Angular (или другой фреймворк)
})() // <= точка с запятой вставляется автоматически 

Вы заметили проблему?

JS не вставляет точку с запятой автоматически после объявления «b».

Как мы уже говорили, JS добавит точку с запятой после var b = 2, если следующая строка начинается с соответствующего ключевого слова. Вместо этого он начинается с открывающей скобки, что полностью разрешено, потому что JS может просто предположить, что это вызываемая функция.

Вот где может быть проблема. Если вы пишете в Angular или другом фреймворке и используете много IIFE, но какой-то код не входит в IFFE (например, app.js), то описанный выше сценарий по сути является тем, как выглядит ваш скомпилированный код.

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

В заключение, компилятор JS в некоторых случаях будет добавлять точку с запятой. Проблема в том, что типичный JS-разработчик не всегда будет понимать нюансы автоматической вставки точки с запятой и не будет о них сознательно думать при написании кода. Пример IIFE здесь — редкий и экстремальный пример, но многие ошибки, вызванные ASI, именно таковы. Эти ошибки почти невозможно исправить, но их также можно полностью избежать, используя передовой опыт.

Это лучшие методы JavaScript, чтобы избежать этих ошибок. Постоянно используйте точки с запятой в JavaScript так же, как и в C#. Кроме того, в JS держите фигурные скобки на одной строке (в отличие от C#). К счастью, если вы используете Visual Studio 2017 и автоматически форматируете свой код с помощью CTRL+K+D, Visual Studio позаботится о фигурных скобках JavaScript за вас.

Если вы поймаете одну из этих ошибок ASI, вы никогда не вернетесь. Это может означать вашу работу, затем вашу карьеру (кто наймет разработчика JS, который не использует точки с запятой!), а затем вы умрете с голоду. Используйте точки с запятой.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *