Skip to content

Commit 2cdbf49

Browse files
feyclaude
andcommitted
feat(30-variables): adapt content from Python version
- 10-definition: rewrite README (let/const, naming rules); exercise — print url twice - 11-change: rewrite README (let mutation, const restriction); exercise — deliveryStatus - 13-variables-naming: rewrite README (naming for humans, camelCase) - 15-variables-expressions: rewrite README (expressions, order); exercise — euros conversion - 18-variable-concatenation: exercise — Russian greeting letter (Анна) - 19-naming-style: rewrite README (lowerCamelCase); exercise — itemCount * itemPrice - 20-magic-numbers: rewrite README + exercise — warehouse pallets/boxes - 23-constants: rewrite README (const vs let, Python comparison); exercise — maxLoginAttempts - Remove 25-interpolation and 30-symbols (moving to new module 31-advanced-strings) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 9a7fb26 commit 2cdbf49

54 files changed

Lines changed: 219 additions & 722 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
/* eslint prefer-const: 0 */
2-
3-
// BEGIN
4-
const motto = 'What Is Dead May Never Die!';
5-
console.log(motto);
6-
// END
1+
const url = 'https://hexlet.io';
2+
console.log(url);
3+
console.log(url);
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
2-
Создайте переменную с именем `motto` и содержимым `What Is Dead May Never Die!`. Распечатайте содержимое переменной.
1+
Создайте переменную с именем `url` и значением `https://hexlet.io`. Выведите значение этой переменной на экран два раза.
Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,42 @@
1+
Переменные — один из базовых инструментов программирования. С их помощью программы запоминают и используют данные.
12

2-
Представьте себе задачу: нам нужно напечатать на экран фразу *Father!* два раза или даже пять раз. Эту задачу можно решить в лоб:
3+
Рассмотрим пример.
34

45
```javascript
5-
console.log('Father!');
6-
console.log('Father!');
6+
let greeting = 'Father!';
7+
console.log(greeting); // => Father!
78
```
89

9-
В простейшем случае так и стоит поступить, но если фраза *Father!* начнет использоваться чаще, да еще и в разных частях программы, то придется ее везде повторять. Проблемы с таким подходом начнутся тогда, когда понадобится изменить нашу фразу, а такое происходит довольно часто. Нам придется найти все места, где использовалась фраза *Father!*, и выполнить необходимую замену. А можно поступить по-другому. Вместо копирования нашего выражения достаточно создать переменную с этой фразой.
10+
Мы **определили переменную** с именем `greeting` и присвоили ей значение `'Father!'`. Теперь вместо строки `'Father!'` можно использовать имя `greeting`.
1011

1112
```javascript
12-
// greeting - переводится как приветствие
1313
let greeting = 'Father!';
1414
console.log(greeting); // => Father!
1515
console.log(greeting); // => Father!
1616
```
1717

18-
Переменная указывает на данные, которые были в неё записаны. Благодаря этому, данные можно использовать многократно без необходимости их постоянно дублировать. Сама переменная создается и наполняется данными (инициализируется) с помощью инструкции `let greeting = 'Father!'`.
18+
Значение переменной берётся в момент обращения к ней.
1919

20-
Для имени переменной используется любой набор допустимых символов, к которым относятся буквы английского алфавита, цифры, а также знаки *_* и *$*. При этом цифру нельзя ставить в начале. Имена переменных регистрозависимы, то есть имя `hello` и имя `heLLo` - это два разных имени, а значит и две переменные. Регистр в JavaScript имеет важное значение, никогда не забывайте про него.
20+
## let и const
2121

