You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/05-types/article.md
+27-5Lines changed: 27 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@ message = 123456;
10
10
11
11
Языки программирования, в которых такое возможно, называются "динамически типизированными". Это значит, что типы данных есть, но переменные не привязаны ни к одному из них.
12
12
13
-
Есть семь основных типов данных в JavaScript. В этой главе мы рассмотрим их в общем, а в следующих главах поговорим подробнее о каждом.
13
+
Есть восемь основных типов данных в JavaScript. В этой главе мы рассмотрим их в общем, а в следующих главах поговорим подробнее о каждом.
14
14
15
15
## Число
16
16
@@ -62,6 +62,25 @@ n = 12.345;
62
62
63
63
Подробнее о работе с числами мы поговорим в главе <info:number>.
64
64
65
+
## BigInt
66
+
67
+
В JavaScript тип "number" не может содержать числа больше, чем <code>2<sup>53</sup></code> (или меньше, чем <code>-2<sup>53</sup></code> для отрицательных). Это техническое ограничение вызвано их внутренним представлением. <code>2<sup>53</sup></code>- это достаточно большое число, состоящее из 16 цифр, поэтому чаще всего проблем не возникает. Но иногда нам нужны действительно гигантские числа, например в криптографии или при использовании метки времени ("timestamp") с микросекундами.
68
+
69
+
Тип `BigInt` был добавлен в JavaScript, чтобы дать возможность работать с целыми числами произвольной длины.
70
+
71
+
Чтобы создать значение типа `BigInt`, необходимо добавить `n` в конец числового литерала:
Выражение внутри `${…}` вычисляется, и его результат становится частью строки. Мы можем положить туда всё, что угодно: переменную `name` или выражение `1 + 2`, или что-то более сложное.
96
115
97
-
Обратите внимание, что это можно делать только в обратных кавычках. Другие кавычки не имеют такого функционала встраивания!
116
+
Обратите внимание, что это можно делать только в обратных кавычках. Другие кавычки не имеют такой функциональности встраивания!
98
117
```js run
99
118
alert( "результат: ${1 + 2}" ); // результат: ${1 + 2} (двойные кавычки ничего не делают)
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/09-alert-prompt-confirm/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -107,4 +107,4 @@ alert( isBoss ); // true, если нажата OK
107
107
1. Расположение окон определяется браузером. Обычно окна находятся в центре.
108
108
2. Визуальное отображение окон зависит от браузера, и мы не можем изменить их вид.
109
109
110
-
Такова цена простоты. Есть другие способы показать более приятные глазу окна с богатым функционалом для взаимодействия с пользователем, но если "навороты" не имеют значения, то данные методы работают отлично.
110
+
Такова цена простоты. Есть другие способы показать более приятные глазу окна с богатой функциональностью для взаимодействия с пользователем, но если "навороты" не имеют значения, то данные методы работают отлично.
Copy file name to clipboardExpand all lines: 1-js/03-code-quality/05-testing-mocha/article.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -51,7 +51,7 @@ describe("pow", function() {
51
51
Спецификация состоит из трёх основных блоков:
52
52
53
53
`describe("заголовок", function() { ... })`
54
-
: Какой функционал мы описываем. В нашем случае мы описываем функцию `pow`. Используется для группировки рабочих лошадок -- блоков `it`.
54
+
: Какую функциональность мы описываем. В нашем случае мы описываем функцию `pow`. Используется для группировки рабочих лошадок -- блоков `it`.
55
55
56
56
`it("описание", function() { ... })`
57
57
: В первом аргументе блока `it` мы *человеческим языком* описываем конкретный способ использования функции, а во втором -- пишем функцию, которая тестирует данный случай.
@@ -73,7 +73,7 @@ describe("pow", function() {
73
73
4. Теперь у нас есть правильно работающая начальная реализация и тесты.
74
74
5. Мы добавляем новые способы использования в спецификацию, возможно, ещё не реализованные в тестируемом коде. Тесты начинают "падать" (выдавать ошибки).
75
75
6. Возвращаемся на шаг 3, дописываем реализацию до тех пор, пока тесты не начнут завершаться без ошибок.
76
-
7. Повторяем шаги 3-6, пока требуемый функционал не будет готов.
76
+
7. Повторяем шаги 3-6, пока требуемая функциональность не будет готова.
77
77
78
78
Таким образом, разработка проходит *итеративно*. Мы пишем спецификацию, реализуем её, проверяем, что тесты выполняются без ошибок, пишем ещё тесты, снова проверяем, что они проходят и т.д.
79
79
@@ -302,7 +302,7 @@ describe("тест", function() {
302
302
303
303
## Расширение спецификации
304
304
305
-
Основной функционал `pow` реализован. Первая итерация разработки завершена. Когда мы закончим отмечать и пить шампанское, давайте продолжим работу и улучшим `pow`.
305
+
Основная функциональность `pow` реализована. Первая итерация разработки завершена. Когда мы закончим отмечать и пить шампанское, давайте продолжим работу и улучшим `pow`.
306
306
307
307
Как было сказано, функция `pow(x, n)` предназначена для работы с целыми положительными значениями `n`.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/01-object/article.md
+58-38Lines changed: 58 additions & 38 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -103,7 +103,9 @@ let user = {
103
103
user.likes birds =true
104
104
```
105
105
106
-
Так происходит, потому что точка требует, чтобы ключ был именован по правилам именования переменных. То есть не имел пробелов, не начинался с цифры и не содержал специальные символы, кроме `$` и `_`.
106
+
JavaScript видит, что мы обращаемся к свойству `user.likes`, а затем идёт непонятное слово `birds`. В итоге синтаксическая ошибка.
107
+
108
+
Точка требует, чтобы ключ был именован по правилам именования переменных. То есть не имел пробелов, не начинался с цифры и не содержал специальные символы, кроме `$` и `_`.
107
109
108
110
Для таких случаев существует альтернативный способ доступа к свойствам через квадратные скобки. Такой способ сработает с любым именем свойства:
109
111
@@ -208,42 +210,6 @@ let bag = {
208
210
209
211
Подведём итог: в большинстве случаев, когда имена свойств известны и просты, используется запись через точку. Если же нам нужно что-то более сложное, то мы используем квадратные скобки.
210
212
211
-
````smart header="Зарезервированные слова разрешено использовать как имена свойств"
212
-
213
-
Имя переменной не может совпадать с зарезервированными словами, такими как "for", "let", "return" и т.д.
214
-
215
-
Но для свойств объекта такого ограничения нет:
216
-
217
-
```js run
218
-
let obj = {
219
-
for: 1,
220
-
let: 2,
221
-
return: 3
222
-
};
223
-
224
-
alert( obj.for + obj.let + obj.return ); // 6
225
-
```
226
-
227
-
В принципе, разрешены любые имена свойств, но есть специальное свойство `__proto__`, которое по историческим причинам имеет особое поведение. Например, его значение всегда должно быть объектом, и мы не можем установить для него никакое другое значение:
228
-
229
-
```js run
230
-
let obj = {};
231
-
obj.__proto__ = 5;
232
-
alert(obj.__proto__); // [object Object], работает не так, как мы ожидали
233
-
```
234
-
235
-
Как мы видим, присвоение примитивного значения `5` игнорируется.
236
-
237
-
Это может стать источником ошибок и даже уязвимостей, если мы намереваемся хранить в объекте произвольные пары "ключ:значение" и позволяем посетителям указывать ключи.
238
-
239
-
Посетитель может указать `__proto__` в качестве ключа, и логика присваивания будет нарушена (как показано выше).
240
-
241
-
Есть способ заставить объекты обрабатывать `__proto__` как обычное свойство. Мы поговорим о нём позже, а пока нам нужно узнать больше об объектах.
242
-
243
-
Также существует другая структура данных [Map](info:map-set), которая поддерживает произвольные ключи. Мы изучим её в главе <info:map-set>.
244
-
````
245
-
246
-
247
213
## Свойство из переменной
248
214
249
215
В реальном коде часто нам необходимо использовать существующие переменные как значения для свойств с тем же именем.
@@ -288,7 +254,61 @@ let user = {
288
254
};
289
255
```
290
256
291
-
## Проверка существования свойства
257
+
## Ограничения на имена свойств
258
+
259
+
Мы можем использовать только строки и символы в качестве ключей свойств. Все другие типы данных будут автоматически преобразованы к строке.
260
+
261
+
Например, если использовать как ключ число `0`, то оно превратится в строку `"0"`:
262
+
263
+
```js run
264
+
let obj = {
265
+
0:"Тест"// то же самое что и "0": "Тест"
266
+
};
267
+
268
+
// обе функции alert выведут одно и то же свойство (число 0 преобразуется в строку "0")
269
+
alert( obj["0"] ); // Тест
270
+
alert( obj[0] ); // Тест (то же свойство)
271
+
```
272
+
273
+
**Зарезервированные слова разрешено использовать как имена свойств.**
274
+
275
+
Как мы уже знаем, имя переменной не может совпадать с зарезервированными словами, такими как "for", "let", "return" и т.д.
276
+
277
+
Но для свойств объекта такого ограничения нет:
278
+
279
+
```js run
280
+
let obj = {
281
+
for:1,
282
+
let:2,
283
+
return:3
284
+
};
285
+
286
+
alert( obj.for+obj.let+obj.return ); // 6
287
+
```
288
+
289
+
**В принципе, разрешены любые имена свойств, но есть специальное свойство `__proto__`, которое по историческим причинам имеет особое поведение.**
290
+
291
+
Например, его значение всегда должно быть объектом:
292
+
293
+
```js run
294
+
let obj = {};
295
+
obj.__proto__=5;
296
+
alert(obj.__proto__); // [object Object], работает не так, как мы ожидали
297
+
```
298
+
299
+
Как мы видим, присвоение примитивного значения `5` игнорируется.
300
+
301
+
Мы более подробно исследуем происходящее свойство `__proto__` позже, в главе [](info:prototype-inheritance).
302
+
303
+
Сейчас важно знать, что такое поведение `__proto__` может стать источником ошибок и даже уязвимостей, если мы намереваемся хранить в объекте произвольные данные и позволяем посетителям указывать ключи.
304
+
305
+
Посетитель может указать `"__proto__"` в качестве ключа, и логика присваивания будет нарушена (как показано выше).
306
+
307
+
Позже мы изучим, как обойти эту проблему:
308
+
1. Можно заставить объект обрабатывать `__proto__` как обычное свойство, мы это увидим в главе [](info:prototype-methods).
309
+
2. Есть другая структура данных [Map](info:map-set), которую мы изучим в главе <info:map-set>, она поддерживает произвольные ключи.
310
+
311
+
## Проверка существования свойства, оператор "in"
292
312
293
313
Особенность объектов в том, что можно получить доступ к любому свойству. Даже если свойства не существует - ошибки не будет! При обращении к свойству, которого нет, возвращается `undefined`. Это позволяет просто проверить существование свойства - сравнением его с `undefined`:
0 commit comments