> For the complete documentation index, see [llms.txt](https://aleksandra-hrevtsova.gitbook.io/senior-front-end-javascript/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aleksandra-hrevtsova.gitbook.io/senior-front-end-javascript/bazovyi-sintaksis/dannye-i-peremennye.md).

# Данные и переменные

JavaScript слаботипизированный (с динамической типизацией) язык программирования

**Слабая типизация языка обусловлена 2мя основными чертами:**

* возможность изменять (переназначать) значение переменной;
* приведение типов (изменение типа данных) у значения.

Во-первых, всё, что нас окружает, это в первую очередь данные!&#x20;

Данные описывают сущности, их свойства и действия над ними.

В JavaScript данные разделены на 2 больших семейства:

* примитивные данные;
* объекты.

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

Для возможности обращения к данным и работы с ними создаются переменные - абстракции - по имени (идентификатору) которых, мы обращаемся к ячейке с данными и можем с ними взаимодействовать.&#x20;

\
Это как мы именуем различные емкости и упаковки, благодаря которым можем хранить и брать предметы: \
\`Дай-ка мне вон ту красную коробку с печеньем !\`

```
let redBox = "cookies"
```

А теперь давайте рассмотрим, почему `let`, почему `redBox`, почему `=` и почему `"cookies"`

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

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

В JavaScript три ключевых слова для создания переменных:

* const
* &#x20;let
* var

Давайте посмотрим сравнительную таблицу и поймем, зачем аж три ключевых слова:\
\*false - нельзя, true - можно

<table><thead><tr><th>свойство</th><th width="174">CONST</th><th width="159">LET</th><th>VAR</th></tr></thead><tbody><tr><td>Область видимости</td><td>блочная</td><td>блочная</td><td>глобальная</td></tr><tr><td>Использование до объявления</td><td>false</td><td>false</td><td>true</td></tr><tr><td>Объявление без значения</td><td>false</td><td>true</td><td>true</td></tr><tr><td>Присвоение нового значения</td><td>false</td><td>true</td><td>true</td></tr><tr><td></td><td></td><td></td><td></td></tr></tbody></table>

Получается, что const ничего нельзя, а что же тогда можно, ибо зачем оно тогда?

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

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

`let` - позволяет создать переменную без инициализации (присвоения ей значения).

Ага, хорошо, если мы создали переменную и не присвоили ей значение, она же не будет пустовать, значит ей можно и присвоить новое значение, то есть переназначить?

Да, именно!&#x20;

Переменные, объявленные через `let` можно не инициализировать, но в таком случае, всё-равно ей будет присвоено значение - имя которому `undefined`, а в последствии можно присваивать новые значения, которые заменят собой предыдущие.

Отлично! Тут ясно-понятно. А что тогда такого специфического в ключевом слове `var`?

`var` - обладает свойствами let, то есть, можно объявлять без инициализации, переприсваивать значения после сколько душе угодно, но у `var` есть **главное отличие** как от let так и от const - к переменным, объявленным через `var` **можно обращаться до их объявления**, это, конечно, не даст нам поработать с их значениями, потому что они еще не присвоены (судя по потоку кода сверху вниз), но тем не менее, такое преждевременное обращение к переменной не вызовет ошибку и остановку работы кода.

С объявлением переменных разобрались, теперь смотрим, как к ним обращаться, чтобы поработать с их значениями.

* обращение к переменной по ее имени (идентификатору)! \
  Ключевое слово писать не нужно, оно указывается только раз - при объявлении переменной. Все дальнейшие обращения к ней только по имени (и с уважением :smile:)&#x20;

Класс! Создать - создали, обратиться - обратились, по имени и с уважением.

А что по именам, те, что идентификаторы?

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

Существуют правила и хороший тон именования переменных:

* имя на английском языке английскими буквами (простите за тавтологию);
* описательное - слёту дает понять, что хранится в этой переменной;
* без пробелов и каких-либо символов (кроме `_` `#` и `$` - но это отдельные случаи) - просто зарубить на носу, а когда научитесь внятно именовать переменные, можете процедить просторы паутины и изучить почему так, вплоть до бинарного представления;
* прописными (маленькими) буквами - если имя односоставное и кэмэл-кейсом, но тоже начиная с маленькой буквы - `lowerCamelCase*` - если многосоставное, а для ES6-классов и функций-конструкторов ванильного Js и компонентов в библиотеке React - просто `CamelCase*`;
* числа в имени - плохая практика;
* допустимо, но не принято в Js именование в стилях: `snake_case` и `kebab-case;`
* `UPPER_SNAKE_CASE себя изжил с выходом стандарта ES6, который привнес ключевое слово const для объявления переменных.` \
  `Переменной с const и так нельзя будет изменить значение, но всё-еще встречается практика именования переменных в этом стиле, если значение ни в коем случае изменять нельзя.` \
  `Что хранят в переменных с таким именем?` \
  `url-адрес и еще какие-либо данные для http-запросов на сервер, например.`

`*Есть две правды про названия стиля CamelCase. Одни утверждают, что CamelCase это, на самом деле` PascalCase, а отпрыск lowerCamelCase и есть сам camelCase. По крайней мере по данным из блога Microsoft от Брэда Абрамса — “[History around Pascal Casing and Camel Casing](https://docs.microsoft.com/en-us/archive/blogs/brada/history-around-pascal-casing-and-camel-casing)”,  говорится, что термин PascalCase абсолютно логично проистекает из языка Pascal, стандартные методы которого именуются с заглавной буквы (Abs, Random, Round).\
Но думайте сами, решайте сами, кто из них кто, главное - именуйте переменные правильно и описательно!

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

Исчерпывающий список зарезервированных слов [здесь](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Lexical_grammar#%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D1%81%D0%BB%D0%BE%D0%B2%D0%B0).

Фух! Имена тоже посмотрели, ключевое для себя определили, пошли дальше.

\
Знак `=` - это не знак равенства, как мы привыкли со школы, это оператор присвоения.\
Операторы равенств и неравенств мы рассмотрим в блоке [операторы](/senior-front-end-javascript/bazovyi-sintaksis/operatory.md).

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

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

{% embed url="<https://bit.ly/31Iqa3Q>" %}
Форма с коротким тестом на переменные JavaScript
{% endembed %}

Ух! Закрутили, так закрутили! Дальше-больше!

О том, какие данные хранятся в переменной можно узнать указав оператор `typeof` перед значением или именем переменной, хранящей значение.

А что с этими можно\нужно делать, знакомимся далее, в разделах [примитивы](/senior-front-end-javascript/bazovyi-sintaksis/primitivy-i-privedenie-tipov.md#primitivnye-dannye-primitivy) и [объекты](broken://pages/JMsRsSvX9kvAhMaGQGNY).