22-
Переменную не обязательно инициализировать данными во время объявления. Иногда бывает нужно ее создать, а наполняться она будет потом:
23-
24-
```javascript
25-
let greeting;
22+
В JavaScript переменные объявляются двумя способами:
2623

27-
// Использование
28-
console.log(greeting); // undefined
24+
- `let` — для значений, которые могут меняться.
25+
- `const` — для значений, которые не будут меняться (константы).
2926

30-
// Изменение переменной в следующем уроке
27+
```javascript
28+
let currentUser = 'Alice'; // может поменяться позже
29+
const maxAttempts = 3; // никогда не изменится
3130
```
3231

33-
Объявленная, но не инициализированная переменная, содержит внутри себя значение `undefined`. Это специальное значение, используемое тогда, когда ничего не определено.
32+
Если не знаете, будет ли значение меняться — используйте `const`. Это хорошая практика.
3433

35-
Количество создаваемых переменных ничем не ограничено, большие программы содержат десятки и сотни тысяч имен переменных:
34+
## Правила именования
3635

37-
```javascript
38-
let greeting1 = 'Father!';
39-
console.log(greeting1);
40-
console.log(greeting1);
36+
Имена переменных в JavaScript:
4137

42-
let greeting2 = 'Mother!';
43-
console.log(greeting2);
44-
console.log(greeting2);
45-
```
38+
- Могут содержать буквы, цифры, `_` и `$`.
39+
- Не могут начинаться с цифры.
40+
- Чувствительны к регистру: `greeting` и `Greeting` — разные переменные.
4641

47-
Для удобства анализа программы, переменные принято создавать как можно ближе к тому месту, где они используются.
42+
Имена по стилю записываются в lowerCamelCase: `firstName`, `maxLoginAttempts`.

modules/30-variables/10-definition/test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ test('hello world', async () => {
88

99
const firstArg = consoleLogSpy.mock.calls.join('\n');
1010

11-
expect(firstArg).toBe('What Is Dead May Never Die!');
11+
expect(firstArg).toBe('https://hexlet.io\nhttps://hexlet.io');
1212
});
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
let name = 'Brienna';
2-
31
// BEGIN
4-
name = 'anneirB';
2+
let deliveryStatus = 'в пути';
3+
deliveryStatus = 'доставлен';
4+
console.log(deliveryStatus);
55
// END
6-
7-
console.log(name);
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
2-
В упражнении определена переменная, внутри которой находится строка. Переопределите значение этой переменной и присвойте ей ту же строку, но в перевернутом виде, т.е. расположите символы первоначальной строки в обратном порядке.
1+
Создайте переменную `deliveryStatus` со значением `'в пути'`. Затем измените её значение на `'доставлен'` и выведите на экран.
Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1-
2-
Само слово "переменная" говорит о том, что ее можно менять. И действительно, с течением времени внутри программы значения переменных могут изменяться.
1+
Переменная потому и называется переменной, что её значение можно **изменить**.
32

43
```javascript
54
let greeting = 'Father!';
6-
console.log(greeting);
7-
console.log(greeting);
5+
console.log(greeting); // => Father!
86

97
greeting = 'Mother!';
10-
console.log(greeting);
11-
console.log(greeting);
8+
console.log(greeting); // => Mother!
9+
```
10+
11+
Обратите внимание: ключевое слово `let` пишется только при **первом** объявлении переменной. При повторном присваивании `let` уже не нужен.
12+
13+
## Зачем это нужно?
14+
15+
Переменные меняются в самых разных ситуациях:
16+
17+
- Пользователь обновляет своё имя в профиле.
18+
- Игровой персонаж теряет или находит жизни.
19+
- В процессе вычислений накапливается промежуточный результат.
20+
21+
## const не меняется
22+
23+
Если переменная объявлена через `const`, её нельзя переприсвоить.
24+
25+
```javascript
26+
const greeting = 'Father!';
27+
greeting = 'Mother!'; // TypeError: Assignment to constant variable.
1228
```
1329

14-
Имя осталось тем же, но внутри другие данные. Обратите внимание на ключевое различие между объявлением переменной и ее изменением. Ключевое слово `let` ставится только при создании переменной, но при изменении оно уже не используется.
30+
Поэтому для значений, которые будут меняться, используйте `let`.

modules/30-variables/11-change/test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ test('hello world', async () => {
88

99
const firstArg = consoleLogSpy.mock.calls.join('\n');
1010

11-
expect(firstArg).toBe('anneirB');
11+
expect(firstArg).toBe('доставлен');
1212
});
Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,35 @@
1+
Компьютеру всё равно, как называются переменные. Но код читают люди — и для них это имеет огромное значение.
12

2-
Представим себе, что программа из прошлого урока выглядит так:
3+
Посмотрите на два примера.
34

45
```javascript
5-
let x = 'Father!';
6-
console.log(x);
7-
console.log(x);
6+
const x = 'John';
7+
const abcd = 30;
88
```
99

10-
Она по-прежнему работает, но в ней изменилось имя переменной на `x`. Компьютеру без разницы, как мы называем переменные, это бездушная машина, но вот программистам — нет. Мы гораздо чаще читаем код, чем пишем. Причём не свой, а написанный другими людьми. От качества и понятности имён переменных зависит половина успеха в анализе кода.
10+
vs
1111

12-
Лучше посидеть и придумать название, которое описывает суть, смысл переменной, чем назвать её как попало, а в будущем переделывать. Постарайтесь давать им такие имена, чтобы они были максимально понятны без контекста, без изучения окружающего кода.
12+
```javascript
13+
const firstName = 'John';
14+
const age = 30;
15+
```
1316

14-
Существует общепринятое правило: не используйте транслит для имён, только английский язык. Если вы испытываете сложности с английским, то пользуйтесь переводчиком. Со временем, копаясь в чужом коде, вы сформируете правильные понятия для именования.
17+
Первый вариант написан для компьютера, второй — для человека.
1518

16-
Среди разработчиков есть шутка: «самое сложное в программировании — названия переменных и инвалидация кеша». Придумывать названия и правда сложно. Как бы вы назвали переменную, в которой хранится *количество неоплаченных заказов от клиентов, имеющих задолженность в предыдущем квартале?*
19+
## Требования к именам
1720

18-
<details>
19-
<summary>Ответ</summary>
21+
- Имя должно отражать содержимое, а не тип: `userName` лучше, чем `userString`.
22+
- Используйте английский язык: `firstName`, а не `имя`.
23+
- Не бойтесь длинных имён: `maxLoginAttempts` лучше, чем `mla`.
2024

21-
Правильного и однозначного ответа на этот вопрос нет. Например, можно использовать название `unpaidOrdersFromDebtorsInPreviousQuarterCount`.
25+
## Сложная задача
2226

23-
Это имя хорошо описывает содержание переменной и позволяет легко идентифицировать ее смысл в коде. При этом оно слишком длинное и сложное, поэтому лучше использовать более краткое имя — например, `unpaidOrdersFromDebtorsCount` или `debtorsUnpaidOrdersCount`. В общем, выбор имени для переменной зависит от контекста использования.
24-
</details>
27+
Как назвать переменную, которая хранит количество братьев и сестёр короля?
2528

26-
В JavaScript в именах констант и переменных каждое слово пишется с заглавной буквы, кроме первого. Например:
29+
Какой из вариантов вы бы выбрали?
2730

28-
```javascript
29-
const firstName = 'John';
30-
console.log(firstName); // => John
31-
32-
const playerNumber = 24;
33-
console.log(playerNumber); // => 24
34-
```
31+
- `x` — непонятно ничего
32+
- `count` — count чего?
33+
- `siblingsCount` — понятно и точно ✓
3534

36-
Самопроверка. Придумайте название для переменной, в которой будет храниться *«количество братьев и сестёр короля»*. Запишите его в блокноте или отправьте себе на почту. Не указывайте там ничего, кроме названия переменной. А через несколько уроков мы вернёмся к этой теме ;-)
35+
Именование — одна из самых сложных задач в программировании. Со временем хорошие имена приходят сами собой.
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
/* eslint prefer-const: 0 */
2-
31
const eurosCount = 100;
4-
5-
// BEGIN
62
const dollarsPerEuro = 1.25;
73
const yuansPerDollar = 6.91;
84

95
const dollarsCount = eurosCount * dollarsPerEuro;
10-
console.log(dollarsCount);
116
const yuansCount = dollarsCount * yuansPerDollar;
7+
8+
console.log(dollarsCount);
129
console.log(yuansCount);
13-
// END

0 commit comments

Comments
 (0)