From 12476ce294756946b4543981a6b781276f509999 Mon Sep 17 00:00:00 2001 From: UnknownMystic Date: Tue, 19 May 2020 23:03:54 +0300 Subject: [PATCH 0001/1128] (pass == '') have to return wrong pass msg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit По заданию (если там не ошибка в переводе) на пустой ввод только для имени надо выводить отменено, а для пароля - не верный. --- .../11-logical-operators/9-check-login/solution.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md b/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md index 347bbd457d..0a2ac5b641 100644 --- a/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md +++ b/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md @@ -9,13 +9,13 @@ if (userName == 'Админ') { if (pass == 'Я главный') { alert( 'Здравствуйте!' ); - } else if (pass == '' || pass == null) { + } else if (pass == null) { alert( 'Отменено' ); } else { alert( 'Неверный пароль' ); } -} else if (userName == '' || userName == null) { +} else if (!userName) { alert( 'Отменено' ); } else { alert( "Я вас не знаю" ); From 62e63b59fcac068b547d458e8df108a3798492cf Mon Sep 17 00:00:00 2001 From: nikolasmelui Date: Tue, 2 Feb 2021 11:49:16 +0300 Subject: [PATCH 0002/1128] Replace a non-existent words It hurts my eyes for a very long time, so I decided to replace it. If you don't agree, you can reject the PR. --- 1-js/02-first-steps/10-ifelse/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/02-first-steps/10-ifelse/article.md b/1-js/02-first-steps/10-ifelse/article.md index 7dbf51a98b..4901721866 100644 --- a/1-js/02-first-steps/10-ifelse/article.md +++ b/1-js/02-first-steps/10-ifelse/article.md @@ -29,7 +29,7 @@ if (year == 2015) { } ``` -Мы рекомендуем использовать фигурные скобки `{}` всегда, когда вы используете инструкцию `if`, даже если выполняется только одна команда. Это улучшает читабельность кода. +Мы рекомендуем использовать фигурные скобки `{}` всегда, когда вы используете инструкцию `if`, даже если выполняется только одна команда. Это улучшает читаемость кода. ## Преобразование к логическому типу @@ -153,7 +153,7 @@ let accessAllowed = (age > 18) ? true : false; let accessAllowed = age > 18 ? true : false; ``` -Но скобки делают код более читабельным, поэтому мы рекомендуем их использовать. +Но скобки делают код более читаемым, поэтому мы рекомендуем их использовать. ````smart В примере выше вы можете избежать использования оператора вопросительного знака `?`, т.к. сравнение само по себе уже возвращает `true/false`: @@ -221,7 +221,7 @@ let company = prompt('Какая компания создала JavaScript?', ' **Не рекомендуется использовать оператор вопросительного знака таким образом.** -Несмотря на то, что такая запись короче, чем эквивалентная инструкция `if`, она менее читабельна. +Несмотря на то, что такая запись короче, чем эквивалентная инструкция `if`, она хуже читается. Вот, для сравнения, тот же код, использующий `if`: From 39c422b7c963407cbf871c89a0931f8eb88e4642 Mon Sep 17 00:00:00 2001 From: ArtemTropanets <36934520+ArtemTropanets@users.noreply.github.com> Date: Mon, 14 Jun 2021 23:59:18 +0300 Subject: [PATCH 0003/1128] Add function declaration block visibility info --- 1-js/06-advanced-functions/03-closure/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/03-closure/article.md b/1-js/06-advanced-functions/03-closure/article.md index 5d915d9088..624d1cd8f5 100644 --- a/1-js/06-advanced-functions/03-closure/article.md +++ b/1-js/06-advanced-functions/03-closure/article.md @@ -421,7 +421,7 @@ alert( counter2() ); // 0 (независимо) Когда выполнение попадает в блок `if`, для этого блока создаётся новое лексическое окружение. -У него есть ссылка на внешнее окружение, так что `phrase` может быть найдена. Но все переменные и Function Expression, объявленные внутри `if`, остаются в его лексическом окружении и не видны снаружи. +У него есть ссылка на внешнее окружение, так что `phrase` может быть найдена. Но все переменные и Function Expression, объявленные внутри `if`, остаются в его лексическом окружении и не видны снаружи. Function Declaration, объявленные внутри блока, в строгом режиме также не видны снаружи. Например, после завершения `if` следующий `alert` не увидит `user`, что вызовет ошибку. From dd11e66cda3e24b7ed4861697a33d8bf042a6630 Mon Sep 17 00:00:00 2001 From: ZhdanovSergey <37261841+ZhdanovSergey@users.noreply.github.com> Date: Tue, 9 Nov 2021 12:23:06 +0300 Subject: [PATCH 0004/1128] fix value in Intl.NumberFormat table Fix incorrect default value of maximumSignificantDigits parameter in Intl.NumberFormat table. Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#parameters --- 1-js/99-js-misc/90-intl/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/90-intl/article.md b/1-js/99-js-misc/90-intl/article.md index 710f7f5bc5..ce945436e3 100644 --- a/1-js/99-js-misc/90-intl/article.md +++ b/1-js/99-js-misc/90-intl/article.md @@ -377,7 +377,7 @@ formatter.format(number); // форматирование maximumSignificantDigits Максимальное количество значимых цифр от minimumSignificantDigits до 21 - minimumSignificantDigits + 21 From 7339dce44ba5eeb6820bc6b4e773b44bf7efc7c8 Mon Sep 17 00:00:00 2001 From: Yuri Beliakov Date: Thu, 11 Nov 2021 00:07:50 +0300 Subject: [PATCH 0005/1128] Update article.md Fix typo in RFC standard number. --- 1-js/99-js-misc/90-intl/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/90-intl/article.md b/1-js/99-js-misc/90-intl/article.md index 710f7f5bc5..e744d54e6a 100644 --- a/1-js/99-js-misc/90-intl/article.md +++ b/1-js/99-js-misc/90-intl/article.md @@ -45,7 +45,7 @@ Также через суффикс `-u-*` можно указать расширения локалей, например `"th-TH-u-nu-thai"` -- тайский язык (`th`), используемый в Таиланде (`TH`), с записью чисел тайскими буквами (๐, ๑, ๒, ๓, ๔, ๕, ๖, ๗, ๘, ๙) . -Стандарт, который описывает локали -- [RFC 5464](http://tools.ietf.org/html/rfc5646), языки описаны в [IANA language registry](http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry). +Стандарт, который описывает локали -- [RFC 5646](http://tools.ietf.org/html/rfc5646), языки описаны в [IANA language registry](http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry). Все методы принимают локаль в виде строки или массива, содержащего несколько локалей в порядке предпочтения. From 96e2da2e39c62e483b1d9fa3e090f3a8a2472252 Mon Sep 17 00:00:00 2001 From: LexaWin <87317612+LexaWin@users.noreply.github.com> Date: Sat, 13 Nov 2021 20:29:46 +0300 Subject: [PATCH 0006/1128] Update script.js --- .../mouseoverout-fast.view/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/script.js b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/script.js index 6d87199c26..5752e83ae9 100755 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/script.js +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseoverout-fast.view/script.js @@ -3,7 +3,7 @@ parent.onmouseover = parent.onmouseout = parent.onmousemove = handler; function handler(event) { let type = event.type; - while (type < 11) type += ' '; + while (type.length < 11) type += ' '; log(type + " target=" + event.target.id) return false; From 1617986cd38fa40a8bf56ec52bcb1e18c29c44d0 Mon Sep 17 00:00:00 2001 From: LexaWin <87317612+LexaWin@users.noreply.github.com> Date: Tue, 16 Nov 2021 21:00:20 +0300 Subject: [PATCH 0007/1128] Fixed a typo --- 2-ui/3-event-details/4-mouse-drag-and-drop/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/3-event-details/4-mouse-drag-and-drop/article.md b/2-ui/3-event-details/4-mouse-drag-and-drop/article.md index 4afde91703..8b383ef8a8 100644 --- a/2-ui/3-event-details/4-mouse-drag-and-drop/article.md +++ b/2-ui/3-event-details/4-mouse-drag-and-drop/article.md @@ -305,4 +305,4 @@ function onMouseMove(event) { - Можно использовать делегирование событий для `mousedown/up`. Один обработчик событий на большой зоне, который проверяет `event.target`, может управлять Drag'n'Drop для сотен элементов. - И так далее. -Существуют фреймворки, которые строят архитектуру поверх этого алгоритма, создавая такие классы, как `DragZone`, `Droppable`, `Draggable`. Большинство из них делают вещи, аналогичные описанным выше. Вы можете и создать вашу собственную реализацию переноса, как видите, это достаточно просто, возможно, проще, чем адаптация чего-то готового. +Существуют фреймворки, которые строят архитектуру поверх этого алгоритма, создавая такие классы, как `DragZone`, `Droppable`, `Draggable`. Большинство из них делают вещи, аналогичные описанным выше. Вы можете и сами создать вашу собственную реализацию переноса, как видите, это достаточно просто, возможно, проще, чем адаптация чего-то готового. From 4e7727a59c9c122b8318e0354706b612e08ca362 Mon Sep 17 00:00:00 2001 From: Timur Date: Fri, 19 Nov 2021 12:39:49 +0200 Subject: [PATCH 0008/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/08-prototypes/03-native-prototypes/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/08-prototypes/03-native-prototypes/article.md b/1-js/08-prototypes/03-native-prototypes/article.md index 035ff13fc7..7e365b3062 100644 --- a/1-js/08-prototypes/03-native-prototypes/article.md +++ b/1-js/08-prototypes/03-native-prototypes/article.md @@ -33,7 +33,7 @@ alert( obj ); // "[object Object]" ? let obj = {}; alert(obj.__proto__ === Object.prototype); // true -// obj.toString === obj.__proto__.toString == Object.prototype.toString +// obj.toString === obj.__proto__.toString === Object.prototype.toString ``` Обратите внимание, что по цепочке прототипов выше `Object.prototype` больше нет свойства `[[Prototype]]`: From 272945fe81500fb37127db68e36ae1492ca07d56 Mon Sep 17 00:00:00 2001 From: Timur Date: Mon, 22 Nov 2021 13:04:19 +0200 Subject: [PATCH 0009/1128] Update article.md The script with defer attribute does not run when it is loaded. Quote from HTML Living Standard: "If the async attribute is not present but the defer attribute is present, then the classic script will be fetched in parallel and evaluated when the page has finished parsing." Source: https://html.spec.whatwg.org/multipage/scripting.html#the-script-element --- 2-ui/5-loading/02-script-async-defer/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2-ui/5-loading/02-script-async-defer/article.md b/2-ui/5-loading/02-script-async-defer/article.md index 317b79cc3f..f5e427ae3a 100644 --- a/2-ui/5-loading/02-script-async-defer/article.md +++ b/2-ui/5-loading/02-script-async-defer/article.md @@ -37,7 +37,7 @@ ## defer -Атрибут `defer` сообщает браузеру, что он должен продолжать обрабатывать страницу и загружать скрипт в фоновом режиме, а затем запустить этот скрипт, когда он загрузится. +Атрибут `defer` сообщает браузеру, что он должен продолжать обрабатывать страницу и загружать скрипт в фоновом режиме, а затем запустить этот скрипт, когда страница загрузится. Вот тот же пример, что и выше, но с `defer`: @@ -197,4 +197,4 @@ loadScript("/article/script-async-defer/small.js"); На практике `defer` используется для скриптов, которым требуется доступ ко всему DOM и/или важен их относительный порядок выполнения. -А `async` хорош для независимых скриптов, например счётчиков и рекламы, относительный порядок выполнения которых не играет роли. \ No newline at end of file +А `async` хорош для независимых скриптов, например счётчиков и рекламы, относительный порядок выполнения которых не играет роли. From bb561c56a6dde8181705c7ef9679ccef1b1b8be0 Mon Sep 17 00:00:00 2001 From: Timur Date: Tue, 23 Nov 2021 12:29:55 +0200 Subject: [PATCH 0010/1128] Update task.md Correct errata --- 1-js/02-first-steps/11-logical-operators/9-check-login/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/task.md b/1-js/02-first-steps/11-logical-operators/9-check-login/task.md index 76f65228ca..208bef7c0c 100644 --- a/1-js/02-first-steps/11-logical-operators/9-check-login/task.md +++ b/1-js/02-first-steps/11-logical-operators/9-check-login/task.md @@ -20,6 +20,6 @@ importance: 3 Для решения используйте вложенные блоки `if`. Обращайте внимание на стиль и читаемость кода. -Подсказка: передача пустого ввода в приглашение `prompt` возвращает пустую строку `''`. Нажатие клавиши `key:Esc` во время запроса возвращает`null`. +Подсказка: передача пустого ввода в приглашение `prompt` возвращает пустую строку `''`. Нажатие клавиши `key:Esc` во время запроса возвращает `null`. [demo] From 1be25ac0fa5a86f44afb6cff51f6f83f89615d65 Mon Sep 17 00:00:00 2001 From: LexaWin <87317612+LexaWin@users.noreply.github.com> Date: Sun, 5 Dec 2021 07:55:24 +0300 Subject: [PATCH 0011/1128] Fixed a typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Цифрой 2 должен быть обозначен 2-й скрипт (). Его загрузки и выполнения ждёт событие "DOMContentLoaded". --- 2-ui/5-loading/02-script-async-defer/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2-ui/5-loading/02-script-async-defer/article.md b/2-ui/5-loading/02-script-async-defer/article.md index 317b79cc3f..4a8b45f524 100644 --- a/2-ui/5-loading/02-script-async-defer/article.md +++ b/2-ui/5-loading/02-script-async-defer/article.md @@ -59,10 +59,10 @@

...содержимое до скрипта...

- + // (2)

...содержимое после скрипта...

``` @@ -197,4 +197,4 @@ loadScript("/article/script-async-defer/small.js"); На практике `defer` используется для скриптов, которым требуется доступ ко всему DOM и/или важен их относительный порядок выполнения. -А `async` хорош для независимых скриптов, например счётчиков и рекламы, относительный порядок выполнения которых не играет роли. \ No newline at end of file +А `async` хорош для независимых скриптов, например счётчиков и рекламы, относительный порядок выполнения которых не играет роли. From 4c3bc1b5e8ee93942d9282529c64fceac162542f Mon Sep 17 00:00:00 2001 From: Mikita Chyzhyk Date: Mon, 6 Dec 2021 13:23:29 +0300 Subject: [PATCH 0012/1128] remove -moz prefix hint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Думаю этот префикс уже можно спокойно удалять из учебника, распространенность версий firefox требующих этого префикса 0.19% на данный момент. https://caniuse.com/css3-boxsizing --- 20-css-for-js/10-box-sizing/article.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/20-css-for-js/10-box-sizing/article.md b/20-css-for-js/10-box-sizing/article.md index be709278a9..ece76c0026 100755 --- a/20-css-for-js/10-box-sizing/article.md +++ b/20-css-for-js/10-box-sizing/article.md @@ -165,7 +165,6 @@ div { display: block; padding-left: 5px; *!* - -moz-box-sizing: border-box; /* в Firefox нужен префикс */ box-sizing: border-box; width: 100%; */!* @@ -181,4 +180,4 @@ div { Мы сохранили "родную" рамку вокруг `INPUT/SELECT` и не добавили лишних элементов. Всё замечательно. -Свойство `box-sizing` поддерживается в IE начиная с версии 8. \ No newline at end of file +Свойство `box-sizing` поддерживается в IE начиная с версии 8. From f70707a798b1707ade896fce3125f25368a079bc Mon Sep 17 00:00:00 2001 From: LexaWin <87317612+LexaWin@users.noreply.github.com> Date: Thu, 9 Dec 2021 15:04:03 +0300 Subject: [PATCH 0013/1128] Fixed a typo --- 2-ui/99-ui-misc/02-selection-range/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/99-ui-misc/02-selection-range/article.md b/2-ui/99-ui-misc/02-selection-range/article.md index 3fa2584ab8..94eca43f83 100644 --- a/2-ui/99-ui-misc/02-selection-range/article.md +++ b/2-ui/99-ui-misc/02-selection-range/article.md @@ -311,7 +311,7 @@ From – To Date: Sun, 19 Dec 2021 16:51:53 +0300 Subject: [PATCH 0015/1128] Update article.md fix broken link --- 6-data-storage/02-localstorage/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index d971b2b855..aa75c1e4bd 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -181,7 +181,7 @@ alert( sessionStorage.getItem('test') ); // после обновления: 1 ## Событие storage -Когда обновляются данные в `localStorage` или `sessionStorage`, генерируется событие [storage](https://www.w3.org/TR/webstorage/#the-storage-event) со следующими свойствами: +Когда обновляются данные в `localStorage` или `sessionStorage`, генерируется событие [storage](https://html.spec.whatwg.org/multipage/webstorage.html#the-storageevent-interface) со следующими свойствами: - `key` – ключ, который обновился (`null`, если вызван `.clear()`). - `oldValue` – старое значение (`null`, если ключ добавлен впервые). From 327adf59f0c07f367d8823e416b76561385efa54 Mon Sep 17 00:00:00 2001 From: BalashovDima <97038388+BalashovDima@users.noreply.github.com> Date: Thu, 6 Jan 2022 15:19:02 +0200 Subject: [PATCH 0016/1128] A typo correction --- 9-regular-expressions/10-regexp-greedy-and-lazy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/10-regexp-greedy-and-lazy/article.md b/9-regular-expressions/10-regexp-greedy-and-lazy/article.md index bd2053763c..ef60d17b7b 100644 --- a/9-regular-expressions/10-regexp-greedy-and-lazy/article.md +++ b/9-regular-expressions/10-regexp-greedy-and-lazy/article.md @@ -140,7 +140,7 @@ alert( str.match(regexp) ); // witch, broom ![](witch_lazy6.svg) -В этом примере мы увидели, как ленивый режим работает для `pattern:+?`. Квантификаторы `pattern:+?` и `pattern:??` работают аналогичным образом -- движок регулярного выражения увеличит количество совпадений, только если не сможет найти совпадение для оставшегося шаблона на текущей позиции. +В этом примере мы увидели, как ленивый режим работает для `pattern:+?`. Квантификаторы `pattern:*?` и `pattern:??` работают аналогичным образом -- движок регулярного выражения увеличит количество совпадений, только если не сможет найти совпадение для оставшегося шаблона на текущей позиции. **Ленивый режим включается только для квантификаторов с `?`.** From 5d66c360c6d2bcd97e1536c6a6f83f55001bdc63 Mon Sep 17 00:00:00 2001 From: Sergey Konovalenko Date: Sun, 9 Jan 2022 15:41:31 +0200 Subject: [PATCH 0017/1128] Update article.md --- 5-network/05-fetch-crossorigin/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5-network/05-fetch-crossorigin/article.md b/5-network/05-fetch-crossorigin/article.md index 9a452f6d87..68c77e1cbe 100644 --- a/5-network/05-fetch-crossorigin/article.md +++ b/5-network/05-fetch-crossorigin/article.md @@ -226,7 +226,7 @@ Access-Control-Expose-Headers: Content-Length,API-Key let response = await fetch('https://site.com/service.json', { method: 'PATCH', headers: { - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', 'API-Key': 'secret' } }); From d7bf1085baa33aae601818f82c420398ad70ab5b Mon Sep 17 00:00:00 2001 From: Sergey Konovalenko Date: Sun, 9 Jan 2022 17:40:35 +0200 Subject: [PATCH 0018/1128] Update article.md --- 5-network/06-fetch-api/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5-network/06-fetch-api/article.md b/5-network/06-fetch-api/article.md index 2b5c1ee02d..a3eff0d266 100644 --- a/5-network/06-fetch-api/article.md +++ b/5-network/06-fetch-api/article.md @@ -20,7 +20,7 @@ let promise = fetch(url, { // в зависимости от тела запроса "Content-Type": "text/plain;charset=UTF-8" }, - body: undefined // string, FormData, Blob, BufferSource или URLSearchParams + body: undefined, // string, FormData, Blob, BufferSource или URLSearchParams referrer: "about:client", // или "" для того, чтобы не послать заголовок Referer, // или URL с текущего источника referrerPolicy: "no-referrer-when-downgrade", // no-referrer, origin, same-origin... From b43f0bd7d6fe81c75a9451ed9a9513c053b5c7c3 Mon Sep 17 00:00:00 2001 From: Pavel Sokolovskii <57070095+sFlcn@users.noreply.github.com> Date: Tue, 11 Jan 2022 19:53:22 +0300 Subject: [PATCH 0019/1128] =?UTF-8?q?=D0=95=D0=B4=D0=B8=D0=BD=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B7=D0=BD=D0=BE=D0=B5=20=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/11-logical-operators/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 3337e324d5..ec2dcfcad3 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -70,7 +70,7 @@ if (hour < 10 || hour > 18 || isWeekend) { Расширенный алгоритм работает следующим образом. -При выполнении ИЛИ || с несколькими значениями: +При выполнении ИЛИ `||` с несколькими значениями: ```js result = value1 || value2 || value3; @@ -84,7 +84,7 @@ result = value1 || value2 || value3; Значение возвращается в исходном виде, без преобразования. -Другими словами, цепочка ИЛИ `"||"` возвращает первое истинное значение или последнее, если такое значение не найдено. +Другими словами, цепочка ИЛИ `||` возвращает первое истинное значение или последнее, если такое значение не найдено. Например: @@ -119,7 +119,7 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в Если бы и `currentUser`, и `defaultUser` были ложными, в качестве результата мы бы наблюдали `"unnamed"`. 2. **Сокращённое вычисление.** - Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется "сокращённым вычислением", поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения. + Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ `||` вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется "сокращённым вычислением", поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения. Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной. @@ -236,7 +236,7 @@ alert( 1 && 2 && 3 ); // 3 Таким образом, код `a && b || c && d` по существу такой же, как если бы выражения `&&` были в круглых скобках: `(a && b) || (c && d)`. ```` -Как и оператор ИЛИ, И `&&` иногда может заменять `if`. +Как и оператор ИЛИ `||`, И `&&` иногда может заменять `if`. К примеру: @@ -285,7 +285,7 @@ alert( !true ); // false alert( !0 ); // true ``` -В частности, двойное НЕ используют для преобразования значений к логическому типу: +В частности, двойное НЕ `!!` используют для преобразования значений к логическому типу: ```js run alert( !!"non-empty string" ); // true From 0c5a29129a80a0a668703d4bc633f6c3699bbc8d Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sat, 22 Jan 2022 10:38:55 +0300 Subject: [PATCH 0020/1128] minor fixes --- 1-js/04-object-basics/02-object-copy/variable-copy-value.svg | 2 +- images.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index 0d6ca67bc6..f12e7fc4c8 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Hello!"message"Hello!"phrase \ No newline at end of file +"Привет!"message"Привет!"phrase \ No newline at end of file diff --git a/images.yml b/images.yml index 1cb6ac2891..aeb39c11ea 100644 --- a/images.yml +++ b/images.yml @@ -410,3 +410,6 @@ event-order-bubbling.svg: position: "center" 'Most deeply': 'Самый глубоко' 'nested element': 'вложенный элемент' + +variable-copy-value.svg: + '"Hello!"': '"Привет!"' \ No newline at end of file From ffd1ca717620ea34afb49319504d8d391c44d16d Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sat, 22 Jan 2022 17:46:31 +0300 Subject: [PATCH 0021/1128] minor fixes --- 1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg | 2 +- images.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg index 9980c800b4..fcec4c722f 100644 --- a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg +++ b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg @@ -1 +1 @@ -НачалоНе знаете? “ECMAScript”!Правильно!What's the "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file +НачалоНе знаете? “ECMAScript”!Верно!What's the "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file diff --git a/images.yml b/images.yml index aeb39c11ea..f85bd04443 100644 --- a/images.yml +++ b/images.yml @@ -109,7 +109,7 @@ ifelse_task2.svg: text: "Не знаете?" position: "center" "Right!": - text: "Правильно!" + text: "Верно!" position: "center" "What's the ": text: "Каково" From 1ff3d7ae06566351cd626d5699bcc3a317bbeba7 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Sun, 23 Jan 2022 22:03:27 +0300 Subject: [PATCH 0022/1128] fixed markup about operator precedence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлены ошибки в указании приоритетов. (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Operator_Precedence) --- 1-js/02-first-steps/08-operators/article.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/02-first-steps/08-operators/article.md b/1-js/02-first-steps/08-operators/article.md index 677ebac556..d262764e21 100644 --- a/1-js/02-first-steps/08-operators/article.md +++ b/1-js/02-first-steps/08-operators/article.md @@ -185,18 +185,18 @@ alert( +apples + +oranges ); // 5 | Приоритет | Название | Обозначение | |------------|------|------| | ... | ... | ... | -| 17 | унарный плюс | `+` | -| 17 | унарный минус | `-` | -| 16 | возведение в степень | `**` | -| 15 | умножение | `*` | -| 15 | деление | `/` | +| 16 | унарный плюс | `+` | +| 16 | унарный минус | `-` | +| 15 | возведение в степень | `**` | +| 14 | умножение | `*` | +| 14 | деление | `/` | | 13 | сложение | `+` | | 13 | вычитание | `-` | | ... | ... | ... | | 3 | присваивание | `=` | | ... | ... | ... | -Так как "унарный плюс" имеет приоритет `17`, который выше, чем `13` у "сложения" (бинарный плюс), то в выражении `"+apples + +oranges"` сначала выполнятся унарные плюсы, а затем сложение. +Так как "унарный плюс" имеет приоритет `16`, который выше, чем `13` у "сложения" (бинарный плюс), то в выражении `"+apples + +oranges"` сначала выполнятся унарные плюсы, а затем сложение. ## Присваивание From f4842fc1320c08a205ea0990616fee2784bdac1b Mon Sep 17 00:00:00 2001 From: Sergei Date: Tue, 25 Jan 2022 19:22:18 +0300 Subject: [PATCH 0023/1128] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D1=8F=D0=B5?= =?UTF-8?q?=D1=82=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D1=83=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E=20Faux=20Columns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 20-css-for-js/4-float/article.md | 36 +++++++++++++++----------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/20-css-for-js/4-float/article.md b/20-css-for-js/4-float/article.md index 095f91a101..4ace898cc8 100644 --- a/20-css-for-js/4-float/article.md +++ b/20-css-for-js/4-float/article.md @@ -14,7 +14,7 @@ float: left | right | none | inherit; При применении этого свойства происходит следующее: -1. Элемент позиционируется как обычно, а затем *вынимается из документа потока* и сдвигается влево (для `left`) или вправо (для `right`) до того как коснётся либо границы родителя, либо другого элемента с `float`. +1. Элемент позиционируется как обычно, а затем _вынимается из документа потока_ и сдвигается влево (для `left`) или вправо (для `right`) до того как коснётся либо границы родителя, либо другого элемента с `float`. 2. Если пространства по горизонтали не хватает для того, чтобы вместить элемент, то он сдвигается вниз до тех пор, пока не начнёт помещаться. 3. Другие непозиционированные блочные элементы без `float` ведут себя так, как будто элемента с `float` нет, так как он убран из потока. 4. Строки (inline-элементы), напротив, "знают" о `float` и обтекают элемент по сторонам. @@ -23,9 +23,9 @@ float: left | right | none | inherit; 1. Элемент при наличии `float` получает `display:block`. - То есть, указав элементу, у которого `display:inline` свойство `float: left/right`, мы автоматически сделаем его блочным. В частности, для него будут работать `width/height`. + То есть, указав элементу, у которого `display:inline` свойство `float: left/right`, мы автоматически сделаем его блочным. В частности, для него будут работать `width/height`. - Исключением являются некоторые редкие `display` наподобие `inline-table` и `run-in` (см. [Relationships between 'display', 'position', and 'float'](http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)) + Исключением являются некоторые редкие `display` наподобие `inline-table` и `run-in` (см. [Relationships between 'display', 'position', and 'float'](http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)) 2. Ширина `float`-блока определяется по содержимому. (["CSS 2.1, 10.3.5"](http://www.w3.org/TR/CSS2/visudet.html#float-width)). @@ -44,14 +44,14 @@ float: left | right | none | inherit; [Её HTML-код](sandbox:winnie) выглядит примерно так: ```html - +

Текст...

Текст...

- +

Текст...

- +

Текст...

``` @@ -96,7 +96,7 @@ HTML будет такой: *!*
- +
Кадр из советского мультфильма
*/!* @@ -171,7 +171,7 @@ HTML будет такой: clear: left | right | both; ``` -Применение этого свойства сдвигает элемент вниз до тех пор, пока не закончатся `float'ы` слева/справа/с обеих сторон. +Применение этого свойства сдвигает элемент вниз до тех пор, пока не закончатся `float'ы` слева/справа/с обеих сторон. Применим его к заголовку `H2`: @@ -189,7 +189,7 @@ h2 { Теперь заголовок "Сова" прилегает снизу почти вплотную к картинке, с учётом её `margin-bottom`, но без своего большого отступа `margin-top`. -Таково поведение свойства `clear`. Оно сдвинуло элемент `h2` вниз ровно настолько, чтобы элементов `float` не было *сбоку от его верхней границы*. +Таково поведение свойства `clear`. Оно сдвинуло элемент `h2` вниз ровно настолько, чтобы элементов `float` не было _сбоку от его верхней границы_. Если посмотреть на элемент заголовка внимательно в инструментах разработчика, то можно заметить отступ `margin-top` у заголовка по-прежнему есть, но он располагается "за" элементом `float` и не учитывается при работе в `clear`. @@ -218,7 +218,7 @@ h2 { ## Заполнение блока-родителя -Итак, мы научились располагать другие элементы *под* `float`. Теперь рассмотрим следующую особенность. +Итак, мы научились располагать другие элементы _под_ `float`. Теперь рассмотрим следующую особенность. **Из-за того, что блок с `float` удалён из потока, родитель не выделяет под него места.** @@ -226,7 +226,6 @@ h2 { ```html
-

Винни-Пух

Картинка
@@ -239,7 +238,7 @@ h2 { ```css .hero { - background: #D2B48C; + background: #d2b48c; border: 1px solid red; } ``` @@ -282,16 +281,15 @@ h2 { ```html
-

Винни-Пух

Картинка

Текст.

-*!* + *!*
-*/!* + */!*
``` @@ -306,10 +304,10 @@ h2 { ```css .clearfix:after { content: "."; /* добавить содержимое: "." */ - display: block; /* сделать блоком, т.к. inline не может иметь clear */ - clear: both; /* с обеих сторон clear */ + display: block; /* сделать блоком, т.к. inline не может иметь clear */ + clear: both; /* с обеих сторон clear */ visibility: hidden; /* сделать невидимым, зачем нам точка внизу? */ - height: 0; /* сделать высоту 0, чтобы не занимал место */ + height: 0; /* сделать высоту 0, чтобы не занимал место */ } ``` @@ -419,4 +417,4 @@ h2 { В современных браузерах (кроме IE10-) эту же задачу лучше решает flexbox. -Для старых есть различные обходы и трюки, которые позволяют обойти проблему в ряде ситуаций, но они выходят за рамки нашего обсуждения. Если интересно -- посмотрите, например, [Faux Columns](http://goodline.spb.ru/III-05-002.html). +Для старых есть различные обходы и трюки, которые позволяют обойти проблему в ряде ситуаций, но они выходят за рамки нашего обсуждения. From 9b93df1bd8f3b03e8ffdfc59082324dfd9ea2ef5 Mon Sep 17 00:00:00 2001 From: Sergei Date: Tue, 25 Jan 2022 19:26:00 +0300 Subject: [PATCH 0024/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D1=82=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 20-css-for-js/4-float/article.md | 34 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/20-css-for-js/4-float/article.md b/20-css-for-js/4-float/article.md index 4ace898cc8..f121b7a9ba 100644 --- a/20-css-for-js/4-float/article.md +++ b/20-css-for-js/4-float/article.md @@ -14,7 +14,7 @@ float: left | right | none | inherit; При применении этого свойства происходит следующее: -1. Элемент позиционируется как обычно, а затем _вынимается из документа потока_ и сдвигается влево (для `left`) или вправо (для `right`) до того как коснётся либо границы родителя, либо другого элемента с `float`. +1. Элемент позиционируется как обычно, а затем *вынимается из документа потока* и сдвигается влево (для `left`) или вправо (для `right`) до того как коснётся либо границы родителя, либо другого элемента с `float`. 2. Если пространства по горизонтали не хватает для того, чтобы вместить элемент, то он сдвигается вниз до тех пор, пока не начнёт помещаться. 3. Другие непозиционированные блочные элементы без `float` ведут себя так, как будто элемента с `float` нет, так как он убран из потока. 4. Строки (inline-элементы), напротив, "знают" о `float` и обтекают элемент по сторонам. @@ -23,9 +23,9 @@ float: left | right | none | inherit; 1. Элемент при наличии `float` получает `display:block`. - То есть, указав элементу, у которого `display:inline` свойство `float: left/right`, мы автоматически сделаем его блочным. В частности, для него будут работать `width/height`. + То есть, указав элементу, у которого `display:inline` свойство `float: left/right`, мы автоматически сделаем его блочным. В частности, для него будут работать `width/height`. - Исключением являются некоторые редкие `display` наподобие `inline-table` и `run-in` (см. [Relationships between 'display', 'position', and 'float'](http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)) + Исключением являются некоторые редкие `display` наподобие `inline-table` и `run-in` (см. [Relationships between 'display', 'position', and 'float'](http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)) 2. Ширина `float`-блока определяется по содержимому. (["CSS 2.1, 10.3.5"](http://www.w3.org/TR/CSS2/visudet.html#float-width)). @@ -44,14 +44,14 @@ float: left | right | none | inherit; [Её HTML-код](sandbox:winnie) выглядит примерно так: ```html - +

Текст...

Текст...

- +

Текст...

- +

Текст...

``` @@ -96,7 +96,7 @@ HTML будет такой: *!*
- +
Кадр из советского мультфильма
*/!* @@ -171,7 +171,7 @@ HTML будет такой: clear: left | right | both; ``` -Применение этого свойства сдвигает элемент вниз до тех пор, пока не закончатся `float'ы` слева/справа/с обеих сторон. +Применение этого свойства сдвигает элемент вниз до тех пор, пока не закончатся `float'ы` слева/справа/с обеих сторон. Применим его к заголовку `H2`: @@ -189,7 +189,7 @@ h2 { Теперь заголовок "Сова" прилегает снизу почти вплотную к картинке, с учётом её `margin-bottom`, но без своего большого отступа `margin-top`. -Таково поведение свойства `clear`. Оно сдвинуло элемент `h2` вниз ровно настолько, чтобы элементов `float` не было _сбоку от его верхней границы_. +Таково поведение свойства `clear`. Оно сдвинуло элемент `h2` вниз ровно настолько, чтобы элементов `float` не было *сбоку от его верхней границы*. Если посмотреть на элемент заголовка внимательно в инструментах разработчика, то можно заметить отступ `margin-top` у заголовка по-прежнему есть, но он располагается "за" элементом `float` и не учитывается при работе в `clear`. @@ -218,7 +218,7 @@ h2 { ## Заполнение блока-родителя -Итак, мы научились располагать другие элементы _под_ `float`. Теперь рассмотрим следующую особенность. +Итак, мы научились располагать другие элементы *под* `float`. Теперь рассмотрим следующую особенность. **Из-за того, что блок с `float` удалён из потока, родитель не выделяет под него места.** @@ -226,6 +226,7 @@ h2 { ```html
+

Винни-Пух

Картинка
@@ -238,7 +239,7 @@ h2 { ```css .hero { - background: #d2b48c; + background: #D2B48C; border: 1px solid red; } ``` @@ -281,15 +282,16 @@ h2 { ```html
+

Винни-Пух

Картинка

Текст.

- *!* +*!*
- */!* +*/!*
``` @@ -304,10 +306,10 @@ h2 { ```css .clearfix:after { content: "."; /* добавить содержимое: "." */ - display: block; /* сделать блоком, т.к. inline не может иметь clear */ - clear: both; /* с обеих сторон clear */ + display: block; /* сделать блоком, т.к. inline не может иметь clear */ + clear: both; /* с обеих сторон clear */ visibility: hidden; /* сделать невидимым, зачем нам точка внизу? */ - height: 0; /* сделать высоту 0, чтобы не занимал место */ + height: 0; /* сделать высоту 0, чтобы не занимал место */ } ``` From 675f52bf99a07a76ec779335e92393007c312e41 Mon Sep 17 00:00:00 2001 From: Sergei Date: Tue, 25 Jan 2022 19:55:24 +0300 Subject: [PATCH 0025/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D1=82=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/5-loading/03-onload-onerror/article.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/2-ui/5-loading/03-onload-onerror/article.md b/2-ui/5-loading/03-onload-onerror/article.md index 56ab960dc8..b493e20294 100644 --- a/2-ui/5-loading/03-onload-onerror/article.md +++ b/2-ui/5-loading/03-onload-onerror/article.md @@ -41,8 +41,8 @@ document.head.append(script); *!* script.onload = function() { - // в скрипте создаётся вспомогательная функция с именем "_" - alert(_); // функция доступна + // в скрипте создаётся вспомогательная переменная с именем "_" + alert(_.VERSION); // отображает версию библиотеки }; */!* ``` @@ -64,7 +64,7 @@ document.head.append(script); *!* script.onerror = function() { - alert("Error loading " + this.src); // Ошибка загрузки https://example.com/404.js + alert("Ошибка загрузки " + this.src); // Ошибка загрузки https://example.com/404.js }; */!* ``` @@ -114,6 +114,7 @@ img.onerror = function() { Если мы используем скрипт с другого домена, и в нем имеется ошибка, мы не сможем узнать детали этой ошибки. Для примера давайте возьмём мини-скрипт `error.js`, который состоит из одного-единственного вызова функции, которой не существует: + ```js // 📁 error.js noSuchFunction(); From a54255b813597e265c48b1e11495517bae5bc7e2 Mon Sep 17 00:00:00 2001 From: Yuri Beliakov Date: Tue, 25 Jan 2022 23:28:07 +0300 Subject: [PATCH 0026/1128] Update article.md --- 1-js/99-js-misc/90-intl/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/90-intl/article.md b/1-js/99-js-misc/90-intl/article.md index e744d54e6a..ecca9b7a51 100644 --- a/1-js/99-js-misc/90-intl/article.md +++ b/1-js/99-js-misc/90-intl/article.md @@ -45,7 +45,7 @@ Также через суффикс `-u-*` можно указать расширения локалей, например `"th-TH-u-nu-thai"` -- тайский язык (`th`), используемый в Таиланде (`TH`), с записью чисел тайскими буквами (๐, ๑, ๒, ๓, ๔, ๕, ๖, ๗, ๘, ๙) . -Стандарт, который описывает локали -- [RFC 5646](http://tools.ietf.org/html/rfc5646), языки описаны в [IANA language registry](http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry). +Стандарт, который описывает локали -- [RFC 5646](https://datatracker.ietf.org/doc/html/rfc5646), языки описаны в [IANA language registry](http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry). Все методы принимают локаль в виде строки или массива, содержащего несколько локалей в порядке предпочтения. From 7736d72dab84275caa6e819c52a4d4810ba459b4 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sat, 29 Jan 2022 06:08:01 +0300 Subject: [PATCH 0027/1128] fixes #1430 --- 1-js/05-data-types/06-iterable/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/06-iterable/article.md b/1-js/05-data-types/06-iterable/article.md index 46bbdbb6d4..c8e6d98c10 100644 --- a/1-js/05-data-types/06-iterable/article.md +++ b/1-js/05-data-types/06-iterable/article.md @@ -30,7 +30,7 @@ let range = { 1. Когда цикл `for..of` запускается, он вызывает этот метод один раз (или выдаёт ошибку, если метод не найден). Этот метод должен вернуть *итератор* -- объект с методом `next`. 2. Дальше `for..of` работает *только с этим возвращённым объектом*. 3. Когда `for..of` хочет получить следующее значение, он вызывает метод `next()` этого объекта. -4. Результат вызова `next()` должен иметь вид `{done: Boolean, value: any}`, где `done=true` означает, что итерация закончена, в противном случае `value` содержит очередное значение. +4. Результат вызова `next()` должен иметь вид `{done: Boolean, value: any}`, где `done=true` означает, что цикл завершён, в противном случае `value` содержит очередное значение. Вот полная реализация `range` с пояснениями: @@ -47,7 +47,7 @@ range[Symbol.iterator] = function() { // 2. Далее, for..of работает только с этим итератором, запрашивая у него новые значения return { current: this.from, - last: this.to, + last: this.to, // 3. next() вызывается на каждой итерации цикла for..of next() { @@ -267,7 +267,7 @@ for (let char of str) { alert(chars); ``` -...Но гораздо короче. +...Но гораздо короче. Мы можем даже создать `slice`, который поддерживает суррогатные пары: From 2689ee00d2ea209bb3bfebb235246b26bbdd649c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=98=D0=BB?= =?UTF-8?q?=D1=8C=D0=B8=D0=BD?= <69390951+alexeyinn@users.noreply.github.com> Date: Tue, 1 Feb 2022 19:52:38 +0300 Subject: [PATCH 0028/1128] =?UTF-8?q?fix:=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8=D1=82=D0=B5=D1=82?= =?UTF-8?q?=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit По факту, если перейти по ссылке на таблицу приоритетов MDN, оператор "??" имеет приоритет "4", а не как сейчас указано в статье - "5" --- 1-js/02-first-steps/12-nullish-coalescing-operator/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md index 9160c2cb02..37b0b46241 100644 --- a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md +++ b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md @@ -104,7 +104,7 @@ alert(height ?? 100); // 0 ## Приоритет -Оператор `??` имеет довольно низкий приоритет: `5`, согласно [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). +Оператор `??` имеет довольно низкий приоритет: `4`, согласно [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). Таким образом, оператор `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`. Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки: From 2a8eb155beffb3f5d908d5c56fce5a124b137bcc Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Wed, 2 Feb 2022 21:23:59 +0300 Subject: [PATCH 0029/1128] Update article.md --- 2-ui/5-loading/02-script-async-defer/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/5-loading/02-script-async-defer/article.md b/2-ui/5-loading/02-script-async-defer/article.md index f5e427ae3a..e3f24b1481 100644 --- a/2-ui/5-loading/02-script-async-defer/article.md +++ b/2-ui/5-loading/02-script-async-defer/article.md @@ -37,7 +37,7 @@ ## defer -Атрибут `defer` сообщает браузеру, что он должен продолжать обрабатывать страницу и загружать скрипт в фоновом режиме, а затем запустить этот скрипт, когда страница загрузится. +Атрибут `defer` сообщает браузеру, что он должен продолжать обрабатывать страницу и загружать скрипт в фоновом режиме, а затем запустить этот скрипт, когда DOM дерево будет полностью построено. Вот тот же пример, что и выше, но с `defer`: From 97a344bea1fb5bf1d6fe059e79e631429b2c245a Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Wed, 2 Feb 2022 21:53:42 +0300 Subject: [PATCH 0030/1128] Update article.md --- 1-js/02-first-steps/10-ifelse/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/10-ifelse/article.md b/1-js/02-first-steps/10-ifelse/article.md index 4901721866..2e66ebacbd 100644 --- a/1-js/02-first-steps/10-ifelse/article.md +++ b/1-js/02-first-steps/10-ifelse/article.md @@ -153,7 +153,7 @@ let accessAllowed = (age > 18) ? true : false; let accessAllowed = age > 18 ? true : false; ``` -Но скобки делают код более читаемым, поэтому мы рекомендуем их использовать. +Но скобки улучшают читаемость, поэтому мы рекомендуем их использовать. ````smart В примере выше вы можете избежать использования оператора вопросительного знака `?`, т.к. сравнение само по себе уже возвращает `true/false`: From 781faa7d87c53ebc75f0e763d886f813badf3a87 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Wed, 2 Feb 2022 21:57:21 +0300 Subject: [PATCH 0031/1128] Update article.md --- 1-js/02-first-steps/10-ifelse/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/10-ifelse/article.md b/1-js/02-first-steps/10-ifelse/article.md index 2e66ebacbd..dcb429d21d 100644 --- a/1-js/02-first-steps/10-ifelse/article.md +++ b/1-js/02-first-steps/10-ifelse/article.md @@ -153,7 +153,7 @@ let accessAllowed = (age > 18) ? true : false; let accessAllowed = age > 18 ? true : false; ``` -Но скобки улучшают читаемость, поэтому мы рекомендуем их использовать. +Но скобки делают код более простым для восприятия, поэтому мы рекомендуем их использовать. ````smart В примере выше вы можете избежать использования оператора вопросительного знака `?`, т.к. сравнение само по себе уже возвращает `true/false`: From f526629efaa6eb850938279351f0bad9dd423b2f Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 3 Feb 2022 13:09:21 +0300 Subject: [PATCH 0032/1128] images minor --- .../10-destructuring-assignment/destructuring-complex.svg | 2 +- 1-js/06-advanced-functions/01-recursion/recursive-salaries.svg | 2 +- 1-js/11-async/02-promise-basics/promise-reject-1.svg | 2 +- 1-js/11-async/02-promise-basics/promise-resolve-1.svg | 2 +- .../12-generators-iterators/1-generators/generateSequence-2.svg | 2 +- .../12-generators-iterators/1-generators/generateSequence-3.svg | 2 +- 1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg | 2 +- .../10-size-and-scroll-window/document-client-width-height.svg | 2 +- 2-ui/1-document/11-coordinates/coordinates.svg | 2 +- .../2-events/02-bubbling-and-capturing/event-order-bubbling.svg | 2 +- 2-ui/2-events/03-event-delegation/bagua-bubble.svg | 2 +- 2-ui/99-ui-misc/03-event-loop/eventLoop.svg | 2 +- 5-network/05-fetch-crossorigin/xhr-preflight.svg | 2 +- 5-network/11-websocket/websocket-handshake.svg | 2 +- 7-animation/1-bezier-curve/bezier3-e.svg | 2 +- 7-animation/1-bezier-curve/bezier3.svg | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg b/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg index 8f6bcc033b..8a1ff1a934 100644 --- a/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg +++ b/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg b/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg index 61f32dbc08..bd874c5ba6 100644 --- a/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg +++ b/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-reject-1.svg b/1-js/11-async/02-promise-basics/promise-reject-1.svg index 1ed00b191b..777e477394 100644 --- a/1-js/11-async/02-promise-basics/promise-reject-1.svg +++ b/1-js/11-async/02-promise-basics/promise-reject-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-1.svg b/1-js/11-async/02-promise-basics/promise-resolve-1.svg index bb0b918db4..f1f34eaee1 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-1.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-2.svg b/1-js/12-generators-iterators/1-generators/generateSequence-2.svg index 4c64e983e1..7478543a4b 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-2.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-2.svg @@ -1 +1 @@ -{value: 1, done: false} \ No newline at end of file +{value: 1, done: false} \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-3.svg b/1-js/12-generators-iterators/1-generators/generateSequence-3.svg index 0af8e9efdc..d32b114f98 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-3.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-3.svg @@ -1 +1 @@ -{value: 2, done: false} \ No newline at end of file +{value: 2, done: false} \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg b/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg index acaa504456..8f75484e9c 100644 --- a/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg +++ b/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg @@ -1 +1 @@ -_name: "Guest" name: getter_name: "Admin"user (прокси)исходный useradmin[[Prototype]] \ No newline at end of file +_name: "Guest" name: getter_name: "Admin"user (прокси)исходный useradmin[[Prototype]] \ No newline at end of file diff --git a/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg b/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg index 65e77ae805..829d27ee85 100644 --- a/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg +++ b/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg @@ -1 +1 @@ -documentElement.clientHeightdocumentElement.clientWidth \ No newline at end of file +documentElement.clientHeightdocumentElement.clientWidth \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/coordinates.svg b/2-ui/1-document/11-coordinates/coordinates.svg index 169fc41027..261ff66966 100644 --- a/2-ui/1-document/11-coordinates/coordinates.svg +++ b/2-ui/1-document/11-coordinates/coordinates.svg @@ -1 +1 @@ -heightbottomxleftywidthrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top \ No newline at end of file +heightbottomxleftywidthrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top \ No newline at end of file diff --git a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg index d8d74720ec..fd2a13f7bc 100644 --- a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg +++ b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg @@ -1 +1 @@ -123Самый глубоко вложенный элемент \ No newline at end of file +123Самый глубоко вложенный элемент \ No newline at end of file diff --git a/2-ui/2-events/03-event-delegation/bagua-bubble.svg b/2-ui/2-events/03-event-delegation/bagua-bubble.svg index c4cd1ee1e2..4ae67102dd 100644 --- a/2-ui/2-events/03-event-delegation/bagua-bubble.svg +++ b/2-ui/2-events/03-event-delegation/bagua-bubble.svg @@ -1 +1 @@ -<table><td><strong>event.target \ No newline at end of file +<table><td><strong>event.target \ No newline at end of file diff --git a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg index fc50fe3104..848d1fed04 100644 --- a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg +++ b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg @@ -1 +1 @@ -...mousemoveскриптсобытийный циклочередь макрозадачsetTimeout \ No newline at end of file +...mousemoveскриптeven t циклmacrotas k макрозадачsetTimeout \ No newline at end of file diff --git a/5-network/05-fetch-crossorigin/xhr-preflight.svg b/5-network/05-fetch-crossorigin/xhr-preflight.svg index d1e724533b..d51a801582 100644 --- a/5-network/05-fetch-crossorigin/xhr-preflight.svg +++ b/5-network/05-fetch-crossorigin/xhr-preflight.svg @@ -1 +1 @@ -JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Method Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file +JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Method Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file diff --git a/5-network/11-websocket/websocket-handshake.svg b/5-network/11-websocket/websocket-handshake.svg index 8826fde83f..d3013be159 100644 --- a/5-network/11-websocket/websocket-handshake.svg +++ b/5-network/11-websocket/websocket-handshake.svg @@ -1 +1 @@ -БраузерСерверHTTP-запрос"Сервер, давай поговорим на WebSocket?"HTTP-ответ Давай!Протокол WebSocket \ No newline at end of file +БраузерСерверHTTP-запрос"Сервер, давай поговорим на WebSocket?"HTTP-ответ Давай!Протокол WebSocket \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-e.svg b/7-animation/1-bezier-curve/bezier3-e.svg index 4c5c741dc3..a892258c4a 100644 --- a/7-animation/1-bezier-curve/bezier3-e.svg +++ b/7-animation/1-bezier-curve/bezier3-e.svg @@ -1 +1 @@ -133 \ No newline at end of file +132 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3.svg b/7-animation/1-bezier-curve/bezier3.svg index 35f1eb6e39..ff95f88777 100644 --- a/7-animation/1-bezier-curve/bezier3.svg +++ b/7-animation/1-bezier-curve/bezier3.svg @@ -1 +1 @@ -132 \ No newline at end of file +132 \ No newline at end of file From 4d880e1465484cf90fdbe893a578b6d5a30b20af Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 3 Feb 2022 13:22:45 +0300 Subject: [PATCH 0033/1128] minor fixes --- 5-network/05-fetch-crossorigin/xhr-preflight.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5-network/05-fetch-crossorigin/xhr-preflight.svg b/5-network/05-fetch-crossorigin/xhr-preflight.svg index d51a801582..25d0b92840 100644 --- a/5-network/05-fetch-crossorigin/xhr-preflight.svg +++ b/5-network/05-fetch-crossorigin/xhr-preflight.svg @@ -1 +1 @@ -JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Method Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file +JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file From 5fba5bd0b5c74ecc2a3a2d644e006299aee8c951 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 3 Feb 2022 13:25:48 +0300 Subject: [PATCH 0034/1128] minor fixes --- 1-js/07-object-properties/01-property-descriptors/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/07-object-properties/01-property-descriptors/article.md b/1-js/07-object-properties/01-property-descriptors/article.md index 7f776c76fd..bd92844319 100644 --- a/1-js/07-object-properties/01-property-descriptors/article.md +++ b/1-js/07-object-properties/01-property-descriptors/article.md @@ -292,7 +292,7 @@ for (let key in user) { ...Но это не копирует флаги. Так что если нам нужен клон "получше", предпочтительнее использовать `Object.defineProperties`. -Другое отличие в том, что `for..in` игнорирует символьные свойства, а `Object.getOwnPropertyDescriptors` возвращает дескрипторы *всех* свойств, включая свойства-символы. +Другое отличие в том, что `for..in` игнорирует символьные и неперечислимые свойства, а `Object.getOwnPropertyDescriptors` возвращает дескрипторы *всех* свойств. ## Глобальное запечатывание объекта From 2f7f24e7fa52867be4ddc112c56d29e17aab3d02 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 3 Feb 2022 13:35:46 +0300 Subject: [PATCH 0035/1128] minor fixes --- 2-ui/99-ui-misc/03-event-loop/eventLoop.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg index 848d1fed04..eb4eecf1a9 100644 --- a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg +++ b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg @@ -1 +1 @@ -...mousemoveскриптeven t циклmacrotas k макрозадачsetTimeout \ No newline at end of file +...mousemoveскриптсобытийный циклочередь макрозадачsetTimeout \ No newline at end of file From 2835ef9d9950d317e9111cbcc8e41fc0609a59ae Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 3 Feb 2022 13:52:37 +0300 Subject: [PATCH 0036/1128] minor fixes --- 1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg | 2 +- images.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg index fcec4c722f..6e78489af1 100644 --- a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg +++ b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg @@ -1 +1 @@ -НачалоНе знаете? “ECMAScript”!Верно!What's the "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file +НачалоНе знаете? “ECMAScript”!Верно!Каково "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file diff --git a/images.yml b/images.yml index f85bd04443..c8a424e107 100644 --- a/images.yml +++ b/images.yml @@ -111,7 +111,7 @@ ifelse_task2.svg: "Right!": text: "Верно!" position: "center" - "What's the ": + "What's the": text: "Каково" position: "center" "“official” name of": From 2dc387c3efbc96fb21ff24fa548ce12990faab88 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Thu, 3 Feb 2022 14:58:36 +0300 Subject: [PATCH 0037/1128] minor fixes --- 1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg | 2 +- images.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg index 6e78489af1..bf9bf85761 100644 --- a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg +++ b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg @@ -1 +1 @@ -НачалоНе знаете? “ECMAScript”!Верно!Каково "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file +НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file diff --git a/images.yml b/images.yml index c8a424e107..65250cdf72 100644 --- a/images.yml +++ b/images.yml @@ -112,7 +112,7 @@ ifelse_task2.svg: text: "Верно!" position: "center" "What's the": - text: "Каково" + text: "Какое" position: "center" "“official” name of": text: "\"официальное название\"" From 7c6e3320cf34ffec02c5a02be9a5904fdc155e93 Mon Sep 17 00:00:00 2001 From: Anna <88550551+ping335@users.noreply.github.com> Date: Fri, 4 Feb 2022 12:08:48 +0300 Subject: [PATCH 0038/1128] update images.yml --- images.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/images.yml b/images.yml index 65250cdf72..40c175072d 100644 --- a/images.yml +++ b/images.yml @@ -115,7 +115,7 @@ ifelse_task2.svg: text: "Какое" position: "center" "“official” name of": - text: "\"официальное название\"" + text: "\"официальное\" название" position: "center" "Иначе": "" @@ -412,4 +412,4 @@ event-order-bubbling.svg: 'nested element': 'вложенный элемент' variable-copy-value.svg: - '"Hello!"': '"Привет!"' \ No newline at end of file + '"Hello!"': '"Привет!"' From b99305b8553b99e9634217cc05a3d8ebf78832b5 Mon Sep 17 00:00:00 2001 From: ilya sagitov <93482323+kroqos@users.noreply.github.com> Date: Sun, 6 Feb 2022 16:15:14 +0300 Subject: [PATCH 0039/1128] =?UTF-8?q?=D0=9B=D0=B8=D1=88=D0=BD=D1=8F=D1=8F?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=8F=D1=82=D0=B0=D1=8F=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=20=C2=AB=D0=B8=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 18472035b2..87e63726ed 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -365,6 +365,6 @@ welcome(); // теперь всё в порядке - Function Declaration обрабатываются перед выполнением блока кода. Они видны во всём блоке. - Функции, объявленные при помощи Function Expression, создаются, только когда поток выполнения достигает их. -В большинстве случаев, когда нам нужно создать функцию, предпочтительно использовать Function Declaration, т.к. функция будет видима до своего объявления в коде. Это позволяет более гибко организовывать код, и улучшает его читаемость. +В большинстве случаев, когда нам нужно создать функцию, предпочтительно использовать Function Declaration, т.к. функция будет видима до своего объявления в коде. Это позволяет более гибко организовывать код и улучшает его читаемость. Таким образом, мы должны прибегать к объявлению функций при помощи Function Expression в случае, когда синтаксис Function Declaration не подходит для нашей задачи. Мы рассмотрели несколько таких примеров в этой главе, и рассмотрим их ещё больше в будущем. From b49a7cbe6d4a638182ca3d3dfb253c48a2bc6815 Mon Sep 17 00:00:00 2001 From: shan-Boris <95038184+shan-Boris@users.noreply.github.com> Date: Mon, 7 Feb 2022 16:12:16 +0700 Subject: [PATCH 0040/1128] Update article.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пропущено объявление объекта "user" --- 1-js/04-object-basics/06-constructor-new/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index 075fd61fcc..97733dd2c1 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -51,7 +51,7 @@ function User(name) { } ``` -То есть, результат вызова `new User("Вася")` - это тот же объект, что и: +То есть, результат вызова `let user = new User("Вася")` - это тот же объект, что и: ```js let user = { From 7fd3912372a28ad51c85fa1496081063744144b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=98=D0=BB?= =?UTF-8?q?=D1=8C=D0=B8=D0=BD?= <69390951+alexeyinn@users.noreply.github.com> Date: Tue, 8 Feb 2022 16:01:20 +0300 Subject: [PATCH 0041/1128] =?UTF-8?q?fix:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D0=BE=D0=B1=D1=8A=D1=8F=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Может вызвать недопонимание. Для "Цикл 'For'", в примере, как положено переменная объявляется через let, а в самой таблице-разборе данного примера, "let" не упоминается и мы буд-то присваиваем что то i. В английской версии учебника, написано корректно. И в примере и в таблице объявление переменной через let упоминается - https://javascript.info/while-for#the-for-loop --- 1-js/02-first-steps/13-while-for/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index 7ba0c3740d..903543be67 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -106,7 +106,7 @@ for (let i = 0; i < 3; i++) { // выведет 0, затем 1, затем 2 | часть | | | |-------|----------|----------------------------------------------------------------------------| -| *начало* | `i = 0` | Выполняется один раз при входе в цикл | +| *начало* | `let i = 0` | Выполняется один раз при входе в цикл | | *условие* | `i < 3`| Проверяется *перед* каждой итерацией цикла. Если оно вычислится в `false`, цикл остановится. | | *шаг* | `i++` | Выполняется *после* тела цикла на каждой итерации *перед* проверкой условия. | | *тело* | `alert(i)`| Выполняется снова и снова, пока условие вычисляется в `true`. | From 1a32d0e7afd7c9c14f86c7d21d1be8684fe410e6 Mon Sep 17 00:00:00 2001 From: Vitalii Date: Tue, 8 Feb 2022 18:13:23 +0300 Subject: [PATCH 0042/1128] Update article.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Предлагаю немного привести к общему знаменателю происходящее в каждом из подразделов (статья и без того выглядит очень разорванной стилистически): - Описание синтаксиса в едином формате - Заголовки для каждого метода Дополнительно: - Маленькая грамматическая правка --- 1-js/11-async/05-promise-api/article.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/1-js/11-async/05-promise-api/article.md b/1-js/11-async/05-promise-api/article.md index 9e24a48b8e..300bf3895a 100644 --- a/1-js/11-async/05-promise-api/article.md +++ b/1-js/11-async/05-promise-api/article.md @@ -13,7 +13,7 @@ Синтаксис: ```js -let promise = Promise.all([...промисы...]); +let promise = Promise.all(iterable); ``` Метод `Promise.all` принимает массив промисов (может принимать любой перебираемый объект, но обычно используется массив) и возвращает новый промис. @@ -123,6 +123,12 @@ Promise.all([ [recent browser="new"] +Синтаксис: + +```js +let promise = Promise.allSettled(iterable); +``` + `Promise.all` завершается с ошибкой, если она возникает в любом из переданных промисов. Это подходит для ситуаций "всё или ничего", когда нам нужны *все* результаты для продолжения: ```js @@ -221,10 +227,12 @@ Promise.race([ ## Promise.resolve/reject -Методы `Promise.resolve` и `Promise.reject` редко используются в современном коде, так как синтаксис `async/await` (мы рассмотрим его [чуть позже](info:async-await)) делает его, в общем-то, не нужным. +Методы `Promise.resolve` и `Promise.reject` редко используются в современном коде, так как синтаксис `async/await` (мы рассмотрим его [чуть позже](info:async-await)) делает их, в общем-то, не нужными. Мы рассмотрим их здесь для полноты картины, а также для тех, кто по каким-то причинам не может использовать `async/await`. +### Promise.resolve + - `Promise.resolve(value)` создаёт успешно выполненный промис с результатом `value`. То же самое, что: From d90c451873eaa60cc750f68e899a611ed87366a4 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sat, 12 Feb 2022 16:47:31 +0300 Subject: [PATCH 0043/1128] Update article.md --- 1-js/06-advanced-functions/03-closure/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/03-closure/article.md b/1-js/06-advanced-functions/03-closure/article.md index 624d1cd8f5..0600e425f2 100644 --- a/1-js/06-advanced-functions/03-closure/article.md +++ b/1-js/06-advanced-functions/03-closure/article.md @@ -421,7 +421,7 @@ alert( counter2() ); // 0 (независимо) Когда выполнение попадает в блок `if`, для этого блока создаётся новое лексическое окружение. -У него есть ссылка на внешнее окружение, так что `phrase` может быть найдена. Но все переменные и Function Expression, объявленные внутри `if`, остаются в его лексическом окружении и не видны снаружи. Function Declaration, объявленные внутри блока, в строгом режиме также не видны снаружи. +У него есть ссылка на внешнее окружение, так что `phrase` может быть найдена. Но все переменные, Function Expression, а так же [Function Declaration](/function-expressions#function-expression-v-sravnenii-s-function-declaration) в строгом режиме, объявленные внутри `if`, остаются в его лексическом окружении и не видны снаружи. Например, после завершения `if` следующий `alert` не увидит `user`, что вызовет ошибку. From 219e72168d1fd5d7d46efc4b1f69e53cca5e2ce3 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sat, 12 Feb 2022 17:40:22 +0300 Subject: [PATCH 0044/1128] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=20=D0=BA=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=BC=D1=83=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B4=D1=83=20=D1=81=20=D0=B0=D0=BD=D0=B3=D0=BB.?= =?UTF-8?q?=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../11-logical-operators/9-check-login/solution.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md b/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md index 0a2ac5b641..3627f2368b 100644 --- a/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md +++ b/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md @@ -3,19 +3,19 @@ ```js run demo let userName = prompt("Кто там?", ''); -if (userName == 'Админ') { +if (userName === 'Админ') { let pass = prompt('Пароль?', ''); - if (pass == 'Я главный') { + if (pass === 'Я главный') { alert( 'Здравствуйте!' ); - } else if (pass == null) { + } else if (pass === '' || pass === null) { alert( 'Отменено' ); } else { alert( 'Неверный пароль' ); } -} else if (!userName) { +} else if (userName === '' || userName === null) { alert( 'Отменено' ); } else { alert( "Я вас не знаю" ); From f2a6982845214e5d21b478286f23abbfbd0354bb Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sat, 12 Feb 2022 17:48:26 +0300 Subject: [PATCH 0045/1128] =?UTF-8?q?=D0=9C=D0=B5=D0=BD=D1=8F=D0=B5=D1=82?= =?UTF-8?q?=20=D1=81=D0=BB=D0=BE=D0=B2=D0=BE=20=D1=80=D0=B5=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В соответсвии с англ. версией --- .../08-settimeout-setinterval/article.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/06-advanced-functions/08-settimeout-setinterval/article.md b/1-js/06-advanced-functions/08-settimeout-setinterval/article.md index 5677fc09a6..f83fbd7e79 100644 --- a/1-js/06-advanced-functions/08-settimeout-setinterval/article.md +++ b/1-js/06-advanced-functions/08-settimeout-setinterval/article.md @@ -132,11 +132,11 @@ setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000); Так что если вы запустите код выше и подождёте с закрытием `alert` несколько секунд, то следующий `alert` будет показан сразу, как только вы закроете предыдущий. Интервал времени между сообщениями `alert` будет короче, чем 2 секунды. ``` -## Рекурсивный setTimeout +## Вложенный setTimeout Есть два способа запускать что-то регулярно. -Один из них `setInterval`. Другим является рекурсивный `setTimeout`. Например: +Один из них `setInterval`. Другим является вложенный `setTimeout`. Например: ```js /** вместо: @@ -153,7 +153,7 @@ let timerId = setTimeout(function tick() { Метод `setTimeout` выше планирует следующий вызов прямо после окончания текущего `(*)`. -Рекурсивный `setTimeout` - более гибкий метод, чем `setInterval`. С его помощью последующий вызов может быть задан по-разному в зависимости от результатов предыдущего. +Вложенный `setTimeout` - более гибкий метод, чем `setInterval`. С его помощью последующий вызов может быть задан по-разному в зависимости от результатов предыдущего. Например, необходимо написать сервис, который отправляет запрос для получения данных на сервер каждые 5 секунд, но если сервер перегружен, то необходимо увеличить интервал запросов до 10, 20, 40 секунд... Вот псевдокод: @@ -176,7 +176,7 @@ let timerId = setTimeout(function request() { А если функции, которые мы планируем, ресурсоёмкие и требуют времени, то мы можем измерить время, затраченное на выполнение, и спланировать следующий вызов раньше или позже. -**Рекурсивный `setTimeout` позволяет задать задержку между выполнениями более точно, чем `setInterval`.** +**Вложенный `setTimeout` позволяет задать задержку между выполнениями более точно, чем `setInterval`.** Сравним два фрагмента кода. Первый использует `setInterval`: @@ -187,7 +187,7 @@ setInterval(function() { }, 100); ``` -Второй использует рекурсивный `setTimeout`: +Второй использует вложенный `setTimeout`: ```js let i = 1; @@ -217,7 +217,7 @@ setTimeout(function run() { ![](settimeout-interval.svg) -**Рекурсивный`setTimeout` гарантирует фиксированную задержку (здесь 100 мс).** +**Вложенный`setTimeout` гарантирует фиксированную задержку (здесь 100 мс).** Это потому, что новый вызов планируется в конце предыдущего. From e7277fe7f1734377550d31052cf3fc4014349662 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sat, 12 Feb 2022 18:21:35 +0300 Subject: [PATCH 0046/1128] =?UTF-8?q?=D0=98=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Фикс данного issue https://github.com/javascript-tutorial/ru.javascript.info/issues/1451 --- 2-ui/1-document/01-browser-environment/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/01-browser-environment/article.md b/2-ui/1-document/01-browser-environment/article.md index bcae22be2a..11e289fb3b 100644 --- a/2-ui/1-document/01-browser-environment/article.md +++ b/2-ui/1-document/01-browser-environment/article.md @@ -17,7 +17,7 @@ Например, здесь мы используем `window` как глобальный объект: -```js run +```js run global function sayHi() { alert("Hello"); } From a565890cca9ad21c430e86d6bc10c689a59a5997 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 13 Feb 2022 20:24:10 +0600 Subject: [PATCH 0047/1128] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B5=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B8=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Полагаю это должно выгладить так, если сравнивать с оригиналом https://learn.javascript.ru/while-for#tsikl-for --- 1-js/02-first-steps/13-while-for/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index 903543be67..ec49cbd8e9 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -108,8 +108,8 @@ for (let i = 0; i < 3; i++) { // выведет 0, затем 1, затем 2 |-------|----------|----------------------------------------------------------------------------| | *начало* | `let i = 0` | Выполняется один раз при входе в цикл | | *условие* | `i < 3`| Проверяется *перед* каждой итерацией цикла. Если оно вычислится в `false`, цикл остановится. | -| *шаг* | `i++` | Выполняется *после* тела цикла на каждой итерации *перед* проверкой условия. | -| *тело* | `alert(i)`| Выполняется снова и снова, пока условие вычисляется в `true`. | +| *тело* | `alert(i)` | Выполняется снова и снова, пока условие вычисляется в `true`. | +| *шаг* | `i++`| Выполняется *после* тела цикла на каждой итерации *перед* проверкой условия. | В целом, алгоритм работы цикла выглядит следующим образом: From d0e34a555cce7b60cb15b8a19dfe84816f502b28 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 13 Feb 2022 20:46:29 +0600 Subject: [PATCH 0048/1128] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=83?= =?UTF-8?q?=20#1376?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/javascript-tutorial/ru.javascript.info/issues/1376 --- .../04-private-protected-properties-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/04-private-protected-properties-methods/article.md b/1-js/09-classes/04-private-protected-properties-methods/article.md index 4a3694b9e4..75ddbe0477 100644 --- a/1-js/09-classes/04-private-protected-properties-methods/article.md +++ b/1-js/09-classes/04-private-protected-properties-methods/article.md @@ -178,7 +178,7 @@ new CoffeeMachine().setWaterAmount(100); ```smart header="Защищённые поля наследуются" Если мы унаследуем `class MegaMachine extends CoffeeMachine`, ничто не помешает нам обращаться к `this._waterAmount` или `this._power` из методов нового класса. -Таким образом защищённые методы, конечно же, наследуются. В отличие от приватных полей, в чём мы убедимся ниже. +Таким образом, защищенные поля естественным образом наследуются. В отличие от приватных полей, в чём мы убедимся ниже. ``` ## Приватное свойство "#waterLimit" From ff325624858b7c924b70a13f4f4dcd9c0b821f4e Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sun, 13 Feb 2022 19:09:27 +0300 Subject: [PATCH 0049/1128] Update article.md --- .../04-private-protected-properties-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/04-private-protected-properties-methods/article.md b/1-js/09-classes/04-private-protected-properties-methods/article.md index 75ddbe0477..229363ef01 100644 --- a/1-js/09-classes/04-private-protected-properties-methods/article.md +++ b/1-js/09-classes/04-private-protected-properties-methods/article.md @@ -178,7 +178,7 @@ new CoffeeMachine().setWaterAmount(100); ```smart header="Защищённые поля наследуются" Если мы унаследуем `class MegaMachine extends CoffeeMachine`, ничто не помешает нам обращаться к `this._waterAmount` или `this._power` из методов нового класса. -Таким образом, защищенные поля естественным образом наследуются. В отличие от приватных полей, в чём мы убедимся ниже. +Таким образом, защищённые поля, конечно же, наследуются. В отличие от приватных полей, в чём мы убедимся ниже. ``` ## Приватное свойство "#waterLimit" From afd93c7f894c6080bc22f9db5376ab16387281f0 Mon Sep 17 00:00:00 2001 From: Mikayel <90648291+mikayel00@users.noreply.github.com> Date: Sun, 13 Feb 2022 23:59:32 +0400 Subject: [PATCH 0050/1128] Update article.md --- 1-js/05-data-types/12-json/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index 3507de1542..fe954a9f0f 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -177,7 +177,7 @@ JSON.stringify(meetup); // Ошибка: Преобразование цикли Полный синтаксис `JSON.stringify`: ```js -let json = JSON.stringify(value[, replacer, space]) +let json = JSON.stringify(value,[ replacer, space]) ``` value From d61afcd9d9b3d837fa9f80d0eb94242f5e928a85 Mon Sep 17 00:00:00 2001 From: ovarn Date: Sun, 13 Feb 2022 22:26:14 +0100 Subject: [PATCH 0051/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D1=82=D0=B0=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/08-operators/article.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/1-js/02-first-steps/08-operators/article.md b/1-js/02-first-steps/08-operators/article.md index d262764e21..7f94327b4b 100644 --- a/1-js/02-first-steps/08-operators/article.md +++ b/1-js/02-first-steps/08-operators/article.md @@ -185,22 +185,22 @@ alert( +apples + +oranges ); // 5 | Приоритет | Название | Обозначение | |------------|------|------| | ... | ... | ... | -| 16 | унарный плюс | `+` | -| 16 | унарный минус | `-` | -| 15 | возведение в степень | `**` | -| 14 | умножение | `*` | -| 14 | деление | `/` | -| 13 | сложение | `+` | -| 13 | вычитание | `-` | +| 15 | унарный плюс | `+` | +| 15 | унарный минус | `-` | +| 14 | возведение в степень | `**` | +| 13 | умножение | `*` | +| 13 | деление | `/` | +| 12 | сложение | `+` | +| 12 | вычитание | `-` | | ... | ... | ... | -| 3 | присваивание | `=` | +| 2 | присваивание | `=` | | ... | ... | ... | -Так как "унарный плюс" имеет приоритет `16`, который выше, чем `13` у "сложения" (бинарный плюс), то в выражении `"+apples + +oranges"` сначала выполнятся унарные плюсы, а затем сложение. +Так как "унарный плюс" имеет приоритет `15`, который выше, чем `12` у "сложения" (бинарный плюс), то в выражении `"+apples + +oranges"` сначала выполнятся унарные плюсы, а затем сложение. ## Присваивание -Давайте отметим, что в таблице приоритетов также есть оператор присваивания `=`. У него один из самых низких приоритетов: `3`. +Давайте отметим, что в таблице приоритетов также есть оператор присваивания `=`. У него один из самых низких приоритетов: `2`. Именно поэтому, когда переменной что-либо присваивают, например, `x = 2 * 2 + 1`, то сначала выполнится арифметика, а уже затем произойдёт присваивание `=` с сохранением результата в `x`. From 197185aec2395cc1ea7d345d36b87d58df6eec8b Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Fri, 18 Feb 2022 00:42:31 +0300 Subject: [PATCH 0052/1128] Update article.md --- 1-js/05-data-types/12-json/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index fe954a9f0f..dca3a10fb5 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -177,7 +177,7 @@ JSON.stringify(meetup); // Ошибка: Преобразование цикли Полный синтаксис `JSON.stringify`: ```js -let json = JSON.stringify(value,[ replacer, space]) +let json = JSON.stringify(value, [replacer, space]) ``` value From a228e2a9115a260b1df4c6972ae67de31c185409 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Fri, 18 Feb 2022 01:37:16 +0300 Subject: [PATCH 0053/1128] Update solution.md Fixes https://github.com/javascript-tutorial/ru.javascript.info/issues/1353 --- .../05-array-methods/6-calculator-extendable/solution.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/1-js/05-data-types/05-array-methods/6-calculator-extendable/solution.md b/1-js/05-data-types/05-array-methods/6-calculator-extendable/solution.md index a0f6cbf5ca..85c8fd622c 100644 --- a/1-js/05-data-types/05-array-methods/6-calculator-extendable/solution.md +++ b/1-js/05-data-types/05-array-methods/6-calculator-extendable/solution.md @@ -1,5 +1,3 @@ - Обратите внимание, как хранятся методы. Они просто добавляются к внутреннему объекту. - Все тесты и числовые преобразования выполняются в методе `calculate`. В будущем он может быть расширен для поддержки более сложных выражений. - -[js src="_js/solution.js"] From 306a696a53f97be600204011e284b91580c620a4 Mon Sep 17 00:00:00 2001 From: ovarn Date: Fri, 18 Feb 2022 15:35:58 +0100 Subject: [PATCH 0054/1128] =?UTF-8?q?=D0=9E=D1=82=D1=81=D1=83=D1=82=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B0=D1=8F=20=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=20=D0=B7=D0=B0=D0=BF=D1=8F=D1=82=D0=BE?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 374f6d9172..3c63e16fb4 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -5,7 +5,7 @@ Он называется "функции-стрелки" или "стрелочные функции" (arrow functions), т.к. выглядит следующим образом: ```js -let func = (arg1, arg2, ...argN) => expression +let func = (arg1, arg2, ...argN) => expression; ``` ...Такой код создаёт функцию `func` с аргументами `arg1..argN` и вычисляет `expression` с правой стороны с их использованием, возвращая результат. From bd1dc8f4bf01bbd4b7e69eab986162862b01b8ab Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sat, 19 Feb 2022 11:42:36 +0600 Subject: [PATCH 0055/1128] =?UTF-8?q?=D0=9C=D0=BD=D0=B5=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D1=82=D1=81=D1=8F=20=D1=82=D0=B0=D0=BA=20=D0=B1?= =?UTF-8?q?=D1=83=D0=B4=D0=B5=D1=82=20=D0=B1=D0=BE=D0=BB=D0=B5=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ведь в оригинале это строка выглядит так: > The combination “infinite loop + break as needed” is great for situations when a loop’s condition must be checked not in the beginning or end of the loop, but in the middle or even in several places of its body. https://javascript.info/while-for#breaking-the-loop --- 1-js/02-first-steps/13-while-for/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index ec49cbd8e9..d886930d5d 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -231,7 +231,7 @@ alert( 'Сумма: ' + sum ); Директива `break` в строке `(*)` полностью прекращает выполнение цикла и передаёт управление на строку за его телом, то есть на `alert`. -Вообще, сочетание «бесконечный цикл + `break`» – отличная штука для тех ситуаций, когда условие, по которому нужно прерваться, находится не в начале или конце цикла, а посередине. +Вообще, сочетание «бесконечный цикл + `break`» – отличная штука для тех ситуаций, когда условие, по которому нужно прерваться, находится не в начале или конце цикла, а посередине или даже в нескольких местах его тела. ## Переход к следующей итерации: continue [#continue] From b58e73b9eb92194117badcc2e06ba1e86d6ad754 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 20 Feb 2022 01:30:57 +0600 Subject: [PATCH 0056/1128] =?UTF-8?q?=D0=94=D0=BB=D1=8F=20=D0=B8=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B8=D1=87=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=BE=D1=80=D0=B8=D0=B3=D0=B8=D0=BD=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/13-while-for/article.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index ec49cbd8e9..aae5803645 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -368,7 +368,18 @@ break label; // не прыгает к метке ниже label: for (...) ``` -Вызов `break/continue` возможен только внутри цикла, и метка должна находиться где-то выше этой директивы. +Директива `break` должна находиться внутри блока кода. Технически, подойдет любой маркированный блок кода, например: +```js +label: { + // ... + break label; // работает + // ... +} +``` + +...Хотя, в 99,9% случаев `break` используется внутри циклов, как мы видели в примерах выше. + +К слову 'continue' возможно только внутри цикла. ```` ## Итого From 01cf89caebee06ed8cffa523c7ba96ede0bd3e69 Mon Sep 17 00:00:00 2001 From: magkms Date: Sun, 20 Feb 2022 18:35:15 +1000 Subject: [PATCH 0057/1128] Update article.md db.version > event.oldVersion --- 6-data-storage/03-indexeddb/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/6-data-storage/03-indexeddb/article.md b/6-data-storage/03-indexeddb/article.md index 35f08ea5de..ee03975283 100644 --- a/6-data-storage/03-indexeddb/article.md +++ b/6-data-storage/03-indexeddb/article.md @@ -72,10 +72,10 @@ openRequest.onsuccess = function() { let openRequest = indexedDB.open("store", *!*2*/!*); // проверить существование указанной версии базы данных, обновить по мере необходимости: -openRequest.onupgradeneeded = function() { +openRequest.onupgradeneeded = function(event) { // версия существующей базы данных меньше 2 (или база данных не существует) let db = openRequest.result; - switch(db.version) { // существующая (старая) версия базы данных + switch(event.oldVersion) { // существующая (старая) версия базы данных case 0: // версия 0 означает, что на клиенте нет базы данных // выполнить инициализацию From efbb308bd3213a0684f88b33990da6e26a5551f2 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 20 Feb 2022 17:22:40 +0600 Subject: [PATCH 0058/1128] added the missing translation --- 1-js/02-first-steps/15-function-basics/article.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index b24625a5e6..3683201df8 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -175,6 +175,16 @@ showMessage(from, "Привет"); // *Аня*: Привет alert( from ); // Аня ``` +Как вы уже знаете, когда значение передается в качестве параметра функции, оно также называется аргументом. + +Другими словами, чтобы сформулировать эти термины прямо: + +Параметр - это переменная, указанная в круглых скобках в объявлении функции (это термин во время объявления). +Аргумент - это значение, которое передается функции при ее вызове (это термин времени вызова). +Мы объявляем функции со списком их параметров, затем вызываем их, передавая аргументы. + +В приведенном выше примере можно было бы сказать: "функция ShowMessage объявляется с двумя параметрами, затем вызывается с двумя аргументами: from и "Hello"". + ## Параметры по умолчанию Если параметр не указан, то его значением становится `undefined`. From 568689469b1dd124b51414a2603bedf74df2d978 Mon Sep 17 00:00:00 2001 From: ovarn Date: Sun, 20 Feb 2022 14:31:16 +0100 Subject: [PATCH 0059/1128] =?UTF-8?q?=D0=9E=D1=82=D1=81=D1=83=D1=82=D1=81?= =?UTF-8?q?=D0=B2=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 5-network/05-fetch-crossorigin/article.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/5-network/05-fetch-crossorigin/article.md b/5-network/05-fetch-crossorigin/article.md index 68c77e1cbe..3df1cda2af 100644 --- a/5-network/05-fetch-crossorigin/article.md +++ b/5-network/05-fetch-crossorigin/article.md @@ -207,13 +207,15 @@ Access-Control-Expose-Headers: Content-Length,API-Key Поэтому, чтобы избежать недопониманий, браузер не делает "непростые" запросы (которые нельзя было сделать в прошлом) сразу. Перед этим он посылает предварительный запрос, спрашивая разрешения. -Предварительный запрос использует метод `OPTIONS`, у него нет тела, но есть два заголовка: +Предварительный запрос использует метод `OPTIONS`, у него нет тела, но есть три заголовка: +- `Origin` содержит именно источник (домен/протокол/порт), без пути. - `Access-Control-Request-Method` содержит HTTP-метод "непростого" запроса. - `Access-Control-Request-Headers` предоставляет разделённый запятыми список его "непростых" HTTP-заголовков. Если сервер согласен принимать такие запросы, то он должен ответить без тела, со статусом 200 и с заголовками: +- `Access-Control-Allow-Origin` должен содержать разрешённый источник. - `Access-Control-Allow-Methods` должен содержать разрешённые методы. - `Access-Control-Allow-Headers` должен содержать список разрешённых заголовков. - Кроме того, заголовок `Access-Control-Max-Age` может указывать количество секунд, на которое нужно кешировать разрешения. Так что браузеру не придётся посылать предзапрос для последующих запросов, удовлетворяющих данным разрешениям. From 54d8b687dae313f64995d2360ea371cd4776c5b0 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 20 Feb 2022 20:42:21 +0600 Subject: [PATCH 0060/1128] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B0=D0=B3=D0=B0?= =?UTF-8?q?=D1=8E=20=D1=87=D1=82=D0=BE=20=D1=8F=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Единственное я не понял в чем разница между `js run no-beautify` и `js run` --- 1-js/02-first-steps/13-while-for/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index ec49cbd8e9..27b97ec380 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -212,7 +212,7 @@ for (;;) { Например, следующий код подсчитывает сумму вводимых чисел до тех пор, пока посетитель их вводит, а затем – выдаёт: -```js +```js run let sum = 0; while (true) { @@ -256,7 +256,7 @@ for (let i = 0; i < 10; i++) { ````smart header="Директива `continue` позволяет избегать вложенности" Цикл, который обрабатывает только нечётные значения, мог бы выглядеть так: -```js +```js run for (let i = 0; i < 10; i++) { if (i % 2) { From d4471ad42b8e72cca63d2fc0c360a5aab4bfcda6 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 00:35:07 +0600 Subject: [PATCH 0061/1128] a small change to match the original https://javascript.info/function-basics#default-values --- 1-js/02-first-steps/15-function-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index b24625a5e6..4c118795dd 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -185,7 +185,7 @@ alert( from ); // Аня showMessage("Аня"); ``` -Это не приведёт к ошибке. Такой вызов выведет `"Аня: undefined"`. В вызове не указан параметр `text`, поэтому предполагается, что `text === undefined`. +Это не приведёт к ошибке. Такой вызов выведет `"*Аня*: undefined"`. В вызове не указан параметр `text`, поэтому предполагается, что `text === undefined`. Если мы хотим задать параметру `text` значение по умолчанию, мы должны указать его после `=`: From 4d8f36ee8664678a198eb6644dba7d79411d6c53 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 15:46:26 +0600 Subject: [PATCH 0062/1128] more correct translation https://javascript.info/function-basics#function-naming --- 1-js/02-first-steps/15-function-basics/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index 4c118795dd..c3f243312b 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -354,7 +354,7 @@ return ( ## Выбор имени функции [#function-naming] -Функция - это действие. Поэтому имя функции обычно является глаголом. Оно должно быть простым, точным и описывать действие функции, чтобы программист, который будет читать код, получил верное представление о том, что делает функция. +Функция - это действие. Поэтому имя функции обычно является глаголом. Оно должно быть кратким, точным и описывать действие функции, чтобы программист, который будет читать код, получил верное представление о том, что делает функция. Как правило, используются глагольные префиксы, обозначающие общий характер действия, после которых следует уточнение. Обычно в командах разработчиков действуют соглашения, касающиеся значений этих префиксов. @@ -371,7 +371,7 @@ return ( ```js no-beautify showMessage(..) // показывает сообщение -getAge(..) // возвращает возраст (в каком-либо значении) +getAge(..) // возвращает возраст (получая его каким-то образом) calcSum(..) // вычисляет сумму и возвращает результат createForm(..) // создаёт форму (и обычно возвращает её) checkPermission(..) // проверяет доступ, возвращая true/false From 069742ee77a0ec0eaaf437382cfe27b4da6e1a81 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 15:58:53 +0600 Subject: [PATCH 0063/1128] a little change --- 1-js/02-first-steps/15-function-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index c3f243312b..5b519f8157 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -390,7 +390,7 @@ checkPermission(..) // проверяет доступ, возвращая true/ - `createForm` -- будет плохим выбором, если функция будет изменять документ, добавляя форму в него (должна только создавать форму и возвращать её). - `checkPermission` -- будет плохим выбором, если функция будет отображать сообщение с текстом `доступ разрешён/запрещён` (должна только выполнять проверку и возвращать её результат). -В этих примерах использовались общепринятые смыслы префиксов. Конечно, вы в команде можете договориться о других значениях, но обычно они мало отличаются от общепринятых. В любом случае вы и ваша команда должны точно понимать, что значит префикс, что функция с ним может делать, а чего не может. +В этих примерах использовались общепринятые смыслы префиксов. Конечно, вы в команде можете договориться о других значениях, но обычно они мало отличаются от общепринятых. В любом случае вы и ваша команда должны чётко понимать, что значит префикс, что функция с ним может делать, а чего не может. ``` ```smart header="Сверхкороткие имена функций" From aae809707c9ff04042e3611b02765ebac0841980 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 16:21:06 +0600 Subject: [PATCH 0064/1128] one more little fix in translation --- 1-js/02-first-steps/15-function-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index 5b519f8157..4b0ced36cc 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -396,7 +396,7 @@ checkPermission(..) // проверяет доступ, возвращая true/ ```smart header="Сверхкороткие имена функций" Имена функций, которые используются *очень часто*, иногда делают сверхкороткими. -Например, во фреймворке [jQuery](http://jquery.com) есть функция с именем `$`. В библиотеке [Lodash](http://lodash.com/) основная функция представлена именем `_`. +Например, фреймворк [jQuery](http://jquery.com) определяет функцию с помощью `$`. В библиотеке [Lodash](http://lodash.com/) основная функция представлена именем `_`. Это исключения. В основном имена функций должны быть в меру краткими и описательными. ``` From 66eb685137b1f8274ef0265738fa05096ad83f4f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 22:39:49 +0600 Subject: [PATCH 0065/1128] Updated the translation according to the English version --- .../16-function-expressions/article.md | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 87e63726ed..1733f80751 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -1,4 +1,4 @@ -# Function Expression +# Function Expressions Функция в JavaScript - это не магическая языковая структура, а особого типа значение. @@ -20,61 +20,70 @@ let sayHi = function() { }; ``` -В коде выше функция создаётся и явно присваивается переменной, как любое другое значение. По сути без разницы, как мы определили функцию, это просто значение, хранимое в переменной `sayHi`. +Тут мы можем увидеть переменную `SayHi`, получающую значение, новую функцию, созданную как `function() { alert("Привет"); }`. -Смысл обоих примеров кода одинаков: "создать функцию и поместить её значение в переменную `sayHi`". +Поскольку создание функции происходит в контексте выражения присваивания (с правой стороны от `=`), это *Function Expression*. -Мы можем даже вывести это значение с помощью `alert`: +Обратите внимание, что после ключевого слова `function` нет имени. Для Function Expression допускается опуск имени. + +Здесь мы сразу присваиваем ее переменной, так что смысл этих примеров кода один и тот же: "создать функцию и поместить её в переменную `sayHi`". + +В более сложных ситуациях, с которыми мы столкнемся позже, функция может быть создана и немедленно вызвана или запланирована для дальнейшего выполнения, нигде не сохраняясь, таким образом, оставаясь анонимной. + +## Функция - это значение + +Давайте повторим: независимо от того, как создается функция, функция - это значение. В обоих приведенных выше примерах функция хранится в переменной `SayHi`. + +Мы даже можем вывести это значение с помощью `alert`: ```js run function sayHi() { - alert( "Привет" ); + alert( "Hello" ); } *!* -alert( sayHi ); // выведет код функции +alert( sayHi ); // показывает код функции */!* ``` +Обратите внимание, что последняя строка не запускает функцию, потому что после `sayHi` нет круглых скобок. Есть языки программирования, в которых любое упоминание имени функции вызывает ее выполнение, но JavaScript не в их клубе. -Обратите внимание, что последняя строка не вызывает функцию `sayHi`, после её имени нет круглых скобок. Существуют языки программирования, в которых любое упоминание имени функции совершает её вызов. JavaScript - не один из них. - -В JavaScript функции - это значения, поэтому мы и обращаемся с ними, как со значениями. Код выше выведет строковое представление функции, которое является её исходным кодом. +В JavaScript функция - это значение, поэтому мы можем обращаться с ней как со значением. Приведенный выше код показывает его строковое представление, которое является её исходным кодом. -Конечно, функция - не обычное значение, в том смысле, что мы можем вызвать его при помощи скобок: `sayHi()`. +Конечно, функция - это особое значение, в том смысле, что мы можем вызвать ее как `sayHi()`. -Но всё же это значение. Поэтому мы можем делать с ним то же самое, что и с любым другим значением. +Но это все равно значение. Поэтому мы можем работать с ней так же, как и с другими видами значений. Мы можем скопировать функцию в другую переменную: ```js run no-beautify function sayHi() { // (1) создаём - alert( "Привет" ); + alert( "Hello" ); } let func = sayHi; // (2) копируем -func(); // Привет // (3) вызываем копию (работает)! -sayHi(); // Привет // прежняя тоже работает (почему бы нет) +func(); // Hello // (3) вызываем копию (работает)! +sayHi(); // Hello // эта тоже все еще работает (почему бы и нет) ``` Давайте подробно разберём всё, что тут произошло: -1. Объявление Function Declaration `(1)` создало функцию и присвоило её значение переменной с именем `sayHi`. +1. Объявление Function Declaration `(1)` создает функцию и помещает ее в переменную с именем `sayHi`. 2. В строке `(2)` мы скопировали её значение в переменную `func`. Обратите внимание (ещё раз): нет круглых скобок после `sayHi`. Если бы они были, то выражение `func = sayHi()` записало бы *результат вызова* `sayHi()` в переменную `func`, а не саму *функцию* `sayHi`. -3. Теперь функция может быть вызвана с помощью обеих переменных `sayHi()` и `func()`. +3. Теперь функция может вызываться как `sayHi()`, так и `func()`. -Заметим, что мы могли бы использовать и Function Expression для того, чтобы создать `sayHi` в первой строке: +Мы также могли бы использовать Function Expression для объявления `sayHi` в первой строке: ```js -let sayHi = function() { - alert( "Привет" ); +let sayHi = function() { // (1) создать + alert( "Hello" ); }; let func = sayHi; // ... ``` -Результат был бы таким же. +Все будет работать так же. ````smart header="Зачем нужна точка с запятой в конце?" У вас мог возникнуть вопрос: Почему в Function Expression ставится точка с запятой `;` на конце, а в Function Declaration нет: From 6e4ddc25afb64f4701ad65ca314ba76b8d47aaff Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 22:44:12 +0600 Subject: [PATCH 0066/1128] a little change --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 1733f80751..28de34edf6 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -179,7 +179,7 @@ ask( ``` -## Function Expression в сравнении с Function Declaration +## Function Expression против Function Declaration Давайте разберём ключевые отличия Function Declaration от Function Expression. From f8d0ba5883f4b7ae7f4423156121f9c758fdf3e6 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 22:49:19 +0600 Subject: [PATCH 0067/1128] one more minor change --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 28de34edf6..27f67b7c2a 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -210,7 +210,7 @@ ask( С Function Declaration всё иначе. -**Function Declaration можно использовать во всем скрипте (или блоке кода, если функция объявлена в блоке).** +**Function Declaration может быть вызвана раньше, чем она определена.** Другими словами, когда движок JavaScript *готовится* выполнять скрипт или блок кода, прежде всего он ищет в нём Function Declaration и создаёт все такие функции. Можно считать этот процесс "стадией инициализации". From 34ddea543b49ebed25286e91c9e41026955638dd Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 21 Feb 2022 23:00:12 +0600 Subject: [PATCH 0068/1128] Update article.md --- .../16-function-expressions/article.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 27f67b7c2a..35b80e888d 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -42,16 +42,16 @@ function sayHi() { } *!* -alert( sayHi ); // показывает код функции +alert( sayHi ); // выведет код функции */!* ``` -Обратите внимание, что последняя строка не запускает функцию, потому что после `sayHi` нет круглых скобок. Есть языки программирования, в которых любое упоминание имени функции вызывает ее выполнение, но JavaScript не в их клубе. +Обратите внимание, что последняя строка не вызывает функцию, потому что после `sayHi` нет круглых скобок. Есть языки программирования, в которых любое упоминание имени функции вызывает ее выполнение, но JavaScript не в их клубе. -В JavaScript функция - это значение, поэтому мы можем обращаться с ней как со значением. Приведенный выше код показывает его строковое представление, которое является её исходным кодом. +В JavaScript функция - это значение, поэтому мы можем обращаться с ней как со значением. Приведенный выше код показывает её строковое представление, которое является её исходным кодом. Конечно, функция - это особое значение, в том смысле, что мы можем вызвать ее как `sayHi()`. -Но это все равно значение. Поэтому мы можем работать с ней так же, как и с другими видами значений. +Но всё же это значение. Поэтому мы можем работать с ней так же, как и с другими видами значений. Мы можем скопировать функцию в другую переменную: @@ -68,14 +68,14 @@ sayHi(); // Hello // эта тоже все еще работает (по Давайте подробно разберём всё, что тут произошло: -1. Объявление Function Declaration `(1)` создает функцию и помещает ее в переменную с именем `sayHi`. +1. Объявление Function Declaration `(1)` создает функцию и помещает ее в переменную с именем `sayHi`. 2. В строке `(2)` мы скопировали её значение в переменную `func`. Обратите внимание (ещё раз): нет круглых скобок после `sayHi`. Если бы они были, то выражение `func = sayHi()` записало бы *результат вызова* `sayHi()` в переменную `func`, а не саму *функцию* `sayHi`. 3. Теперь функция может вызываться как `sayHi()`, так и `func()`. Мы также могли бы использовать Function Expression для объявления `sayHi` в первой строке: ```js -let sayHi = function() { // (1) создать +let sayHi = function() { // (1) создаём alert( "Hello" ); }; From dea16b1d67809554c5b77d10592948b5c9ae9de8 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Tue, 22 Feb 2022 01:11:59 +0600 Subject: [PATCH 0069/1128] Update article.md --- 1-js/02-first-steps/03-strict-mode/article.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/1-js/02-first-steps/03-strict-mode/article.md b/1-js/02-first-steps/03-strict-mode/article.md index da77812085..4e46b07998 100644 --- a/1-js/02-first-steps/03-strict-mode/article.md +++ b/1-js/02-first-steps/03-strict-mode/article.md @@ -51,6 +51,8 @@ alert("some code"); Иногда, когда `use strict` имеет значение, вы можете получить неправильные результаты. +Итак, как можно включить `use strict` в консоли? + Можно использовать `key:Shift+Enter` для ввода нескольких строк и написать в верхней строке `use strict`: ```js @@ -61,7 +63,7 @@ alert("some code"); В большинстве браузеров, включая Chrome и Firefox, это работает. -В старых браузерах консоль не учитывает такой `use strict`, там можно "оборачивать" код в функцию, вот так: +Если этого не происходит, например, в старом браузере, есть некрасивый, но надежный способ обеспечить `use strict`. Поместите его в такую обертку: ```js (function() { From 5c4055456fb08266aca463b5b1f207e4000afdff Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Tue, 22 Feb 2022 01:18:43 +0600 Subject: [PATCH 0070/1128] Update article.md --- 1-js/02-first-steps/16-function-expressions/article.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 35b80e888d..2471fa09fa 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -12,6 +12,8 @@ function sayHi() { Существует ещё один синтаксис создания функций, который называется *Function Expression* (Функциональное Выражение). +Это позволяет нам создавать новую функцию в середине любого выражения. + Оно выглядит вот так: ```js From d7503d0e6347bf3219190b92a2ea2d0b4918a814 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Tue, 22 Feb 2022 01:56:43 +0600 Subject: [PATCH 0071/1128] Update article.md --- .../16-function-expressions/article.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 2471fa09fa..88b60306cc 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -144,7 +144,7 @@ ask("Вы согласны?", showOk, showCancel); На практике подобные функции очень полезны. Основное отличие "реальной" функции `ask` от примера выше будет в том, что она использует более сложные способы взаимодействия с пользователем, чем простой вызов `confirm`. В браузерах такие функции обычно отображают красивые диалоговые окна. Но это уже другая история. -**Аргументы функции `ask` ещё называют *функциями-колбэками* или просто *колбэками*.** +**Аргументы `showOk` и `showCancel` функции `ask` называются *функциями обратного вызова* или просто *колбэками*.** Ключевая идея в том, что мы передаём функцию и ожидаем, что она вызовется обратно (от англ. "call back" - обратный вызов) когда-нибудь позже, если это будет необходимо. В нашем случае, `showOk` становится *колбэком*' для ответа "yes", а `showCancel` -- для ответа "no". @@ -175,7 +175,7 @@ ask( ```smart header="Функция - это значение, представляющее \"действие\"" Обычные значения, такие как строки или числа представляют собой *данные*. -Функции, с другой стороны, можно воспринимать как "действия". +Функции, с другой стороны, можно воспринимать как *действия*. Мы можем передавать их из переменной в переменную и запускать, когда захотим. ``` @@ -185,9 +185,9 @@ ask( Давайте разберём ключевые отличия Function Declaration от Function Expression. -Во-первых, синтаксис: как определить, что есть что в коде. +Во-первых, синтаксис: как отличить их друг от друга в коде. -- Function Declaration: функция объявляется отдельной конструкцией "function..." в основном потоке кода. +- *Function Declaration*: функция объявляется отдельной конструкцией "function..." в основном потоке кода. ```js // Function Declaration @@ -195,7 +195,7 @@ ask( return a + b; } ``` -- Function Expression: функция, созданная внутри другого выражения или синтаксической конструкции. В данном случае функция создаётся в правой части "выражения присваивания" `=`: +- *Function Expression*: функция, созданная внутри другого выражения или синтаксической конструкции. В данном случае функция создаётся в правой части "выражения присваивания" `=`: ```js // Function Expression @@ -252,9 +252,9 @@ let sayHi = function(name) { // (*) магии больше нет **В строгом режиме, когда Function Declaration находится в блоке `{...}`, функция доступна везде внутри блока. Но не снаружи него.** -Для примера давайте представим, что нам нужно создать функцию `welcome()` в зависимости от значения переменной `age`, которое мы получим во время выполнения кода. И затем запланируем использовать её когда-нибудь в будущем. +Для примера давайте представим, что нам нужно объявить функцию `welcome()` в зависимости от значения переменной `age`, которое мы получим во время выполнения кода. И затем запланируем использовать её когда-нибудь в будущем. -Такой код, использующий Function Declaration, работать не будет: +Если мы попробуем использовать Function Declaration, это не заработает так, как задумывалось: ```js run let age = prompt("Сколько Вам лет?", 18); @@ -285,7 +285,7 @@ welcome(); // Error: welcome is not defined Вот ещё один пример: ```js run -let age = 16; // присвоим для примера 16 +let age = 16; // возьмем в качестве примера 16 if (age < 18) { *!* @@ -319,7 +319,7 @@ welcome(); // Ошибка: welcome is not defined Верным подходом будет воспользоваться функцией, объявленной при помощи Function Expression, и присвоить значение `welcome` переменной, объявленной снаружи `if`, что обеспечит нам нужную видимость. -Такой код работает, как ожидалось: +Такой код заработает, как ожидалось: ```js run let age = prompt("Сколько Вам лет?", 18); @@ -345,7 +345,7 @@ welcome(); // теперь всё в порядке */!* ``` -Можно упростить этот код ещё сильнее, используя условный оператор `?`: +Или мы могли бы упростить это еще больше, используя условный оператор `?`: ```js run let age = prompt("Сколько Вам лет?", 18); @@ -371,8 +371,8 @@ welcome(); // теперь всё в порядке ## Итого - Функции - это значения. Они могут быть присвоены, скопированы или объявлены в любом месте кода. -- Если функция объявлена как отдельная инструкция в основном потоке кода, то это Function Declaration. -- Если функция была создана как часть выражения, то считается, что эта функция объявлена при помощи Function Expression. +- Если функция объявлена как отдельная инструкция в основном потоке кода, то это “Function Declaration”. +- Если функция была создана как часть выражения, то считается, что эта функция объявлена при помощи “Function Expression”. - Function Declaration обрабатываются перед выполнением блока кода. Они видны во всём блоке. - Функции, объявленные при помощи Function Expression, создаются, только когда поток выполнения достигает их. From e631d34c0f2db290538c264a230a00b7983576b4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Tue, 22 Feb 2022 13:27:00 +0600 Subject: [PATCH 0072/1128] =?UTF-8?q?Small=20adjustments=20to=20match=20th?= =?UTF-8?q?e=20original=D1=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 3c63e16fb4..892174239f 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -48,7 +48,7 @@ alert( sum(1, 2) ); // 3 alert( double(3) ); // 6 ``` -- Если нет аргументов, указываются пустые круглые скобки: +- Если аргументов нет, круглые скобки будут пустыми (но они должны присутствовать): ```js run let sayHi = () => alert("Hello!"); @@ -96,7 +96,9 @@ alert( sum(1, 2) ); // 3 ```smart header="Дальше будет ещё информация" Здесь мы рассмотрели функции-стрелки как способ писать меньше букв. Но это далеко не всё! -Стрелочные функции обладают другими интересными особенностями. Их изучение требует знания некоторых других возможностей языка JavaScript, поэтому мы вернёмся к стрелочным функциям позже, в главе . +Стрелочные функции обладают другими интересными особенностями. + +Чтобы изучить их более подробно, нам сначала нужно познакомиться с некоторыми другими аспектами JavaScript, поэтому мы вернёмся к стрелочным функциям позже, в главе . А пока мы можем использовать их для простых однострочных действий и колбэков. ``` From 98e05dddcbc47dba7d9a758800a1422e13317344 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Tue, 22 Feb 2022 13:49:53 +0600 Subject: [PATCH 0073/1128] some fixes https://learn.javascript.ru/debugging-chrome --- 1-js/03-code-quality/01-debugging-chrome/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index 16ee7fa48d..fee4b74cea 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -12,7 +12,7 @@ - Работая в Chrome, откройте [тестовую страницу](debugging/index.html). - Включите инструменты разработчика, нажав `key:F12` (Mac: `key:Cmd+Opt+I`). -- Щёлкните по панели `sources` ("исходный код"). +- Щёлкните по панели `Sources` ("исходный код"). При первом запуске получаем следующее: @@ -26,9 +26,9 @@ Интерфейс состоит из трёх зон: -1. В зоне **Resources** (Ресурсы) показаны файлы HTML, JavaScript, CSS, включая изображения, используемые на странице. Здесь также могут быть файлы различных расширений Chrome. -2. Зона **Source** показывает исходный код. -3. Наконец, зона **Information and control** (Сведения и контроль) отведена для отладки, вскоре мы к ней вернёмся. +1. В зоне **File Navigator** pane (панель для навигации файлов) показаны файлы HTML, JavaScript, CSS, включая изображения, используемые на странице. Здесь также могут быть файлы различных расширений Chrome. +2. Зона **Code Editor** pane показывает исходный код. +3. Наконец, зона **JavaScript Debugging** pane (панель отладки JavaScript) отведена для отладки, скоро мы к ней вернёмся. Чтобы скрыть список ресурсов и освободить экранное место для исходного кода, щёлкните по тому же переключателю . From f2fe83d1dce7691ccdb6c486b48d92726ba0c32d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Wed, 23 Feb 2022 18:52:51 +0600 Subject: [PATCH 0074/1128] some fixes --- 1-js/03-code-quality/02-coding-style/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/03-code-quality/02-coding-style/article.md b/1-js/03-code-quality/02-coding-style/article.md index ba57e624a3..9a3f29373b 100644 --- a/1-js/03-code-quality/02-coding-style/article.md +++ b/1-js/03-code-quality/02-coding-style/article.md @@ -109,7 +109,7 @@ if ( Существует два типа отступов: -- **Горизонтальные отступы: два или четыре пробела.** +- **Горизонтальные отступы: 2 или 4 пробела.** Горизонтальный отступ выполняется с помощью 2 или 4 пробелов, или символа табуляции (клавиша `key:Tab`). Какой из них выбрать - это уже на ваше усмотрение. Пробелы больше распространены. @@ -300,11 +300,11 @@ function pow(x, n) { Вот некоторые известные инструменты для проверки: -- [JSLint](http://www.jslint.com/) -- проверяет код на соответствие [стилю JSLint](http://jslint.com/index.html), в онлайн-интерфейсе вверху можно ввести код, а внизу -- различные настройки проверки, чтобы попробовать её в действии. -- [JSHint](http://www.jshint.com/) -- больше проверок, чем в JSLint. -- [ESLint](http://eslint.org/) -- пожалуй, самый современный линтер. +- [JSLint](https://www.jslint.com/) -- проверяет код на соответствие [стилю JSLint](https://www.jslint.com/index.html), в онлайн-интерфейсе вверху можно ввести код, а внизу -- различные настройки проверки, чтобы попробовать её в действии. +- [JSHint](https://jshint.com/) -- больше проверок, чем в JSLint. +- [ESLint](https://eslint.org/) -- пожалуй, самый современный линтер. -Все они, в общем-то, работают. Автор пользуется [ESLint](http://eslint.org/). +Все они, в общем-то, работают. Автор пользуется [ESLint](https://eslint.org/). Большинство линтеров интегрированы со многими популярными редакторами: просто включите плагин в редакторе и настройте стиль. From 2b2e7056bfe20b02ab4726cd8f9c1c5c5aca9a4c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sat, 26 Feb 2022 01:25:00 +0600 Subject: [PATCH 0075/1128] minor grammar fix and link update according to https://github.com/javascript-tutorial/en.javascript.info/pull/2862 --- 1-js/13-modules/02-import-export/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/13-modules/02-import-export/article.md b/1-js/13-modules/02-import-export/article.md index ecccec16e0..c633ded40e 100644 --- a/1-js/13-modules/02-import-export/article.md +++ b/1-js/13-modules/02-import-export/article.md @@ -93,7 +93,7 @@ say.sayBye('John'); Для этого есть несколько причин. -1. Современные инструменты сборки ([webpack](http://webpack.github.io) и другие) собирают модули вместе и оптимизируют их, ускоряя загрузку и удаляя неиспользуемый код. +1. Современные инструменты сборки ([webpack](https://webpack.js.org/) и другие) собирают модули вместе и оптимизируют их, чтобы ускорить загрузку и удаляя неиспользуемый код. Предположим, мы добавили в наш проект стороннюю библиотеку `say.js` с множеством функций: ```js @@ -394,7 +394,7 @@ export default class User { 2. `export * from './user.js'` реэкспортирует только именованные экспорты, исключая экспорт по умолчанию. - Если мы хотим реэкспортировать и именованные экспорты и экспорт по умолчанию, то понадобятся две инструкции: + Если мы хотим реэкспортировать и именованные экспорты и экспорты по умолчанию, то понадобятся две инструкции: ```js export * from './user.js'; // для реэкспорта именованных экспортов export {default} from './user.js'; // для реэкспорта по умолчанию From bbc18a439f5fae964596dfc47f7ef380e89ee11a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sat, 26 Feb 2022 01:26:45 +0600 Subject: [PATCH 0076/1128] Update article.md --- 1-js/13-modules/02-import-export/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/13-modules/02-import-export/article.md b/1-js/13-modules/02-import-export/article.md index c633ded40e..7055af37cf 100644 --- a/1-js/13-modules/02-import-export/article.md +++ b/1-js/13-modules/02-import-export/article.md @@ -93,7 +93,7 @@ say.sayBye('John'); Для этого есть несколько причин. -1. Современные инструменты сборки ([webpack](https://webpack.js.org/) и другие) собирают модули вместе и оптимизируют их, чтобы ускорить загрузку и удаляя неиспользуемый код. +1. Современные инструменты сборки ([webpack](https://webpack.js.org/) и другие) собирают модули вместе и оптимизируют их, чтобы ускорить загрузку и yдалить неиспользуемый код. Предположим, мы добавили в наш проект стороннюю библиотеку `say.js` с множеством функций: ```js From 9ca4a60bc73569756d5ed0613b805e1314412846 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 27 Feb 2022 01:10:01 +0600 Subject: [PATCH 0077/1128] Update article.md --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 88b60306cc..bf74fef7d0 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -105,7 +105,7 @@ let sayHi = function() { - Function Expression использует внутри себя инструкции присваивания `let sayHi = ...;` как значение. Это не блок кода, а выражение с присваиванием. Таким образом, точка с запятой не относится непосредственно к Function Expression, она лишь завершает инструкцию. ```` -## Функции-"колбэки" +## Функции - "колбэки" Рассмотрим ещё примеры функциональных выражений и передачи функции как значения. From a7a9e98fe201712d37075d32c3f80048ff299a5e Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 27 Feb 2022 16:07:57 +0600 Subject: [PATCH 0078/1128] Update article.md --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index bf74fef7d0..b153905458 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -34,7 +34,7 @@ let sayHi = function() { ## Функция - это значение -Давайте повторим: независимо от того, как создается функция, функция - это значение. В обоих приведенных выше примерах функция хранится в переменной `SayHi`. +Давайте повторим: независимо от того, как создается функция, функция - это значение. В обоих приведенных выше примерах функция хранится в переменной `sayHi`. Мы даже можем вывести это значение с помощью `alert`: From 7eee1bc2ad61eec2976bd57d3fb2103d81e1805a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 27 Feb 2022 16:26:45 +0600 Subject: [PATCH 0079/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index b153905458..0a4235ec6b 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -100,14 +100,14 @@ let sayHi = function() { }*!*;*/!* ``` -Ответ прост: -- Нет необходимости в `;` в конце блоков кода и синтаксических конструкций, которые их используют, таких как `if { ... }`, `for { }`, `function f { }` и т.д. -- Function Expression использует внутри себя инструкции присваивания `let sayHi = ...;` как значение. Это не блок кода, а выражение с присваиванием. Таким образом, точка с запятой не относится непосредственно к Function Expression, она лишь завершает инструкцию. +Ответ прост: Function Expression создается здесь как `function(...) {...}` внутри оператора присваивания: `let sayHi = …;`. Точка с запятой `;` рекомендуется ставить в конце инструкции, она не является частью синтаксиса функции. + +Точка с запятой была бы там для более простого назначения, такого как `let sayHi = 5;`, но она также существует для присваивания функции. ```` ## Функции - "колбэки" -Рассмотрим ещё примеры функциональных выражений и передачи функции как значения. +Давайте рассмотрим больше примеров передачи функций в виде значений и использования function expressions. Давайте напишем функцию `ask(question, yes, no)` с тремя параметрами: From c1289aba323d2cf49be31876d7b1e91a77c7ea1c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 27 Feb 2022 23:30:36 +0600 Subject: [PATCH 0080/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 0a4235ec6b..8f9ff53c90 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -285,7 +285,7 @@ welcome(); // Error: welcome is not defined Вот ещё один пример: ```js run -let age = 16; // возьмем в качестве примера 16 +let age = 16; // возьмем для примера 16 if (age < 18) { *!* From 12804e8143252c616f4b6a613aa0cdcc1bc60fbb Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Sun, 27 Feb 2022 23:58:11 +0600 Subject: [PATCH 0081/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 8f9ff53c90..2b7909128c 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -365,7 +365,7 @@ welcome(); // теперь всё в порядке Также функции вида `function f(…) {…}` чуть более заметны в коде, чем `let f = function(…) {…}`. Function Declaration легче "ловятся глазами". -...Но если Function Declaration нам не подходит по какой-то причине (мы рассмотрели это в примере выше), то можно использовать объявление при помощи Function Expression. +...Но если Function Declaration нам не подходит по какой-то причине или нам нужно условное объявление (мы рассмотрели это в примере выше), то следует использовать Function Expression. ``` ## Итого From 8ed5e67126c1b2d9063aba31fff0c75c64dd3f3c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 00:01:06 +0600 Subject: [PATCH 0082/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 2b7909128c..e7d0ca55d2 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -372,7 +372,7 @@ welcome(); // теперь всё в порядке - Функции - это значения. Они могут быть присвоены, скопированы или объявлены в любом месте кода. - Если функция объявлена как отдельная инструкция в основном потоке кода, то это “Function Declaration”. -- Если функция была создана как часть выражения, то считается, что эта функция объявлена при помощи “Function Expression”. +- Если функция была создана как часть выражения, то это “Function Expression”. - Function Declaration обрабатываются перед выполнением блока кода. Они видны во всём блоке. - Функции, объявленные при помощи Function Expression, создаются, только когда поток выполнения достигает их. From ad745d4071892c06bd8a55c5acde384a89a1ee58 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 00:08:42 +0600 Subject: [PATCH 0083/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index e7d0ca55d2..12a7f6e803 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -374,8 +374,8 @@ welcome(); // теперь всё в порядке - Если функция объявлена как отдельная инструкция в основном потоке кода, то это “Function Declaration”. - Если функция была создана как часть выражения, то это “Function Expression”. - Function Declaration обрабатываются перед выполнением блока кода. Они видны во всём блоке. -- Функции, объявленные при помощи Function Expression, создаются, только когда поток выполнения достигает их. +- Функции, объявленные при помощи Function Expression, создаются только когда поток выполнения достигает их. -В большинстве случаев, когда нам нужно создать функцию, предпочтительно использовать Function Declaration, т.к. функция будет видима до своего объявления в коде. Это позволяет более гибко организовывать код и улучшает его читаемость. +В большинстве случаев, когда нам нужно объявить функцию, Function Declaration предпочтительнее, потому что оно видно до самого объявления. Это дает нам больше гибкости в организации кода и обычно делает его более читабельным. -Таким образом, мы должны прибегать к объявлению функций при помощи Function Expression в случае, когда синтаксис Function Declaration не подходит для нашей задачи. Мы рассмотрели несколько таких примеров в этой главе, и рассмотрим их ещё больше в будущем. +Поэтому мы должны использовать Function Expression только тогда, когда Function Declaration не подходит для нашей задачи. Мы видели пару примеров этого в этой главе и увидим больше в будущем. From c807206a068ee81642e6317b1cba9e2a0561b682 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 00:10:28 +0600 Subject: [PATCH 0084/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index 12a7f6e803..aa5903498d 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -378,4 +378,4 @@ welcome(); // теперь всё в порядке В большинстве случаев, когда нам нужно объявить функцию, Function Declaration предпочтительнее, потому что оно видно до самого объявления. Это дает нам больше гибкости в организации кода и обычно делает его более читабельным. -Поэтому мы должны использовать Function Expression только тогда, когда Function Declaration не подходит для нашей задачи. Мы видели пару примеров этого в этой главе и увидим больше в будущем. +Поэтому мы должны использовать Function Expression только тогда, когда Function Declaration не подходит для нашей задачи. Мы видели пару примеров до этого в этой главе и увидим больше в будущем. From 0dc154dfcaf94a052bf63b89a7ea96b45f2adf09 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 00:11:44 +0600 Subject: [PATCH 0085/1128] smth --- 1-js/02-first-steps/16-function-expressions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index aa5903498d..e6163ac15b 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -378,4 +378,4 @@ welcome(); // теперь всё в порядке В большинстве случаев, когда нам нужно объявить функцию, Function Declaration предпочтительнее, потому что оно видно до самого объявления. Это дает нам больше гибкости в организации кода и обычно делает его более читабельным. -Поэтому мы должны использовать Function Expression только тогда, когда Function Declaration не подходит для нашей задачи. Мы видели пару примеров до этого в этой главе и увидим больше в будущем. +Таким образом мы должны использовать Function Expression только тогда, когда Function Declaration не подходит для нашей задачи. Мы видели пару примеров до этого в этой главе и увидим больше в будущем. From a71cbe0acf4a8e75bbed183ac9381b62cc907ed6 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 01:15:14 +0600 Subject: [PATCH 0086/1128] smth --- .../17-arrow-functions-basics/article.md | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 892174239f..443665bd45 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -1,6 +1,6 @@ # Функции-стрелки, основы -Существует ещё более простой и краткий синтаксис для создания функций, который часто лучше, чем синтаксис Function Expression. +Существует еще один очень простой и лаконичный синтаксис для создания функций, который часто лучше, чем Function Expression. Он называется "функции-стрелки" или "стрелочные функции" (arrow functions), т.к. выглядит следующим образом: @@ -8,9 +8,9 @@ let func = (arg1, arg2, ...argN) => expression; ``` -...Такой код создаёт функцию `func` с аргументами `arg1..argN` и вычисляет `expression` с правой стороны с их использованием, возвращая результат. +Это создает функцию `func`, которая принимает аргументы `arg1..argN`, затем вычисляет `expression` в правой части с их использованием и возвращает результат. -Другими словами, это более короткий вариант такой записи: +Другими словами, это сокращенная версия: ```js let func = function(arg1, arg2, ...argN) { @@ -18,12 +18,12 @@ let func = function(arg1, arg2, ...argN) { }; ``` -Давайте взглянем на конкретный пример: +Давайте рассмотрим конкретный пример: ```js run let sum = (a, b) => a + b; -/* Более короткая форма для: +/* Эта стрелочная функция представляет собой более короткую форму: let sum = function(a, b) { return a + b; @@ -34,7 +34,7 @@ alert( sum(1, 2) ); // 3 ``` -То есть, `(a, b) => a + b` задаёт функцию с двумя аргументами `a` и `b`, которая при запуске вычисляет выражение справа `a + b` и возвращает его результат. +Как вы можете видеть, `(a, b) => a + b` задаёт функцию, которая принимает два аргумента с именами `a` и `b`. При выполнении она вычисляет выражение `a + b` и возвращает результат. - Если у нас только один аргумент, то круглые скобки вокруг параметров можно опустить, сделав запись ещё короче: @@ -56,7 +56,7 @@ alert( sum(1, 2) ); // 3 sayHi(); ``` -Функции-стрелки могут быть использованы так же, как и Function Expression. +Стрелочные функции можно использовать так же, как и Function Expression. Например, для динамического создания функции: @@ -67,36 +67,36 @@ let welcome = (age < 18) ? () => alert('Привет') : () => alert("Здравствуйте!"); -welcome(); // теперь всё в порядке +welcome(); ``` -Поначалу функции-стрелки могут показаться необычными и трудночитаемыми, но это быстро пройдёт, как только глаза привыкнут к этим конструкциям. +Поначалу стрелочные функции могут показаться необычными и даже трудночитаемыми, но это быстро пройдёт по мере того, как глаза привыкнут к этим конструкциям. -Они очень удобны для простых однострочных действий, когда лень писать много букв. +Они очень удобны для простых однострочных действий, когда нам просто лень писать много слов. ## Многострочные стрелочные функции -В примерах выше аргументы использовались слева от `=>`, а справа вычислялось выражение с их значениями. +В приведенных выше примерах аргументы брались слева от `=>`, а затем справа вычислялось выражение с их значениями. -Порой нам нужно что-то посложнее, например, выполнить несколько инструкций. Это также возможно, нужно лишь заключить инструкции в фигурные скобки. И использовать `return` внутри них, как в обычной функции. +Иногда нам нужно что-то немного более сложное, например, несколько выражений или инструкций. Это также возможно, нужно лишь заключить их в фигурные скобки. Затем используйте обычный `return` внутри них. -Например: +Вроде этого: ```js run let sum = (a, b) => { // фигурная скобка, открывающая тело многострочной функции let result = a + b; *!* - return result; // при фигурных скобках для возврата значения нужно явно вызвать return + return result; // если мы используем фигурные скобки, то нам нужно явно указать "return" */!* }; alert( sum(1, 2) ); // 3 ``` -```smart header="Дальше будет ещё информация" -Здесь мы рассмотрели функции-стрелки как способ писать меньше букв. Но это далеко не всё! +```smart header="Еще многое впереди" +Здесь мы представили главной целью стрелочных функций краткость. Но это еще не всё! -Стрелочные функции обладают другими интересными особенностями. +Стрелочные функции обладают и другими интересными возможностями. Чтобы изучить их более подробно, нам сначала нужно познакомиться с некоторыми другими аспектами JavaScript, поэтому мы вернёмся к стрелочным функциям позже, в главе . @@ -105,7 +105,7 @@ alert( sum(1, 2) ); // 3 ## Итого -Функции-стрелки очень удобны для однострочных действий. Они бывают двух типов: +Стрелочные функции очень удобны для однострочных действий. Они бывают двух типов: -1. Без фигурных скобок: `(...args) => expression` -- правая сторона выражение: функция выполняет его и возвращает результат. -2. С фигурными скобками: `(...args) => { body }` -- скобки позволяют нам писать многострочные инструкции внутри функции, но при этом необходимо указывать директиву `return`, чтобы вернуть какое-либо значение. +1. Без фигурных скобок: `(...args) => expression` -- правая сторона выражение: функция вычисляет его и возвращает результат. +2. С фигурными скобками: `(...args) => { body }` -- скобки позволяют нам писать многострочные инструкции внутри функции, но при этом необходимо явно указывать директиву `return`, чтобы вернуть какое-либо значение. From c9732eb54a6e618019dd6212d2128cf990165bb9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 01:17:14 +0600 Subject: [PATCH 0087/1128] update the header --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 443665bd45..84f8c21b13 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -1,4 +1,4 @@ -# Функции-стрелки, основы +# Стрелочные функции, основы Существует еще один очень простой и лаконичный синтаксис для создания функций, который часто лучше, чем Function Expression. From 7305e13b4abd5abf15d491e2da7ce654b1978dd8 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 06:03:32 +0600 Subject: [PATCH 0088/1128] a change that increases readability --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 84f8c21b13..de9c25c9c5 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -34,7 +34,7 @@ alert( sum(1, 2) ); // 3 ``` -Как вы можете видеть, `(a, b) => a + b` задаёт функцию, которая принимает два аргумента с именами `a` и `b`. При выполнении она вычисляет выражение `a + b` и возвращает результат. +Как вы можете видеть, `(a, b) => a + b` задаёт функцию, которая принимает два аргумента с именами `a` и `b`. И при выполнении она вычисляет выражение `a + b` и возвращает результат. - Если у нас только один аргумент, то круглые скобки вокруг параметров можно опустить, сделав запись ещё короче: From a531f333940829c6a35a80c398a6a944ea88f194 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 06:07:30 +0600 Subject: [PATCH 0089/1128] a minor fix --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index de9c25c9c5..b8e913d345 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -39,10 +39,9 @@ alert( sum(1, 2) ); // 3 - Если у нас только один аргумент, то круглые скобки вокруг параметров можно опустить, сделав запись ещё короче: ```js run - // тоже что и - // let double = function(n) { return n * 2 } *!* let double = n => n * 2; + // примерно тоже что и: let double = function(n) { return n * 2 } */!* alert( double(3) ); // 6 From a125ce3d82b7c2d7935d8464ebbd08d8372ff4d8 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 06:27:49 +0600 Subject: [PATCH 0090/1128] A more inspiring title --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index b8e913d345..925429a1da 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -92,7 +92,7 @@ let sum = (a, b) => { // фигурная скобка, открывающая alert( sum(1, 2) ); // 3 ``` -```smart header="Еще многое впереди" +```smart header="Дальше - больше" Здесь мы представили главной целью стрелочных функций краткость. Но это еще не всё! Стрелочные функции обладают и другими интересными возможностями. From c5ab580a2b0fb0ed7314b4b03372a6c8389e97ae Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:38:22 +0600 Subject: [PATCH 0091/1128] fix term name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Возможно это было бы более правильно, ведь в русском переводе официальной документации принято такое название этого оператора https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator --- .../12-nullish-coalescing-operator/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md index 37b0b46241..b73525ae5e 100644 --- a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md +++ b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md @@ -1,10 +1,10 @@ -# Оператор объединения с null '??' +# Оператор нулевого слияния (??) [recent browser="new"] В этой статье мы будем говорить, что значение выражения "определено", если оно отличается от `null` или `undefined`. -Оператор объединения с null представляет собой два вопросительных знака `??`. +Оператор нулевого слияния представляет собой два вопросительных знака `??`. Результат выражения `a ?? b` будет следующим: - `a`, если значение `a` определено, @@ -12,7 +12,7 @@ То есть оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй. -Оператор объединения с null не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно "определённое". +Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно "определённое". Вот как можно переписать выражение `result = a ?? b`, используя уже знакомые нам операторы: @@ -76,7 +76,7 @@ alert(firstName || lastName || nickName || "Аноним"); // Суперкод Оператор ИЛИ `||` существует с самого появления JavaScript, поэтому ранее для решения похожих задач разработчики использовали именно его. -С другой стороны, сравнительно недавно в язык был добавлен оператор объединения с null `??` как раз потому, что многие были недовольны оператором `||`. +С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`. Важное различие между ними заключается в том, что: - `||` возвращает первое *истинное* значение. From 9613f8f6a7bf758fb663bc6a7659c6f8acd932b1 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:39:30 +0600 Subject: [PATCH 0092/1128] smth --- 1-js/02-first-steps/12-nullish-coalescing-operator/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md index b73525ae5e..950c8fdb51 100644 --- a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md +++ b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md @@ -153,7 +153,7 @@ alert(x); // 2 ## Итого -- Оператор объединения с null `??` — это быстрый способ выбрать первое "определённое" значение из списка. +- Оператор нулевого слияния `??` — это быстрый способ выбрать первое "определённое" значение из списка. Используется для присвоения переменным значений по умолчанию: From a312b25d7c015d3263319042418294b23800576a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Wed, 2 Mar 2022 02:55:32 +0600 Subject: [PATCH 0093/1128] ran file through eyo npm package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit placed the "ё" letters --- .../16-function-expressions/article.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/1-js/02-first-steps/16-function-expressions/article.md b/1-js/02-first-steps/16-function-expressions/article.md index e6163ac15b..eb36454b02 100644 --- a/1-js/02-first-steps/16-function-expressions/article.md +++ b/1-js/02-first-steps/16-function-expressions/article.md @@ -28,13 +28,13 @@ let sayHi = function() { Обратите внимание, что после ключевого слова `function` нет имени. Для Function Expression допускается опуск имени. -Здесь мы сразу присваиваем ее переменной, так что смысл этих примеров кода один и тот же: "создать функцию и поместить её в переменную `sayHi`". +Здесь мы сразу присваиваем её переменной, так что смысл этих примеров кода один и тот же: "создать функцию и поместить её в переменную `sayHi`". -В более сложных ситуациях, с которыми мы столкнемся позже, функция может быть создана и немедленно вызвана или запланирована для дальнейшего выполнения, нигде не сохраняясь, таким образом, оставаясь анонимной. +В более сложных ситуациях, с которыми мы столкнёмся позже, функция может быть создана и немедленно вызвана или запланирована для дальнейшего выполнения, нигде не сохраняясь, таким образом, оставаясь анонимной. ## Функция - это значение -Давайте повторим: независимо от того, как создается функция, функция - это значение. В обоих приведенных выше примерах функция хранится в переменной `sayHi`. +Давайте повторим: независимо от того, как создаётся функция, функция - это значение. В обоих приведённых выше примерах функция хранится в переменной `sayHi`. Мы даже можем вывести это значение с помощью `alert`: @@ -47,11 +47,11 @@ function sayHi() { alert( sayHi ); // выведет код функции */!* ``` -Обратите внимание, что последняя строка не вызывает функцию, потому что после `sayHi` нет круглых скобок. Есть языки программирования, в которых любое упоминание имени функции вызывает ее выполнение, но JavaScript не в их клубе. +Обратите внимание, что последняя строка не вызывает функцию, потому что после `sayHi` нет круглых скобок. Есть языки программирования, в которых любое упоминание имени функции вызывает её выполнение, но JavaScript не в их клубе. -В JavaScript функция - это значение, поэтому мы можем обращаться с ней как со значением. Приведенный выше код показывает её строковое представление, которое является её исходным кодом. +В JavaScript функция - это значение, поэтому мы можем обращаться с ней как со значением. Приведённый выше код показывает её строковое представление, которое является её исходным кодом. -Конечно, функция - это особое значение, в том смысле, что мы можем вызвать ее как `sayHi()`. +Конечно, функция - это особое значение, в том смысле, что мы можем вызвать её как `sayHi()`. Но всё же это значение. Поэтому мы можем работать с ней так же, как и с другими видами значений. @@ -65,12 +65,12 @@ function sayHi() { // (1) создаём let func = sayHi; // (2) копируем func(); // Hello // (3) вызываем копию (работает)! -sayHi(); // Hello // эта тоже все еще работает (почему бы и нет) +sayHi(); // Hello // эта тоже все ещё работает (почему бы и нет) ``` Давайте подробно разберём всё, что тут произошло: -1. Объявление Function Declaration `(1)` создает функцию и помещает ее в переменную с именем `sayHi`. +1. Объявление Function Declaration `(1)` создаёт функцию и помещает её в переменную с именем `sayHi`. 2. В строке `(2)` мы скопировали её значение в переменную `func`. Обратите внимание (ещё раз): нет круглых скобок после `sayHi`. Если бы они были, то выражение `func = sayHi()` записало бы *результат вызова* `sayHi()` в переменную `func`, а не саму *функцию* `sayHi`. 3. Теперь функция может вызываться как `sayHi()`, так и `func()`. @@ -100,7 +100,7 @@ let sayHi = function() { }*!*;*/!* ``` -Ответ прост: Function Expression создается здесь как `function(...) {...}` внутри оператора присваивания: `let sayHi = …;`. Точка с запятой `;` рекомендуется ставить в конце инструкции, она не является частью синтаксиса функции. +Ответ прост: Function Expression создаётся здесь как `function(...) {...}` внутри оператора присваивания: `let sayHi = …;`. Точка с запятой `;` рекомендуется ставить в конце инструкции, она не является частью синтаксиса функции. Точка с запятой была бы там для более простого назначения, такого как `let sayHi = 5;`, но она также существует для присваивания функции. ```` @@ -285,7 +285,7 @@ welcome(); // Error: welcome is not defined Вот ещё один пример: ```js run -let age = 16; // возьмем для примера 16 +let age = 16; // возьмём для примера 16 if (age < 18) { *!* @@ -345,7 +345,7 @@ welcome(); // теперь всё в порядке */!* ``` -Или мы могли бы упростить это еще больше, используя условный оператор `?`: +Или мы могли бы упростить это ещё больше, используя условный оператор `?`: ```js run let age = prompt("Сколько Вам лет?", 18); @@ -376,6 +376,6 @@ welcome(); // теперь всё в порядке - Function Declaration обрабатываются перед выполнением блока кода. Они видны во всём блоке. - Функции, объявленные при помощи Function Expression, создаются только когда поток выполнения достигает их. -В большинстве случаев, когда нам нужно объявить функцию, Function Declaration предпочтительнее, потому что оно видно до самого объявления. Это дает нам больше гибкости в организации кода и обычно делает его более читабельным. +В большинстве случаев, когда нам нужно объявить функцию, Function Declaration предпочтительнее, потому что оно видно до самого объявления. Это даёт нам больше гибкости в организации кода и обычно делает его более читабельным. Таким образом мы должны использовать Function Expression только тогда, когда Function Declaration не подходит для нашей задачи. Мы видели пару примеров до этого в этой главе и увидим больше в будущем. From 4c6ac05bc48ed4aa0d87e520a7f60f24f6e823dd Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Wed, 2 Mar 2022 02:58:50 +0600 Subject: [PATCH 0094/1128] just ran file through eyo npm package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit placed the "ё" letters, nothing more --- .../17-arrow-functions-basics/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 925429a1da..f7a8ee438d 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -1,6 +1,6 @@ # Стрелочные функции, основы -Существует еще один очень простой и лаконичный синтаксис для создания функций, который часто лучше, чем Function Expression. +Существует ещё один очень простой и лаконичный синтаксис для создания функций, который часто лучше, чем Function Expression. Он называется "функции-стрелки" или "стрелочные функции" (arrow functions), т.к. выглядит следующим образом: @@ -8,9 +8,9 @@ let func = (arg1, arg2, ...argN) => expression; ``` -Это создает функцию `func`, которая принимает аргументы `arg1..argN`, затем вычисляет `expression` в правой части с их использованием и возвращает результат. +Это создаёт функцию `func`, которая принимает аргументы `arg1..argN`, затем вычисляет `expression` в правой части с их использованием и возвращает результат. -Другими словами, это сокращенная версия: +Другими словами, это сокращённая версия: ```js let func = function(arg1, arg2, ...argN) { @@ -75,7 +75,7 @@ welcome(); ## Многострочные стрелочные функции -В приведенных выше примерах аргументы брались слева от `=>`, а затем справа вычислялось выражение с их значениями. +В приведённых выше примерах аргументы брались слева от `=>`, а затем справа вычислялось выражение с их значениями. Иногда нам нужно что-то немного более сложное, например, несколько выражений или инструкций. Это также возможно, нужно лишь заключить их в фигурные скобки. Затем используйте обычный `return` внутри них. @@ -93,7 +93,7 @@ alert( sum(1, 2) ); // 3 ``` ```smart header="Дальше - больше" -Здесь мы представили главной целью стрелочных функций краткость. Но это еще не всё! +Здесь мы представили главной целью стрелочных функций краткость. Но это ещё не всё! Стрелочные функции обладают и другими интересными возможностями. From c03e25caedd870a56987760f240dd248660af521 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Thu, 3 Mar 2022 05:42:38 +0600 Subject: [PATCH 0095/1128] smth --- 1-js/03-code-quality/01-debugging-chrome/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index fee4b74cea..60a02892b0 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -173,14 +173,14 @@ for (let i = 0; i < 5; i++) { Приостановить выполнение скрипта можно тремя способами: -1. Точками останова. -2. Использованием в коде команды `debugger`. +1. Точками останова (breakpoint). +2. Использованием в коде команд `debugger`. 3. При ошибке (если инструменты разработчика открыты и опция включена). При остановке мы можем отлаживать - проанализировать переменные и пошагово пройти по процессу, что поможет отыскать проблему. -Нами описаны далеко не все инструменты разработчика. С полным руководством можно ознакомиться здесь: . +В инструментах разработчика гораздо больше опций, чем описано здесь. С полным руководством можно ознакомиться здесь: . -Для простой отладки вполне достаточно сведений из этой главы, но в дальнейшем рекомендуем вам изучить официальное руководство, если вы собираетесь разрабатывать для браузеров. +Информации из этой главы достаточно, чтобы начать отладку, но позже, особенно если вы много работаете с браузером, пожалуйста, перейдите туда и ознакомьтесь с более расширенными возможностями инструментов разработчика. -И, конечно, вы можете просто покликать в разных местах инструментов разработчика. Пожалуй, это наискорейший способ ими овладеть. Не забывайте про правый клик мыши и контекстные меню! +И, конечно, вы можете щёлкнуть по различным местам инструментов разработки и просто посмотреть, что появляется. Пожалуй, это наискорейший способ ими овладеть. Не забывайте про правый клик мыши и контекстные меню! From e2770bfbc7a095557af6b509a112f7bf3f22a981 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Thu, 3 Mar 2022 05:45:17 +0600 Subject: [PATCH 0096/1128] smth --- 1-js/03-code-quality/01-debugging-chrome/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index 60a02892b0..3e2e4d45c1 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -156,7 +156,7 @@ function hello(name) { Если нужно что-то вывести в консоль из кода, применяется функция `console.log`. -К примеру, выведем в консоль значения от нуля до четырёх: +Например, это выводит в консоль значения от `0` до `4`: ```js run // чтобы увидеть результат, сначала откройте консоль From c0b1e6dce8fb208710f00ead167d0783f2d3f082 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Fri, 4 Mar 2022 02:19:45 +0600 Subject: [PATCH 0097/1128] smth --- .../01-debugging-chrome/article.md | 90 +++++++++++-------- 1 file changed, 51 insertions(+), 39 deletions(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index 3e2e4d45c1..9a0af9f9f6 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -46,27 +46,26 @@ Давайте разберёмся, как работает код нашей [тестовой страницы](debugging/index.html). В файле `hello.js` щёлкните по строчке номер `4`. Да, щёлкайте именно по самой цифре, не по коду. -Ура! Вы поставили точку останова. А теперь щёлкните по цифре `8` на восьмой линии. Номер строки будет окрашен в синий цвет. +Ура! Вы поставили точку останова. А теперь щёлкните по цифре `8` на восьмой линии. -Вот что в итоге должно получиться: +Вот что в итоге должно получиться (синим это те места, по которым вы должны щелкнуть): ![](chrome-sources-breakpoint.svg) *Точка останова* – это участок кода, где отладчик автоматически приостановит исполнение JavaScript. -Пока исполнение поставлено "на паузу", мы можем просмотреть текущие значения переменных, выполнить команды в консоли, одним словом, мы выполняем отладку кода. +Пока исполнение поставлено "на паузу", мы можем просмотреть текущие значения переменных, выполнить команды в консоли, другими словами, выполнить отладку кода. В правой части графического интерфейса мы видим список точек останова. А когда таких точек выставлено много, да ещё и в разных файлах, этот список поможет эффективно ими управлять: -- Быстро переместиться к любой точке останова в коде – нужно щёлкнуть по точке в правой части экрана. -- Временно деактивировать точку – в общем списке снимите галочку напротив ненужной в данный момент точки. -- Удалить точку – щёлкните по ней правой кнопкой мыши и выберите Remove (Удалить). +- Быстро перейдите к точке останова в коде (нажав на нее на правой панели). +- Временно отключите точку останова, сняв с нее галочку. +- Удалите точку останова, щелкнув правой кнопкой мыши и выбрав Remove (Удалить). - ...и так далее. ```smart header="Условные точки останова" -Можно задать и так называемую *условную* точку останова – щёлкните правой кнопкой мыши по номеру строки в коде. Если задать выражение, то именно при его истинности выполнение кода будет приостановлено. - -Этот метод используется, когда выполнение кода нужно остановить при присвоении определённого выражения какой-либо переменной или при определённых параметрах функции. +*Щелчок правой кнопкой мыши* по номеру строки позволяет создать *условную* точку останова. Она сработает только в тот момент, когда вы задали выражение, и если оно истинно, то выполнение кода будет приостановлено. +Это удобно, когда нам нужно остановиться только для определенного значения переменной или для определенных параметров функции. ``` ## Команда Debugger @@ -78,14 +77,14 @@ function hello(name) { let phrase = `Привет, ${name}!`; *!* - debugger; // <-- здесь выполнение прерывается + debugger; // <-- тут отладчик остановится */!* say(phrase); } ``` -Способ удобен тем, что можно продолжить работать в редакторе кода без необходимости переключения в браузер для выставления точки останова. +Это очень удобно, когда мы находимся в редакторе кода и не хотим переключаться на браузер и просматривать скрипт в инструментах разработчика, чтобы установить точку останова. ## Остановимся и оглядимся @@ -98,63 +97,76 @@ function hello(name) { Чтобы понять, что происходит в коде, щёлкните по стрелочкам справа: -1. **`Watch` показывает текущие значения выражений.** - - Нажмите на `+` и введите выражение. В процессе выполнения отладчик автоматически пересчитывает и выводит его значение. +1. **`Watch`– показывает текущие значения для любых выражений.** -2. **`Call Stack` показывает последовательность вызовов функций.** + Вы можете нажать на `+` и ввести выражение. Отладчик покажет его значение в любой момент, автоматически пересчитав его в процессе выполнения. - В нашем примере отладчик работает с функцией `hello()`, вызванной скриптом из файла `index.html` (там нет функции, поэтому вызов "анонимный"). +2. **`Call Stack` – показывает цепочку вложенных вызовов.** + + В текущий момент отладчик находится внутри вызова `hello()`, вызываемого скриптом в `index.html` (там нет функции, поэтому она называется “анонимной”). - При нажатии на элемент списка (например, на "anonymous") отладчик переходит к соответствующему коду, и нам представляется возможность его проанализировать. + Если вы нажмете на элемент стека (например, "anonymous"), отладчик перейдет к соответствующему коду, и нам представляется возможность его проанализировать. 3. **`Scope` показывает текущие переменные.** - В `Local` отображаются локальные переменные функций, а их значения подсвечены в исходном коде. + `Local` показывает локальные переменные функций, а их значения подсвечены прямо в исходном коде. - В `Global` перечисляются глобальные переменные (т.е. объявленные за пределами функций). + В `Global` перечисляются глобальные переменные (то есть вне каких-либо функций). - Не обращайте пока внимание на ключевое слово `this` – его мы изучим чуть позже. + Там также есть ключевое слово `this`, которое мы еще не изучали, но скоро сделаем это. ## Пошаговое выполнение скрипта -А теперь давайте *пошагаем* по нашему коду. +А теперь давайте *пошагаем* по нашему скрипту. -В правой части панели для этого есть несколько кнопок. Рассмотрим их. - - – продолжить выполнение. Быстрая клавиша – `key:F8`. -: Возобновляет выполнение кода. Если больше нет точек останова, отладчик прекращает работу и позволяет приложению работать дальше. +Для этого есть кнопки в верхней части правой панели. Давайте рассмотрим их. + + – "Resume": продолжить выполнение, быстрая клавиша `key:F8`. +: Возобновляет выполнение кода. Если больше нет точек останова, отладчик прекращает работу и выполнение просто продолжается. Вот, что мы увидим, кликнув на неё: ![](chrome-sources-debugger-trace-1.svg) - Выполнение кода возобновилось, дошло до другой точки останова внутри `say()`, и отладчик снова приостановил выполнение. Обратите внимание на пункт "Call stack" справа: в списке появился ещё один вызов. Мы теперь внутри функции `say()`. + Выполнение кода возобновилось, дошло до другой точки останова внутри `say()`, и отладчик снова приостановил выполнение. Обратите внимание на пункт "Call stack" справа: в списке появился ещё один вызов. Сейчас мы внутри `say()`. + + – "Step": выполнить следующую команду, быстрая клавиша `key:F9`. +: Выполняет следующую инструкцию. Если мы нажмем на нее сейчас, появится `alert`. + + Нажатие на эту кнопку снова и снова приведет к пошаговому выполнению всех инструкций скрипта одного за другим. + + – "Step over": выполнить следующую команду, но *не заходя в функцию*, быстрая клавиша `key:F10`. +: Подобно предыдущей команде "Step", но ведет себя по-другому, если следующая инкструкция является вызовом функции. То есть имеется ввиду: не встроенная, как `alert`, а наша собственная функция. + + Команда "Step" переходит в неё и приостанавливает выполнение в первой строке, в то время как "Step over" незаметно выполняет вызов вложенной функции, пропуская внутренности функции. + + Затем выполнение приостанавливается сразу после этой функции. + + Это хорошо, если у нас нет цели видеть, что происходит внутри вызова функции. - – сделать шаг (выполнить следующую команду), *не заходя в функцию*. Быстрая клавиша – `key:F10`. -: Если мы нажмём на неё - будет вызван `alert`. Важно: на месте `alert` может быть любая другая функция, выполнение просто *перешагнёт через неё*, полностью игнорируя её содержимое. + – "Step into", быстрая клавиша `key:F11`. +: Это похоже на "Step", но ведет себя по-другому в случае асинхронных вызовов функций. Если вы только начинаете изучать JavaScript, то можете не обращать внимания на разницу, так как у нас еще нет асинхронных вызовов. - – сделать шаг. Быстрая клавиша – `key:F11`. -: В отличие от предыдущего примера, здесь мы "заходим" во вложенные функции и шаг за шагом проходим по скрипту. + На будущее просто помните, что команда "Step" игнорирует асинхронные действия, такие как `setTimeout` (вызов функции по расписанию), которые выполняются позже. "Step into" входит в их код, ожидая их, если это необходимо. См. [DevTools manual](https://developers.google.com/web/updates/2018/01/devtools#async) для получения более подробной информации. - – продолжить выполнение до завершения текущей функции. Быстрая клавиша – `key:Shift+F11`. -: Выполнение кода остановится на самой последней строчке текущей функции. Этот метод применяется, когда мы случайно нажали и зашли в функцию, но нам она неинтересна и мы как можно скорее хотим из неё выбраться. + – "Step out": продолжить выполнение до завершения текущей функции, быстрая клавиша `key:Shift+F11`. +: Продолжает выполнение и останавливает его в самой последней строке текущей функции. Это удобно, когда мы случайно вошли во вложенный вызов, используя , но это нас не интересует, и мы хотим продолжить его до конца как можно скорее. - – активировать/деактивировать все точки останова. + – активировать/деактивировать все точки останова(breakpoints). : Эта кнопка не влияет на выполнение кода, она лишь позволяет массово включить/отключить точки останова. - – разрешить/запретить остановку выполнения в случае возникновения ошибки. -: Если опция включена и инструменты разработчика открыты, любая ошибка в скрипте приостанавливает выполнение кода, что позволяет его проанализировать. Поэтому если скрипт завершается с ошибкой, открываем отладчик, включаем эту опцию, перезагружаем страницу и локализуем проблему. + – включить/отключить автоматическую паузу в случае ошибки. +: При включении и открытии инструментов разработчика ошибка скрипта автоматически приостанавливает выполнение. Затем мы можем проанализировать переменные, чтобы понять, что пошло не так. Поэтому, если наш скрипт умирает с ошибкой, мы можем открыть debugger, включить эту опцию и перезагрузить страницу, чтобы увидеть, где он умирает и каков контекст в этот момент. ```smart header="Continue to here" -Если щёлкнуть правой кнопкой мыши по строчке кода, в контекстном меню можно выбрать опцию "Continue to here" ("продолжить до этого места"). +Щелчок правой кнопкой мыши по строке кода открывает контекстное меню с отличной опцией под названием "Continue to here" ("продолжить до этого места"). -Этот метод используется, когда нам нужно продвинуться на несколько шагов вперёд до нужной строки, но лень выставлять точки останова. +Это удобно, когда мы хотим перейти на несколько шагов вперед к строке, но нам слишком лень устанавливать точку останова(breakpoint). ``` ## Логирование -Если нужно что-то вывести в консоль из кода, применяется функция `console.log`. +Чтобы вывести что-то на консоль из нашего кода, существует функция `console.log`. Например, это выводит в консоль значения от `0` до `4`: @@ -165,7 +177,7 @@ for (let i = 0; i < 5; i++) { } ``` -Обычный пользователь сайта не увидит такой вывод, так как он в консоли. Напомним, что консоль можно открыть через инструменты разработчика – выберите вкладку "Консоль" или нажмите `key:Esc`, находясь в другой вкладке – консоль откроется в нижней части интерфейса. +Обычный пользователь сайта не увидит такой вывод, так как он в консоли. Чтобы увидеть это, либо откройте консольную панель инструментов разработчика, либо нажмите `key:Esc`, находясь в другой панели: это откроет консоль внизу. Если правильно выстроить логирование в приложении, то можно и без отладчика разобраться, что происходит в коде. From f3e888af263442ae49c091a3ac9e43ccb115b205 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Fri, 4 Mar 2022 02:21:07 +0600 Subject: [PATCH 0098/1128] smth --- 1-js/03-code-quality/01-debugging-chrome/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index 9a0af9f9f6..d4e5713865 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -185,7 +185,7 @@ for (let i = 0; i < 5; i++) { Приостановить выполнение скрипта можно тремя способами: -1. Точками останова (breakpoint). +1. Точками останова (breakpoints). 2. Использованием в коде команд `debugger`. 3. При ошибке (если инструменты разработчика открыты и опция включена). From 9c619b836794ee013ba01aca855b7ac87b6b4dca Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Fri, 4 Mar 2022 02:56:54 +0600 Subject: [PATCH 0099/1128] Update article.md --- 1-js/03-code-quality/01-debugging-chrome/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index d4e5713865..ba283fa2a8 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -187,7 +187,7 @@ for (let i = 0; i < 5; i++) { 1. Точками останова (breakpoints). 2. Использованием в коде команд `debugger`. -3. При ошибке (если инструменты разработчика открыты и опция включена). +3. При ошибке (если инструменты разработчика открыты и кнопка "включена"). При остановке мы можем отлаживать - проанализировать переменные и пошагово пройти по процессу, что поможет отыскать проблему. From 1e8e41a35a01ae9017cbeb65651c8eef37c7798c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Fri, 4 Mar 2022 03:01:22 +0600 Subject: [PATCH 0100/1128] =?UTF-8?q?just=20placed=20"=D1=91"=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01-debugging-chrome/article.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index ba283fa2a8..cd9fcca691 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -48,7 +48,7 @@ Ура! Вы поставили точку останова. А теперь щёлкните по цифре `8` на восьмой линии. -Вот что в итоге должно получиться (синим это те места, по которым вы должны щелкнуть): +Вот что в итоге должно получиться (синим это те места, по которым вы должны щёлкнуть): ![](chrome-sources-breakpoint.svg) @@ -57,15 +57,15 @@ Пока исполнение поставлено "на паузу", мы можем просмотреть текущие значения переменных, выполнить команды в консоли, другими словами, выполнить отладку кода. В правой части графического интерфейса мы видим список точек останова. А когда таких точек выставлено много, да ещё и в разных файлах, этот список поможет эффективно ими управлять: -- Быстро перейдите к точке останова в коде (нажав на нее на правой панели). -- Временно отключите точку останова, сняв с нее галочку. -- Удалите точку останова, щелкнув правой кнопкой мыши и выбрав Remove (Удалить). +- Быстро перейдите к точке останова в коде (нажав на неё на правой панели). +- Временно отключите точку останова, сняв с неё галочку. +- Удалите точку останова, щёлкнув правой кнопкой мыши и выбрав Remove (Удалить). - ...и так далее. ```smart header="Условные точки останова" *Щелчок правой кнопкой мыши* по номеру строки позволяет создать *условную* точку останова. Она сработает только в тот момент, когда вы задали выражение, и если оно истинно, то выполнение кода будет приостановлено. -Это удобно, когда нам нужно остановиться только для определенного значения переменной или для определенных параметров функции. +Это удобно, когда нам нужно остановиться только для определённого значения переменной или для определённых параметров функции. ``` ## Команда Debugger @@ -105,7 +105,7 @@ function hello(name) { В текущий момент отладчик находится внутри вызова `hello()`, вызываемого скриптом в `index.html` (там нет функции, поэтому она называется “анонимной”). - Если вы нажмете на элемент стека (например, "anonymous"), отладчик перейдет к соответствующему коду, и нам представляется возможность его проанализировать. + Если вы нажмёте на элемент стека (например, "anonymous"), отладчик перейдёт к соответствующему коду, и нам представляется возможность его проанализировать. 3. **`Scope` показывает текущие переменные.** @@ -113,7 +113,7 @@ function hello(name) { В `Global` перечисляются глобальные переменные (то есть вне каких-либо функций). - Там также есть ключевое слово `this`, которое мы еще не изучали, но скоро сделаем это. + Там также есть ключевое слово `this`, которое мы ещё не изучали, но скоро сделаем это. ## Пошаговое выполнение скрипта @@ -131,21 +131,21 @@ function hello(name) { Выполнение кода возобновилось, дошло до другой точки останова внутри `say()`, и отладчик снова приостановил выполнение. Обратите внимание на пункт "Call stack" справа: в списке появился ещё один вызов. Сейчас мы внутри `say()`. – "Step": выполнить следующую команду, быстрая клавиша `key:F9`. -: Выполняет следующую инструкцию. Если мы нажмем на нее сейчас, появится `alert`. +: Выполняет следующую инструкцию. Если мы нажмём на неё сейчас, появится `alert`. - Нажатие на эту кнопку снова и снова приведет к пошаговому выполнению всех инструкций скрипта одного за другим. + Нажатие на эту кнопку снова и снова приведёт к пошаговому выполнению всех инструкций скрипта одного за другим. – "Step over": выполнить следующую команду, но *не заходя в функцию*, быстрая клавиша `key:F10`. -: Подобно предыдущей команде "Step", но ведет себя по-другому, если следующая инкструкция является вызовом функции. То есть имеется ввиду: не встроенная, как `alert`, а наша собственная функция. +: Подобно предыдущей команде "Step", но ведёт себя по-другому, если следующая инкструкция является вызовом функции. То есть имеется ввиду: не встроенная, как `alert`, а наша собственная функция. Команда "Step" переходит в неё и приостанавливает выполнение в первой строке, в то время как "Step over" незаметно выполняет вызов вложенной функции, пропуская внутренности функции. Затем выполнение приостанавливается сразу после этой функции. - Это хорошо, если у нас нет цели видеть, что происходит внутри вызова функции. + Это хорошо, если нам не интересно видеть, что происходит внутри вызова функции. – "Step into", быстрая клавиша `key:F11`. -: Это похоже на "Step", но ведет себя по-другому в случае асинхронных вызовов функций. Если вы только начинаете изучать JavaScript, то можете не обращать внимания на разницу, так как у нас еще нет асинхронных вызовов. +: Это похоже на "Step", но ведёт себя по-другому в случае асинхронных вызовов функций. Если вы только начинаете изучать JavaScript, то можете не обращать внимания на разницу, так как у нас ещё нет асинхронных вызовов. На будущее просто помните, что команда "Step" игнорирует асинхронные действия, такие как `setTimeout` (вызов функции по расписанию), которые выполняются позже. "Step into" входит в их код, ожидая их, если это необходимо. См. [DevTools manual](https://developers.google.com/web/updates/2018/01/devtools#async) для получения более подробной информации. @@ -161,7 +161,7 @@ function hello(name) { ```smart header="Continue to here" Щелчок правой кнопкой мыши по строке кода открывает контекстное меню с отличной опцией под названием "Continue to here" ("продолжить до этого места"). -Это удобно, когда мы хотим перейти на несколько шагов вперед к строке, но нам слишком лень устанавливать точку останова(breakpoint). +Это удобно, когда мы хотим перейти на несколько шагов вперёд к строке, но нам слишком лень устанавливать точку останова(breakpoint). ``` ## Логирование From eba8d1cd96af1115e224614112d40fff7994af1a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov <73550760+Rnbsov@users.noreply.github.com> Date: Fri, 4 Mar 2022 21:10:50 +0600 Subject: [PATCH 0101/1128] fix indents https://github.com/javascript-tutorial/en.javascript.info/pull/1780 --- 1-js/03-code-quality/03-comments/article.md | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/1-js/03-code-quality/03-comments/article.md b/1-js/03-code-quality/03-comments/article.md index 749d18fae5..c4c2384a21 100644 --- a/1-js/03-code-quality/03-comments/article.md +++ b/1-js/03-code-quality/03-comments/article.md @@ -125,25 +125,25 @@ function addJuice(container) { Документируйте параметры и использование функций : Есть специальный синтаксис [JSDoc](https://ru.wikipedia.org/wiki/JSDoc) для документирования функций: использование, параметры, возвращаемое значение. - Например: - ```js - /** - * Возвращает x, возведённое в n-ную степень. - * - * @param {number} x Возводимое в степень число. - * @param {number} n Степень, должна быть натуральным числом. - * @return {number} x, возведённое в n-ную степень. - */ - function pow(x, n) { - ... - } - ``` +Например: +```js +/** + * Возвращает x, возведённое в n-ную степень. + * + * @param {number} x Возводимое в степень число. + * @param {number} n Степень, должна быть натуральным числом. + * @return {number} x, возведённое в n-ную степень. + */ +function pow(x, n) { + ... +} +``` - Подобные комментарии позволяют нам понимать назначение функции и правильно её использовать без необходимости заглядывать в код. +Подобные комментарии позволяют нам понимать назначение функции и правильно её использовать без необходимости заглядывать в код. - Кстати, многие редакторы, такие как [WebStorm](https://www.jetbrains.com/webstorm/), прекрасно их распознают для того, чтобы выполнить автодополнение ввода и различные автоматические проверки кода. +Кстати, многие редакторы, такие как [WebStorm](https://www.jetbrains.com/webstorm/), прекрасно их распознают для того, чтобы выполнить автодополнение ввода и различные автоматические проверки кода. - Также существуют инструменты, например, [JSDoc 3](https://github.com/jsdoc3/jsdoc), которые умеют генерировать HTML-документацию из комментариев. Получить больше информации о JSDoc вы можете здесь: . +Также существуют инструменты, например, [JSDoc 3](https://github.com/jsdoc3/jsdoc), которые умеют генерировать HTML-документацию из комментариев. Получить больше информации о JSDoc вы можете здесь: . Почему задача решена именно таким способом? : Важно то, что написано. Но то, что *не* написано, может быть даже более важным, чтобы понимать происходящее. Почему задача решена именно этим способом? Код не даёт ответа. From 877c720751c79e6883e3651c84ec200b35bc8093 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sun, 6 Mar 2022 19:50:29 +0300 Subject: [PATCH 0102/1128] Update article.md --- 1-js/02-first-steps/15-function-basics/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index 3683201df8..a7133e6abb 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -175,15 +175,15 @@ showMessage(from, "Привет"); // *Аня*: Привет alert( from ); // Аня ``` -Как вы уже знаете, когда значение передается в качестве параметра функции, оно также называется аргументом. +Значение передаваемое в качестве параметра функции, также называется *аргументом*. -Другими словами, чтобы сформулировать эти термины прямо: +Другими словами: -Параметр - это переменная, указанная в круглых скобках в объявлении функции (это термин во время объявления). -Аргумент - это значение, которое передается функции при ее вызове (это термин времени вызова). +Параметр - это переменная, указанная в круглых скобках в объявлении функции. +Аргумент - это значение, которое передается функции при ее вызове. Мы объявляем функции со списком их параметров, затем вызываем их, передавая аргументы. -В приведенном выше примере можно было бы сказать: "функция ShowMessage объявляется с двумя параметрами, затем вызывается с двумя аргументами: from и "Hello"". +В приведенном выше примере можно было бы сказать: "функция `ShowMessage` объявляется с двумя параметрами, затем вызывается с двумя аргументами: `from` и `"Hello"`". ## Параметры по умолчанию From e4243dfe6cbd9408b5f4dee5a3302137c394b042 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sun, 6 Mar 2022 19:55:54 +0300 Subject: [PATCH 0103/1128] Update article.md --- 1-js/02-first-steps/15-function-basics/article.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index a7133e6abb..4451aeff87 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -180,10 +180,11 @@ alert( from ); // Аня Другими словами: Параметр - это переменная, указанная в круглых скобках в объявлении функции. -Аргумент - это значение, которое передается функции при ее вызове. -Мы объявляем функции со списком их параметров, затем вызываем их, передавая аргументы. +Аргумент - это значение, которое передаётся функции при её вызове. -В приведенном выше примере можно было бы сказать: "функция `ShowMessage` объявляется с двумя параметрами, затем вызывается с двумя аргументами: `from` и `"Hello"`". +Мы объявляем функции со списком параметров, затем вызываем их, передавая аргументы. + +В приведённом выше примере можно было бы сказать: "функция `showMessage` объявляется с двумя параметрами, затем вызывается с двумя аргументами: `from` и `"Hello"`". ## Параметры по умолчанию From 5d1158654bbf013a3f4375cddd55850d635e11a2 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sun, 6 Mar 2022 20:12:17 +0300 Subject: [PATCH 0104/1128] Update article.md --- 1-js/13-modules/02-import-export/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/13-modules/02-import-export/article.md b/1-js/13-modules/02-import-export/article.md index 7055af37cf..eff9c45952 100644 --- a/1-js/13-modules/02-import-export/article.md +++ b/1-js/13-modules/02-import-export/article.md @@ -93,7 +93,7 @@ say.sayBye('John'); Для этого есть несколько причин. -1. Современные инструменты сборки ([webpack](https://webpack.js.org/) и другие) собирают модули вместе и оптимизируют их, чтобы ускорить загрузку и yдалить неиспользуемый код. +1. Современные инструменты сборки ([webpack](https://webpack.js.org) и другие) собирают модули вместе и оптимизируют их, ускоряя загрузку и удаляя неиспользуемый код. Предположим, мы добавили в наш проект стороннюю библиотеку `say.js` с множеством функций: ```js From db21fbe4500da521fcb772f96eb824dec49d3779 Mon Sep 17 00:00:00 2001 From: Sergei Fomin Date: Sun, 6 Mar 2022 20:13:58 +0300 Subject: [PATCH 0105/1128] Update article.md --- 1-js/13-modules/02-import-export/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/13-modules/02-import-export/article.md b/1-js/13-modules/02-import-export/article.md index eff9c45952..a1d5f586b5 100644 --- a/1-js/13-modules/02-import-export/article.md +++ b/1-js/13-modules/02-import-export/article.md @@ -394,7 +394,7 @@ export default class User { 2. `export * from './user.js'` реэкспортирует только именованные экспорты, исключая экспорт по умолчанию. - Если мы хотим реэкспортировать и именованные экспорты и экспорты по умолчанию, то понадобятся две инструкции: + Если мы хотим реэкспортировать и именованные экспорты и экспорт по умолчанию, то понадобятся две инструкции: ```js export * from './user.js'; // для реэкспорта именованных экспортов export {default} from './user.js'; // для реэкспорта по умолчанию From c952524764b1031850cb16520e851b99a5479bd4 Mon Sep 17 00:00:00 2001 From: Marina Doroshuk <59647513+maridoroshuk@users.noreply.github.com> Date: Tue, 8 Mar 2022 09:16:22 +0300 Subject: [PATCH 0106/1128] Fix typo issue #1527 --- 1-js/11-async/05-promise-api/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/11-async/05-promise-api/article.md b/1-js/11-async/05-promise-api/article.md index 300bf3895a..b8dfb552f2 100644 --- a/1-js/11-async/05-promise-api/article.md +++ b/1-js/11-async/05-promise-api/article.md @@ -33,7 +33,7 @@ Promise.all([ Обратите внимание, что порядок элементов массива в точности соответствует порядку исходных промисов. Даже если первый промис будет выполняться дольше всех, его результат всё равно будет первым в массиве. -Часто применяемый трюк - пропустить массив данных через map-функцию, которая для каждого элемента создаст задачу-промис, и затем обернёт получившийся массив в `Promise.all`. +Часто применяемый трюк - пропустить массив данных через map-функцию, которая для каждого элемента создаст задачу-промис, и затем обернуть получившийся массив в `Promise.all`. Например, если у нас есть массив ссылок, то мы можем загрузить их вот так: From 1a9edb61e9f1433619d579cdbc0fab9cca969954 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 10 Mar 2022 02:31:28 +0600 Subject: [PATCH 0107/1128] update article --- .../02-object-copy/article.md | 146 +++++++++++------- 1 file changed, 90 insertions(+), 56 deletions(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index fa1e4d05a9..70c743f5a3 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -1,10 +1,12 @@ # Копирование объектов и ссылки -Одним из фундаментальных отличий объектов от примитивных типов данных является то, что они хранятся и копируются "по ссылке". +Одно из фундаментальных отличий объектов от примитивов заключается в том, что объекты хранятся и копируются "по ссылке", тогда как примитивные значения: строки, числа, логические значения и т.д. – всегда копируются "как целое значение". -Примитивные типы: строки, числа, логические значения - присваиваются и копируются "по значению". +Это легко понять, если мы немного заглянем под капот того, что происходит, когда мы копируем значение. -Например: +Давайте начнем с примитива, такого как строка. + +Здесь мы помещаем копию `message` во `phrase`: ```js let message = "Привет!"; @@ -15,32 +17,38 @@ let phrase = message; ![](variable-copy-value.svg) +Вполне очевидный результат, не так ли? Объекты ведут себя иначе. -**Переменная хранит не сам объект, а его "адрес в памяти", другими словами "ссылку" на него.** +**Переменная, присвоенная объекту, хранит не сам объект, а его "адрес в памяти" – другими словами, "ссылку" на него.** -Проиллюстрируем это: +Давайте рассмотрим пример такой переменной: ```js let user = { - name: "Иван" + name: "John" }; ``` +И вот как это на самом деле хранится в памяти: + ![](variable-contains-reference.svg) -Сам объект хранится где-то в памяти. А в переменной `user` лежит "ссылка" на эту область памяти. +Объект хранится где-то в памяти (справа от изображения), в то время как переменная `user` (слева) имеет лишь "ссылку" на него. -**Когда переменная объекта копируется - копируется ссылка, сам же объект не дублируется.** +Мы можем думать об переменной объекта, такой как `user`, как о листе бумаги с адресом объекта на нем. -Если мы представляем объект как ящик, то переменная – это ключ к нему. Копирование переменной дублирует ключ, но не сам ящик. +Когда мы выполняем действия с объектом, к примеру, берем свойство `user.name `, движок JavaScript просматривает то, что находится по этому адресу, и выполняет операцию с самим объектом. -Например: +Теперь вот почему это важно. + +**При копировании переменной объекта копируется ссылка, но сам объект не дублируется.** +Например: ```js no-beautify -let user = { name: "Иван" }; +let user = { name: "John" }; let admin = user; // копируется ссылка ``` @@ -49,39 +57,39 @@ let admin = user; // копируется ссылка ![](variable-copy-reference.svg) -Мы можем использовать любую из переменных для доступа к ящику и изменения его содержимого: +Как вы можете видеть, все еще есть один объект, но теперь с двумя переменными, которые ссылаются на него. + +Мы можем использовать любую переменную для доступа к объекту и изменения его содержимого: ```js run -let user = { name: 'Иван' }; +let user = { name: 'John' }; let admin = user; *!* -admin.name = 'Петя'; // изменено по ссылке из переменной "admin" +admin.name = 'Pete'; // изменено по ссылке из переменной "admin" */!* -alert(*!*user.name*/!*); // 'Петя', изменения видны по ссылке из переменной "user" +alert(*!*user.name*/!*); // 'Pete', изменения видны по ссылке из переменной "user" ``` -Приведённый выше пример демонстрирует, что объект только один. Как если бы у нас был один ящик с двумя ключами и мы использовали один из них (`admin`), чтобы войти в него и что-то изменить, а затем, открыв ящик другим ключом (`user`), мы бы увидели эти изменения. +Это как если бы у нас был шкафчик с двумя ключами, и мы использовали один из них (`admin`), чтобы войти в него и внести изменения. А затем, если мы позже используем другой ключ (`user`), мы все равно открываем тот же шкафчик и можем получить доступ к измененному содержимому. ## Сравнение по ссылке -Операторы равенства `==` и строгого равенства `===` для объектов работают одинаково. - -**Два объекта равны только в том случае, если это один и тот же объект.** +Два объекта равны только в том случае, если это один и тот же объект. -В примере ниже две переменные ссылаются на один и тот же объект, поэтому они равны друг другу: +Например, здесь `a` и `b` ссылаются на один и тот же объект, поэтому они равны: ```js run let a = {}; let b = a; // копирование по ссылке -alert( a == b ); // true, т.к. обе переменные ссылаются на один и тот же объект +alert( a == b ); // true, обе переменные ссылаются на один и тот же объект alert( a === b ); // true ``` -В другом примере два разных объекта не равны, хотя оба пусты: +И здесь два независимых объекта не равны, даже если они выглядят одинаково (оба пусты): ```js run let a = {}; @@ -90,42 +98,42 @@ let b = {}; // два независимых объекта alert( a == b ); // false ``` -Для сравнений типа `obj1 > obj2` или для сравнения с примитивом `obj == 5` объекты преобразуются в примитивы. Мы скоро изучим, как работают такие преобразования объектов, но, по правде говоря, сравнения такого рода необходимы очень редко и обычно являются результатом ошибки программиста. +Для сравнений типа `obj1 > obj2` или для сравнения с примитивом `obj == 5` объекты преобразуются в примитивы. Очень скоро мы изучим, как работают преобразования объектов, но, по правде говоря, такие сравнения требуются очень редко и обычно они появляются в результате неправильно запрограммированного кода. -## Клонирование и объединение объектов, Object.assign +## Клонирование и объединение, Object.assign -Таким образом, при копировании переменной с объектом создаётся ещё одна ссылка на тот же самый объект. +Итак, копирование объектной переменной создает еще одну ссылку на тот же объект. Но что, если нам всё же нужно дублировать объект? Создать независимую копию, клон? -Это выполнимо, но немного сложно, так как в JavaScript нет встроенного метода для этого. На самом деле, такая нужда возникает редко. В большинстве случаев нам достаточно копирования по ссылке. +Это тоже выполнимо, но немного сложнее, потому что в JavaScript для этого нет встроенного метода. Но на самом деле в этом редко возникает необходимость, копирования по ссылке в большинстве случаев вполне хватает. -Но если мы действительно этого хотим, то нам нужно создавать новый объект и повторять структуру дублируемого объекта, перебирая его свойства и копируя их. +Но если мы действительно этого хотим, то нам нужно создать новый объект и воспроизвести структуру существующего, перебрав его свойства и скопировав их на примитивном уровне. Например так: ```js run let user = { - name: "Иван", + name: "John", age: 30 }; *!* let clone = {}; // новый пустой объект -// скопируем все свойства user в него +// давайте скопируем все свойства user в него for (let key in user) { clone[key] = user[key]; } */!* -// теперь в переменной clone находится абсолютно независимый клон объекта -clone.name = "Пётр"; // изменим в нём данные +// теперь clone это полностью независимый объект с тем же содержимым +clone.name = "Pete"; // изменим в нём данные -alert( user.name ); // в оригинальном объекте значение свойства `name` осталось прежним – Иван. +alert( user.name ); // все еще John в первоначальном объекте ``` -Кроме того, для этих целей мы можем использовать метод [Object.assign](mdn:js/Object/assign). +Также мы можем использовать для этого метод [Object.assign](mdn:js/Object/assign). Синтаксис: @@ -134,40 +142,40 @@ Object.assign(dest, [src1, src2, src3...]) ``` - Первый аргумент `dest` — целевой объект. -- Остальные аргументы `src1, ..., srcN` (может быть столько, сколько нужно) являются исходными объектами -- Метод копирует свойства всех исходных объектов `src1, ..., srcN` в целевой объект `dest`. То есть, свойства всех перечисленных объектов, начиная со второго, копируются в первый объект. +- Остальные аргументы `src1, ..., srcN` (может быть столько, сколько необходимо) являются исходными объектами +- Метод копирует свойства всех исходных объектов `src1, ..., srcN` в целевой объект `dest`. Другими словами, свойства всех аргументов, начиная со второго, копируются в первый объект. - Возвращает объект `dest`. -Например, объединим несколько объектов в один: +Например, мы можем использовать его для объединения нескольких объектов в один: ```js -let user = { name: "Иван" }; +let user = { name: "John" }; let permissions1 = { canView: true }; let permissions2 = { canEdit: true }; *!* -// копируем все свойства из permissions1 и permissions2 в user +// копирует все свойства из permissions1 и permissions2 в user Object.assign(user, permissions1, permissions2); */!* -// теперь user = { name: "Иван", canView: true, canEdit: true } +// теперь user = { name: "John", canView: true, canEdit: true } ``` -Если принимающий объект (`user`) уже имеет свойство с таким именем, оно будет перезаписано: +Если скопированное имя свойства уже существует, оно будет перезаписано: ```js run -let user = { name: "Иван" }; +let user = { name: "John" }; -Object.assign(user, { name: "Пётр" }); +Object.assign(user, { name: "Pete" }); -alert(user.name); // теперь user = { name: "Пётр" } +alert(user.name); // теперь user = { name: "Pete" } ``` -Мы также можем использовать `Object.assign` для замены `for..in` на простое клонирование: +Мы также можем использовать `Object.assign` для замены `for..in ` цикла для простого клонирования: ```js let user = { - name: "Иван", + name: "John", age: 30 }; @@ -176,16 +184,18 @@ let clone = Object.assign({}, user); */!* ``` -Этот метод скопирует все свойства объекта `user` в пустой объект и возвратит его. +Он копирует все свойства `user` в пустой объект и возвращает его. + +Существуют также другие методы клонирования объекта, например при помощи [Spread syntax](info:rest-parameters-spread-operator) `clone = {...user}`, рассмотрим далее в учебнике. ## Вложенное клонирование -До сих пор мы предполагали, что все свойства объекта `user` хранят примитивные значения. Но свойства могут быть ссылками на другие объекты. Что с ними делать? +До сих пор мы предполагали, что все свойства `user` примитивныe. Но свойства могут быть и ссылками на другие объекты. Что с ними делать? Например, есть объект: ```js run let user = { - name: "Иван", + name: "John", sizes: { height: 182, width: 50 @@ -195,11 +205,11 @@ let user = { alert( user.sizes.height ); // 182 ``` -Теперь при клонировании недостаточно просто скопировать `clone.sizes = user.sizes`, поскольку `user.sizes` - это объект, он будет скопирован по ссылке. А значит объекты `clone` и `user` в своих свойствах `sizes` будут ссылаться на один и тот же объект: +Теперь недостаточно просто скопировать `clone.sizes = user.sizes`, потому что `user.sizes` - это объект, он будет скопирован по ссылке. Таким образом, `clone` и `user` будут иметь одинаковые размеры: ```js run let user = { - name: "Иван", + name: "John", sizes: { height: 182, width: 50 @@ -208,16 +218,40 @@ let user = { let clone = Object.assign({}, user); -alert( user.sizes === clone.sizes ); // true, один и тот же объект +alert( user.sizes === clone.sizes ); // true, тот же объект -// user и clone обращаются к одному sizes -user.sizes.width++; // меняем свойство в одном объекте -alert(clone.sizes.width); // 51, видим результат в другом объекте +// user и clone обладают общими размерами +user.sizes.width++; // изменяем свойства в первом объекте +alert(clone.sizes.width); // 51, видим результат в другом ``` -Чтобы исправить это, мы должны в цикле клонирования делать проверку, не является ли значение `user[key]` объектом, и если это так - скопировать и его структуру тоже. Это называется "глубокое клонирование". +Чтобы исправить это, мы должны использовать цикл клонирования, который проверяет каждое значение `user[key]` и, если это объект, затем также копирует его структуру. Это называется "глубоким клонированием". + +Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать заново велосипед, возьмите готовую реализацию, например [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из библиотеки JavaScript [lodash](https://lodash.com). + +````smart header="Объекты объявленные как константа могут быть изменены" +Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как const, может быть изменен. + +Например: + +```js run +const user = { + name: "John" +}; + +*!* +user.name = "Pete"; // (*) +*/!* + +alert(user.name); // Pete +``` + +Может показаться, что строка `(*)` вызовет ошибку, но это не так. Значение `user` это константа, оно всегда должно ссылаться на один и тот же объект, но свойства этого объекта могут свободно изменяться. + +Другими словами, `const user` выдаст ошибку только в том случае, если мы попытаемся задать `user=...` в целом. -Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать велосипед, использовать готовую реализацию — метод [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из JavaScript-библиотеки [lodash](https://lodash.com). +Тем не менее, если нам действительно нужно создать постоянные свойства объекта, это тоже возможно, но с использованием совершенно других методов. Мы затронем это в главе . +```` ## Итого From 5fb050f826a9e5471b3eb40fd1947ea1659f99fb Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 10 Mar 2022 22:15:17 +0600 Subject: [PATCH 0108/1128] =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B1=D1=83=D0=BA=D0=B2=D1=8B=20=D1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02-object-copy/article.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 70c743f5a3..fd23041093 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -4,7 +4,7 @@ Это легко понять, если мы немного заглянем под капот того, что происходит, когда мы копируем значение. -Давайте начнем с примитива, такого как строка. +Давайте начнём с примитива, такого как строка. Здесь мы помещаем копию `message` во `phrase`: @@ -39,7 +39,7 @@ let user = { Мы можем думать об переменной объекта, такой как `user`, как о листе бумаги с адресом объекта на нем. -Когда мы выполняем действия с объектом, к примеру, берем свойство `user.name `, движок JavaScript просматривает то, что находится по этому адресу, и выполняет операцию с самим объектом. +Когда мы выполняем действия с объектом, к примеру, берём свойство `user.name `, движок JavaScript просматривает то, что находится по этому адресу, и выполняет операцию с самим объектом. Теперь вот почему это важно. @@ -57,7 +57,7 @@ let admin = user; // копируется ссылка ![](variable-copy-reference.svg) -Как вы можете видеть, все еще есть один объект, но теперь с двумя переменными, которые ссылаются на него. +Как вы можете видеть, все ещё есть один объект, но теперь с двумя переменными, которые ссылаются на него. Мы можем использовать любую переменную для доступа к объекту и изменения его содержимого: @@ -73,7 +73,7 @@ admin.name = 'Pete'; // изменено по ссылке из перемен alert(*!*user.name*/!*); // 'Pete', изменения видны по ссылке из переменной "user" ``` -Это как если бы у нас был шкафчик с двумя ключами, и мы использовали один из них (`admin`), чтобы войти в него и внести изменения. А затем, если мы позже используем другой ключ (`user`), мы все равно открываем тот же шкафчик и можем получить доступ к измененному содержимому. +Это как если бы у нас был шкафчик с двумя ключами, и мы использовали один из них (`admin`), чтобы войти в него и внести изменения. А затем, если мы позже используем другой ключ (`user`), мы все равно открываем тот же шкафчик и можем получить доступ к изменённому содержимому. ## Сравнение по ссылке @@ -102,7 +102,7 @@ alert( a == b ); // false ## Клонирование и объединение, Object.assign -Итак, копирование объектной переменной создает еще одну ссылку на тот же объект. +Итак, копирование объектной переменной создаёт ещё одну ссылку на тот же объект. Но что, если нам всё же нужно дублировать объект? Создать независимую копию, клон? @@ -130,7 +130,7 @@ for (let key in user) { // теперь clone это полностью независимый объект с тем же содержимым clone.name = "Pete"; // изменим в нём данные -alert( user.name ); // все еще John в первоначальном объекте +alert( user.name ); // все ещё John в первоначальном объекте ``` Также мы можем использовать для этого метод [Object.assign](mdn:js/Object/assign). @@ -230,7 +230,7 @@ alert(clone.sizes.width); // 51, видим результат в другом Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать заново велосипед, возьмите готовую реализацию, например [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из библиотеки JavaScript [lodash](https://lodash.com). ````smart header="Объекты объявленные как константа могут быть изменены" -Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как const, может быть изменен. +Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как const, может быть изменён. Например: @@ -255,8 +255,8 @@ alert(user.name); // Pete ## Итого -Объекты присваиваются и копируются по ссылке. Другими словами, переменная хранит не "значение объекта", а "ссылку" (адрес в памяти) на это значение. Поэтому копирование такой переменной или передача её в качестве аргумента функции приводит к копированию этой ссылки, а не самого объекта. +Объекты присваиваются и копируются по ссылке. Другими словами, переменная хранит не "значение объекта", а "ссылку" (адрес в памяти) на это значение. Таким образом, копирование такой переменной или передача её в качестве аргумента функции копирует эту ссылку, а не сам объект. -Все операции с использованием скопированных ссылок (например, добавление или удаление свойств) выполняются с одним и тем же объектом. +Все операции с помощью скопированных ссылок (например, добавление/удаление свойств) выполняются с одним и тем же объектом. -Для "простого клонирования" объекта можно использовать `Object.assign`. Необходимо помнить, что `Object.assign` не делает глубокое клонирование объекта. Если внутри копируемого объекта есть свойство, значение которого не является примитивом, оно будет передано по ссылке. Для создания "настоящей копии" (полного клона объекта) можно воспользоваться методом из сторонней JavaScript-библиотеки [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep). +Чтобы создать "реальную копию" (клон), мы можем использовать `Object.assign` для так называемой "поверхностной копии" (вложенные объекты копируются по ссылке) или функцию "глубокого клонирования", такую как [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep). From 89c20581bf51ee3c4ac4229d286c0e168f298f91 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 10 Mar 2022 22:33:40 +0600 Subject: [PATCH 0109/1128] Update article.md --- 1-js/04-object-basics/03-garbage-collection/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 3882dfe2ec..8c9e72c4d6 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -14,8 +14,8 @@ Например: - - Локальные переменные и параметры текущей функции. - - Переменные и параметры других функций в текущей цепочке вложенных вызовов. + - Выполняемая в данный момент функция, ее локальные переменные и параметры. + - Другие функции в текущей цепочке вложенных вызовов, их локальные переменные и параметры. - Глобальные переменные. - (некоторые другие внутренние значения) From d828184920bc4acfe3e524a149b4b7639ab55305 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 10 Mar 2022 22:37:02 +0600 Subject: [PATCH 0110/1128] Update article.md --- 1-js/04-object-basics/03-garbage-collection/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 8c9e72c4d6..5b229b1a2d 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -2,7 +2,7 @@ Управление памятью в JavaScript выполняется автоматически и незаметно. Мы создаём примитивы, объекты, функции... Всё это занимает память. -Но что происходит, когда что-то больше не нужно? Как JavaScript понимает, что пора очищать память? +Но что происходит, когда что-то больше не нужно? Как движок JavaScript обнаруживает, что пора очищать память? ## Достижимость From 1ad14ab6b6afd8628c5982d612512772efae28d4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 11 Mar 2022 00:02:30 +0600 Subject: [PATCH 0111/1128] fix --- 2-ui/2-events/01-introduction-browser-events/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/2-events/01-introduction-browser-events/article.md b/2-ui/2-events/01-introduction-browser-events/article.md index 76802fce8e..28df2e1b7f 100644 --- a/2-ui/2-events/01-introduction-browser-events/article.md +++ b/2-ui/2-events/01-introduction-browser-events/article.md @@ -216,7 +216,7 @@ input.onclick = function() { alert(2); } // заменит предыдущий Синтаксис добавления обработчика: ```js -element.addEventListener(event, handler[, options]); +element.addEventListener(event, handler, [options]); ``` `event` From 5be4961da585099577bd20eb86a171c5f332412f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 12 Mar 2022 01:34:10 +0600 Subject: [PATCH 0112/1128] Delete 1-js/04-object-basics/04-object-methods/2-check-syntax directory --- .../2-check-syntax/solution.md | 43 ------------------- .../04-object-methods/2-check-syntax/task.md | 19 -------- 2 files changed, 62 deletions(-) delete mode 100644 1-js/04-object-basics/04-object-methods/2-check-syntax/solution.md delete mode 100644 1-js/04-object-basics/04-object-methods/2-check-syntax/task.md diff --git a/1-js/04-object-basics/04-object-methods/2-check-syntax/solution.md b/1-js/04-object-basics/04-object-methods/2-check-syntax/solution.md deleted file mode 100644 index 17da58944f..0000000000 --- a/1-js/04-object-basics/04-object-methods/2-check-syntax/solution.md +++ /dev/null @@ -1,43 +0,0 @@ -**Ошибка**! - -Попробуйте запустить: - -```js run -let user = { - name: "Джон", - go: function() { alert(this.name) } -} - -(user.go)() // ошибка! -``` - -Сообщение об ошибке в большинстве браузеров не даёт понимания, что же пошло не так. - -**Ошибка появляется, потому что точка с запятой пропущена после `user = {...}`.** - -JavaScript не вставляет автоматически точку с запятой перед круглой скобкой `(user.go)()`, поэтому читает этот код так: - -```js no-beautify -let user = { go:... }(user.go)() -``` - -Теперь мы тоже можем увидеть, что такое объединённое выражение синтаксически является вызовом объекта `{ go: ... }` как функции с аргументом `(user.go)`. И это происходит в той же строчке с объявлением переменной `let user`, т.е. объект `user` ещё даже не определён, поэтому получается ошибка. - -Если мы вставим точку с запятой - всё заработает: - -```js run -let user = { - name: "Джон", - go: function() { alert(this.name) } -}*!*;*/!* - -(user.go)() // Джон -``` - -Обратите внимание, что круглые скобки вокруг `(user.go)` ничего не значат. Обычно они определяют последовательность операций (оператор группировки), но здесь вызов метода через точку `.` срабатывает первым в любом случае, поэтому группировка ни на что не влияет. Только точка с запятой имеет значение. - - - - - - diff --git a/1-js/04-object-basics/04-object-methods/2-check-syntax/task.md b/1-js/04-object-basics/04-object-methods/2-check-syntax/task.md deleted file mode 100644 index 0b5b7681a7..0000000000 --- a/1-js/04-object-basics/04-object-methods/2-check-syntax/task.md +++ /dev/null @@ -1,19 +0,0 @@ -importance: 2 - ---- - -# Проверка синтаксиса - -Каким будет результат выполнения этого кода? - - -```js no-beautify -let user = { - name: "Джон", - go: function() { alert(this.name) } -} - -(user.go)() -``` - -P.S. Здесь есть подвох :) From 8ab476c41ecba8c4bfa095528ae379bde4d1d5e3 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 12 Mar 2022 01:36:34 +0600 Subject: [PATCH 0113/1128] Delete 1-js/04-object-basics/04-object-methods/3-why-this directory --- .../04-object-methods/3-why-this/solution.md | 22 ---------------- .../04-object-methods/3-why-this/task.md | 26 ------------------- 2 files changed, 48 deletions(-) delete mode 100644 1-js/04-object-basics/04-object-methods/3-why-this/solution.md delete mode 100644 1-js/04-object-basics/04-object-methods/3-why-this/task.md diff --git a/1-js/04-object-basics/04-object-methods/3-why-this/solution.md b/1-js/04-object-basics/04-object-methods/3-why-this/solution.md deleted file mode 100644 index b801084225..0000000000 --- a/1-js/04-object-basics/04-object-methods/3-why-this/solution.md +++ /dev/null @@ -1,22 +0,0 @@ - -Вот как это объясняется. - -1. Это обычный вызов метода объекта через точку `.`, и `this` ссылается на объект перед точкой. - -2. Здесь то же самое. Круглые скобки (оператор группировки) тут не изменяют порядок выполнения операций - доступ к методу через точку в любом случае срабатывает первым. - -3. Здесь мы имеем более сложный вызов `(expression).method()`. Такой вызов работает, как если бы он был разделён на 2 строчки: - - ```js no-beautify - f = obj.go; // вычисляется выражение (переменная f ссылается на код функции) - f(); // вызов функции, на которую ссылается f - ``` - - Здесь `f()` выполняется как функция, без передачи значения `this`. - -4. Тут похожая ситуация на случай `(3)` - идёт потеря значения `this`. - -Чтобы объяснить поведение в примерах `(3)` и `(4)`, нам нужно помнить, что доступ к свойству (через точку или квадратные скобки) возвращает специальное значение ссылочного типа (Reference Type). - -За исключением вызова метода, любая другая операция (подобно операции присваивания `=` или сравнения через логические операторы, например `||`) превращает это значение в обычное, которое не несёт информации, позволяющей установить `this`. - diff --git a/1-js/04-object-basics/04-object-methods/3-why-this/task.md b/1-js/04-object-basics/04-object-methods/3-why-this/task.md deleted file mode 100644 index 2343f1b387..0000000000 --- a/1-js/04-object-basics/04-object-methods/3-why-this/task.md +++ /dev/null @@ -1,26 +0,0 @@ -importance: 3 - ---- - -# Объясните значение "this" - -В представленном ниже коде мы намерены вызвать `obj.go()` метод 4 раза подряд. - -Но вызовы `(1)` и `(2)` работают иначе, чем `(3)` и `(4)`. Почему? - -```js run no-beautify -let obj, method; - -obj = { - go: function() { alert(this); } -}; - -obj.go(); // (1) [object Object] - -(obj.go)(); // (2) [object Object] - -(method = obj.go)(); // (3) undefined - -(obj.go || obj.stop)(); // (4) undefined -``` - From 4e330659395312ced60d487d77757cfe15213f2f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 12 Mar 2022 03:44:46 +0600 Subject: [PATCH 0114/1128] smth --- .../04-object-methods/article.md | 211 +++++------------- 1 file changed, 60 insertions(+), 151 deletions(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index d9c84f2d30..614037401d 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -5,14 +5,14 @@ ```js // Объект пользователя let user = { - name: "Джон", + name: "John", age: 30 }; ``` И так же, как и в реальном мире, пользователь может *совершать действия*: выбирать что-то из корзины покупок, авторизовываться, выходить из системы, оплачивать и т.п. -Такие действия в JavaScript представлены свойствами-функциями объекта. +Такие действия в JavaScript представлены функциями в свойствах. ## Примеры методов @@ -20,7 +20,7 @@ let user = { ```js run let user = { - name: "Джон", + name: "John", age: 30 }; @@ -33,15 +33,15 @@ user.sayHi = function() { user.sayHi(); // Привет! ``` -Здесь мы просто использовали Function Expression (функциональное выражение), чтобы создать функцию для приветствия, и присвоили её свойству `user.sayHi` нашего объекта. +Здесь мы просто использовали Function Expression (функциональное выражение), чтобы создать функцию приветствия, и присвоили её свойству `user.sayHi` нашего объекта. -Затем мы вызвали её. Теперь пользователь может говорить! +Затем мы можем вызвать ee как `user.SayHi()`. Теперь пользователь может говорить! Функцию, которая является свойством объекта, называют *методом* этого объекта. Итак, мы получили метод `sayHi` объекта `user`. -Конечно, мы могли бы заранее объявить функцию и использовать её в качестве метода, примерно так: +Конечно, мы могли бы использовать заранее объявленную функцию в качестве метода, вот так: ```js run let user = { @@ -49,10 +49,10 @@ let user = { }; *!* -// сначала объявляем +// во-первых, объявляем function sayHi() { alert("Привет!"); -} +}; // затем добавляем в качестве метода user.sayHi = sayHi; @@ -62,16 +62,16 @@ user.sayHi(); // Привет! ``` ```smart header="Объектно-ориентированное программирование" -Когда мы пишем наш код, используя объекты для представления сущностей реального мира, - это называется [объектно-ориентированное программирование](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) или сокращённо: "ООП". +Когда мы пишем наш код, используя объекты для представления сущностей реального мира, - это называется [объектно-ориентированным программированием](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) или сокращённо: "ООП". -ООП является большой предметной областью и интересной наукой само по себе. Как выбрать правильные сущности? Как организовать взаимодействие между ними? Это -- создание архитектуры, и есть хорошие книги по этой теме, такие как "Приёмы объектно-ориентированного проектирования. Паттерны проектирования" авторов Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес или "Объектно-ориентированный анализ и проектирование с примерами приложений" Гради Буча, а также ещё множество других книг. +ООП является большой предметной областью и интересной наукой самой по себе. Как выбрать правильные сущности? Как организовать взаимодействие между ними? Это -- создание архитектуры, и на эту тему есть отличные книги, такие как "Приёмы объектно-ориентированного проектирования. Паттерны проектирования" авторов Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес или "Объектно-ориентированный анализ и проектирование с примерами приложений" Гради Буча, а также ещё множество других книг. ``` ### Сокращённая запись метода Существует более короткий синтаксис для методов в литерале объекта: ```js -// эти объекты делают одно и то же (одинаковые методы) +// эти объекты делают одно и то же user = { sayHi: function() { @@ -89,64 +89,64 @@ user = { }; ``` -Как было показано, мы можем пропустить ключевое слово `"function"` и просто написать `sayHi()`. +Как было показано, мы можем опустить ключевое слово `"function"` и просто написать `sayHi()`. -Нужно отметить, что эти две записи не полностью эквивалентны. Есть тонкие различия, связанные с наследованием объектов (что будет рассмотрено позже), но на данном этапе изучения это неважно. В большинстве случаев сокращённый синтаксис предпочтителен. +Нужно отметить, что эти две записи не полностью эквивалентны. Есть тонкие различия, связанные с наследованием объектов (что будет рассмотрено позже), но на данном этапе изучения это неважно. Почти во всех случаях сокращённый синтаксис предпочтителен. ## Ключевое слово "this" в методах -Как правило, методу объекта необходим доступ к информации, которая хранится в объекте, чтобы выполнить с ней какие-либо действия (в соответствии с назначением метода). +Обычно объектному методу требуется доступ к информации, хранящейся в объекте, для выполнения своей работы. -Например, коду внутри `user.sayHi()` может понадобиться имя пользователя, которое хранится в объекте `user`. +Например, коду внутри `user.sayHi()` может потребоваться имя пользователя, которое хранится в объекте `user`. -**Для доступа к информации внутри объекта метод может использовать ключевое слово `this`.** +**Для доступа к объекту метод может использовать ключевое слово `this`.** -Значение `this` - это объект "перед точкой", который использовался для вызова метода. +Значение `this` - это объект "перед точкой", который используется для вызова метода. Например: ```js run let user = { - name: "Джон", + name: "John", age: 30, sayHi() { *!* - // this - это "текущий объект" + // "this" - это "текущий объект". alert(this.name); */!* } }; -user.sayHi(); // Джон +user.sayHi(); // John ``` Здесь во время выполнения кода `user.sayHi()` значением `this` будет являться `user` (ссылка на объект `user`). -Технически также возможно получить доступ к объекту без ключевого слова `this`, ссылаясь на него через внешнюю переменную (в которой хранится ссылка на этот объект): +Технически также возможно получить доступ к объекту без `this`, сославшись на него через внешнюю переменную (в которой хранится ссылка на этот объект): ```js let user = { - name: "Джон", + name: "John", age: 30, sayHi() { *!* - alert(user.name); // используем переменную "user" вместо ключевого слова "this" + alert(user.name); // "user" вместо "this" */!* } }; ``` -...Но такой код будет ненадёжным. Если мы решим скопировать ссылку на объект `user` в другую переменную, например, `admin = user`, и перезапишем переменную `user` чем-то другим, тогда будет осуществлён доступ к неправильному объекту при вызове метода из `admin`. +...Но такой код ненадежен. Если мы решим скопировать ссылку на объект `user` в другую переменную, например, `admin = user`, и перезапишем переменную `user` чем-то другим, то он получит доступ к неправильному объекту при вызове метода из `admin`. Это показано ниже: ```js run let user = { - name: "Джон", + name: "John", age: 30, sayHi() { @@ -159,18 +159,20 @@ let user = { let admin = user; -user = null; // обнулим переменную для наглядности, теперь она не хранит ссылку на объект. +user = null; // перезапишим переменную для наглядности, теперь она не хранит ссылку на объект. -admin.sayHi(); // Ошибка! Внутри sayHi() используется user, которая больше не ссылается на объект! +*!* +admin.sayHi(); // TypeError: Cannot read property 'name' of null +*/!* ``` -Если мы используем `this.name` вместо `user.name` внутри `alert`, тогда этот код будет работать. +Если бы мы использовали `this.name` вместо `user.name` внутри `alert`, тогда этот код бы сработал. -## "this" не является фиксированным +## "this" не привязан -В JavaScript ключевое слово "this" ведёт себя иначе, чем в большинстве других языков программирования. Оно может использоваться в любой функции. +В JavaScript ключевое слово "this" ведёт себя иначе, чем в большинстве других языков программирования. Его можно использовать в любой функции, даже если это не метод объекта. -В этом коде нет синтаксической ошибки: +В следующем примере нет синтаксической ошибки: ```js function sayHi() { @@ -178,13 +180,13 @@ function sayHi() { } ``` -Значение `this` вычисляется во время выполнения кода и зависит от контекста. +Значение `this` вычисляется во время выполнения, в зависимости от контекста. -Например, здесь одна и та же функция назначена двум разным объектам и имеет различное значение "this" при вызовах: +Например, здесь одна и та же функция назначена двум разным объектам и имеет различное значение "this" в вызовах: ```js run -let user = { name: "Джон" }; -let admin = { name: "Админ" }; +let user = { name: "John" }; +let admin = { name: "Admin" }; function sayHi() { alert( this.name ); @@ -196,18 +198,18 @@ user.f = sayHi; admin.f = sayHi; */!* -// вызовы функции, приведённые ниже, имеют разное значение this -// "this" внутри функции является ссылкой на объект, который указан "перед точкой" -user.f(); // Джон (this == user) -admin.f(); // Админ (this == admin) +// эти вызовы имеют разное значение this +// "this" внутри функции - это объект "перед точкой" +user.f(); // John (this == user) +admin.f(); // Admin (this == admin) -admin['f'](); // Админ (неважен способ доступа к методу - через точку или квадратные скобки) +admin['f'](); // (точка или квадратные скобки для доступа к методу – это не имеет значения) ``` -Правило простое: при вызове `obj.f()` значение `this` внутри `f` равно `obj`. Так что, в приведённом примере это `user` или `admin`. +Правило простое: если вызывается `obj.f()`, то во время вызова `f`, `this` - это `obj`. Так что, в приведенном выше примере это либо `user`, либо `admin`. ````smart header="Вызов без объекта: `this == undefined`" -Мы даже можем вызвать функцию вовсе без использования объекта: +Мы даже можем вызвать функцию вообще без объекта: ```js run function sayHi() { @@ -217,146 +219,53 @@ function sayHi() { sayHi(); // undefined ``` -В строгом режиме (`"use strict"`) в таком коде значением `this` будет являться `undefined`. Если мы попытаемся получить доступ к `name`, используя `this.name` - это вызовет ошибку. +В этом случае `this` это `undefined` в строгом режиме(`"use strict"`). Если мы попытаемся получить доступ к `this.name`, то будет ошибка. -В нестрогом режиме значением `this` в таком случае будет *глобальный объект* (`window` для браузера, мы вернёмся к этому позже в главе [Глобальный объект](info:global-object)). Это -- исторически сложившееся поведение `this`, которое исправляется использованием строгого режима (`"use strict"`). +В нестрогом режиме значением `this` в таком случае будет *глобальный объект* (`window` в браузерe, мы вернёмся к этому позже в главе [Глобальный объект](info:global-object)). Это -- исторически сложившееся поведение `this`, которое исправляется использованием строгого режима (`"use strict"`). -Обычно подобный вызов является ошибкой программирования. Если внутри функции используется `this`, тогда ожидается, что она будет вызываться в контексте какого-либо объекта. +Обычно подобный вызов является ошибкой программирования. Если внутри функции используется `this`, тогда она ожидает, что будет вызвана в контексте какого-либо объекта. ```` ```smart header="Последствия свободного `this`" -Если вы до этого изучали другие языки программирования, тогда вы, скорее всего, привыкли к идее "фиксированного `this`" - когда методы, определённые внутри объекта, всегда сохраняют в качестве значения `this` ссылку на свой объект (в котором был определён метод). - -В JavaScript `this` является "свободным", его значение вычисляется в момент вызова метода и не зависит от того, где этот метод был объявлен, а зависит от того, какой объект вызывает метод (какой объект стоит "перед точкой"). - -Эта идея вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость). С другой стороны, большая гибкость увеличивает вероятность ошибок. - -Здесь мы не будем судить о том, является ли это решение в языке хорошим или плохим. Мы должны понимать, как с этим работать, чтобы получать выгоды и избегать проблем. -``` - -## Внутренняя реализация: Ссылочный тип +Если вы до этого изучали другие языки программирования, то вы, вероятно, привыкли к идее "привязаного `this`" - где методы, определенные в объекте, всегда имеют `this`, ссылающееся на этот объект. -```warn header="Продвинутая возможность языка" -Этот раздел объясняет сложную тему, чтобы лучше понимать некоторые запутанные случаи. - -Если вы хотите продвигаться быстрее, его можно пропустить или отложить. -``` +В JavaScript `this` является "свободным", его значение вычисляется в момент вызова метода и не зависит от того, где этот метод был объявлен, а скорее от того, какой объект вызывает метод (какой объект стоит "перед точкой"). -Некоторые хитрые способы вызова метода приводят к потере значения `this`, например: +Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость). С другой стороны, большая гибкость создает больше возможностей для ошибок. -```js run -let user = { - name: "Джон", - hi() { alert(this.name); }, - bye() { alert("Пока"); } -}; - -user.hi(); // Джон (простой вызов метода работает хорошо) - -*!* -// теперь давайте попробуем вызывать user.hi или user.bye -// в зависимости от имени пользователя user.name -(user.name == "Джон" ? user.hi : user.bye)(); // Ошибка! -*/!* -``` - -В последней строчке кода используется условный оператор `?`, который определяет, какой будет вызван метод (`user.hi` или `user.bye`) в зависимости от выполнения условия. В данном случае будет выбран `user.hi`. - -Затем метод тут же вызывается с помощью скобок `()`. Но вызов не работает как положено! - -Вы можете видеть, что при вызове будет ошибка, потому что значением `"this"` внутри функции становится `undefined` (полагаем, что у нас строгий режим). - -Так работает (доступ к методу объекта через точку): -```js -user.hi(); -``` - -Так уже не работает (вызываемый метод вычисляется): -```js -(user.name == "Джон" ? user.hi : user.bye)(); // Ошибка! +Здесь наша позиция заключается не в том, чтобы судить, является ли это архитектурное решение в языке хорошим или плохим. Мы должны понимать, как с этим работать, чтобы получать выгоды и избегать проблем. ``` -Почему? Если мы хотим понять, почему так происходит, давайте разберёмся (заглянем под капот), как работает вызов методов (`obj.method()`). - -Присмотревшись поближе, в выражении `obj.method()` можно заметить две операции: - -1. Сначала оператор точка `'.'` возвращает свойство объекта - его метод (`obj.method`). -2. Затем скобки `()` вызывают этот метод (исполняется код метода). - -Итак, каким же образом информация о `this` передаётся из первой части во вторую? - -Если мы поместим эти операции в отдельные строки, то значение `this`, естественно, будет потеряно: - -```js run -let user = { - name: "Джон", - hi() { alert(this.name); } -}; - -*!* -// разделим получение метода объекта и его вызов в разных строках -let hi = user.hi; -hi(); // Ошибка, потому что значением this является undefined -*/!* -``` - -Здесь `hi = user.hi` сохраняет функцию в переменной, и далее в последней строке она вызывается полностью сама по себе, без объекта, так что нет `this`. - -**Для работы вызовов типа `user.hi()`, JavaScript использует трюк - точка `'.'` возвращает не саму функцию, а специальное значение "ссылочного типа", называемого [Reference Type](https://tc39.github.io/ecma262/#sec-reference-specification-type).** - -Этот ссылочный тип (Reference Type) является внутренним типом. Мы не можем явно использовать его, но он используется внутри языка. - -Значение ссылочного типа - это "триплет": комбинация из трёх значений `(base, name, strict)`, где: - -- `base` - это объект. -- `name` - это имя свойства объекта. -- `strict` - это режим исполнения. Является true, если действует строгий режим (`use strict`). - -Результатом доступа к свойству `user.hi` является не функция, а значение ссылочного типа. Для `user.hi` в строгом режиме оно будет таким: - -```js -// значение ссылочного типа (Reference Type) -(user, "hi", true) -``` - -Когда скобки `()` применяются к значению ссылочного типа (происходит вызов), то они получают полную информацию об объекте и его методе, и могут поставить правильный `this` (`=user` в данном случае, по `base`). - -Ссылочный тип - исключительно внутренний, промежуточный, используемый, чтобы передать информацию от точки `.` до вызывающих скобок `()`. - -При любой другой операции, например, присваивании `hi = user.hi`, ссылочный тип заменяется на собственно значение `user.hi` (функцию), и дальше работа уже идёт только с ней. Поэтому дальнейший вызов происходит уже без `this`. - -Таким образом, значение `this` передаётся правильно, только если функция вызывается напрямую с использованием синтаксиса точки `obj.method()` или квадратных скобок `obj['method']()` (они делают то же самое). Позднее в этом учебнике мы изучим различные варианты решения проблемы потери значения `this`. Например, такие как [func.bind()](/bind#solution-2-bind). - ## У стрелочных функций нет "this" -Стрелочные функции особенные: у них нет своего "собственного" `this`. Если мы используем `this` внутри стрелочной функции, то его значение берётся из внешней "нормальной" функции. +Стрелочные функции особенные: у них нет своего "собственного" `this`. Если мы ссылаемся на `this` внутри такой функции, то оно берется из внешней "нормальной" функции. Например, здесь `arrow()` использует значение `this` из внешнего метода `user.sayHi()`: ```js run let user = { - firstName: "Илья", + firstName: "Ilya", sayHi() { let arrow = () => alert(this.firstName); arrow(); } }; -user.sayHi(); // Илья +user.sayHi(); // Ilya ``` -Это является особенностью стрелочных функций. Они полезны, когда мы на самом деле не хотим иметь отдельное значение `this`, а хотим брать его из внешнего контекста. Позднее в главе мы увидим больше примеров на эту тему. +Это особенность стрелочных функций, она полезна, когда мы на самом деле не хотим иметь отдельное `this`, а скорее хотим взять его из внешнего контекста. Позже в главе мы увидим больше примеров на эту тему. ## Итого -- Функции, которые находятся в объекте в качестве его свойств, называются "методами". -- Методы позволяют объектам "действовать": `object.doSomething()`. +- Функции, которые находятся в свойствах объекта, называются "методами". +- Методы позволяют объектам "действовать" вроде: `object.doSomething()`. - Методы могут ссылаться на объект через `this`. Значение `this` определяется во время исполнения кода. - При объявлении любой функции в ней можно использовать `this`, но этот `this` не имеет значения до тех пор, пока функция не будет вызвана. -- Эта функция может быть скопирована между объектами (из одного объекта в другой). -- Когда функция вызывается синтаксисом "метода" - `object.method()`, значением `this` во время вызова является объект перед точкой. +- Функция может быть скопирована между объектами (из одного объекта в другой). +- Когда функция вызывается синтаксисом "метода" - `object.method()`, значением `this` во время вызова эквивалентно `object`. -Также ещё раз заметим, что стрелочные функции являются особенными - у них нет `this`. Когда внутри стрелочной функции обращаются к `this`, то его значение берётся снаружи. +Также ещё раз заметим, что стрелочные функции являются особенными - у них нет `this`. Когда внутри стрелочной функции обращаются к `this`, то его значение берётся извне. From 33b812df43dc918bf7e63dac63a36c3fa714c93a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 12 Mar 2022 03:47:02 +0600 Subject: [PATCH 0115/1128] smth --- 1-js/04-object-basics/04-object-methods/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index 614037401d..7afbfb764d 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -140,7 +140,7 @@ let user = { }; ``` -...Но такой код ненадежен. Если мы решим скопировать ссылку на объект `user` в другую переменную, например, `admin = user`, и перезапишем переменную `user` чем-то другим, то он получит доступ к неправильному объекту при вызове метода из `admin`. +...Но такой код ненадёжен. Если мы решим скопировать ссылку на объект `user` в другую переменную, например, `admin = user`, и перезапишем переменную `user` чем-то другим, то он получит доступ к неправильному объекту при вызове метода из `admin`. Это показано ниже: @@ -206,7 +206,7 @@ admin.f(); // Admin (this == admin) admin['f'](); // (точка или квадратные скобки для доступа к методу – это не имеет значения) ``` -Правило простое: если вызывается `obj.f()`, то во время вызова `f`, `this` - это `obj`. Так что, в приведенном выше примере это либо `user`, либо `admin`. +Правило простое: если вызывается `obj.f()`, то во время вызова `f`, `this` - это `obj`. Так что, в приведённом выше примере это либо `user`, либо `admin`. ````smart header="Вызов без объекта: `this == undefined`" Мы даже можем вызвать функцию вообще без объекта: @@ -227,18 +227,18 @@ sayHi(); // undefined ```` ```smart header="Последствия свободного `this`" -Если вы до этого изучали другие языки программирования, то вы, вероятно, привыкли к идее "привязаного `this`" - где методы, определенные в объекте, всегда имеют `this`, ссылающееся на этот объект. +Если вы до этого изучали другие языки программирования, то вы, вероятно, привыкли к идее "привязаного `this`" - где методы, определённые в объекте, всегда имеют `this`, ссылающееся на этот объект. В JavaScript `this` является "свободным", его значение вычисляется в момент вызова метода и не зависит от того, где этот метод был объявлен, а скорее от того, какой объект вызывает метод (какой объект стоит "перед точкой"). -Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость). С другой стороны, большая гибкость создает больше возможностей для ошибок. +Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость). С другой стороны, большая гибкость создаёт больше возможностей для ошибок. Здесь наша позиция заключается не в том, чтобы судить, является ли это архитектурное решение в языке хорошим или плохим. Мы должны понимать, как с этим работать, чтобы получать выгоды и избегать проблем. ``` ## У стрелочных функций нет "this" -Стрелочные функции особенные: у них нет своего "собственного" `this`. Если мы ссылаемся на `this` внутри такой функции, то оно берется из внешней "нормальной" функции. +Стрелочные функции особенные: у них нет своего "собственного" `this`. Если мы ссылаемся на `this` внутри такой функции, то оно берётся из внешней "нормальной" функции. Например, здесь `arrow()` использует значение `this` из внешнего метода `user.sayHi()`: From dcdcafe9db510c91b090c22ac5590cd792dd899f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 12 Mar 2022 04:00:57 +0600 Subject: [PATCH 0116/1128] smth --- .../2-check-syntax/solution.md | 37 +++++++ .../04-reference-type/2-check-syntax/task.md | 19 ++++ .../04-reference-type/3-why-this/solution.md | 22 +++++ .../04-reference-type/3-why-this/task.md | 26 +++++ 1-js/99-js-misc/04-reference-type/article.md | 97 +++++++++++++++++++ .../1-bitwise-operator-value/solution.md | 0 .../1-bitwise-operator-value/task.md | 0 .../2-check-integer/solution.md | 0 .../2-check-integer/task.md | 0 .../3-bitwise-symmetry/solution.md | 0 .../3-bitwise-symmetry/task.md | 0 .../4-bit-rounding/solution.md | 0 .../4-bit-rounding/task.md | 0 .../article.md | 0 .../head.html | 0 .../{05-bigint => 06-bigint}/article.md | 0 16 files changed, 201 insertions(+) create mode 100644 1-js/99-js-misc/04-reference-type/2-check-syntax/solution.md create mode 100644 1-js/99-js-misc/04-reference-type/2-check-syntax/task.md create mode 100644 1-js/99-js-misc/04-reference-type/3-why-this/solution.md create mode 100644 1-js/99-js-misc/04-reference-type/3-why-this/task.md create mode 100644 1-js/99-js-misc/04-reference-type/article.md rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/1-bitwise-operator-value/solution.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/1-bitwise-operator-value/task.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/2-check-integer/solution.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/2-check-integer/task.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/3-bitwise-symmetry/solution.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/3-bitwise-symmetry/task.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/4-bit-rounding/solution.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/4-bit-rounding/task.md (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/article.md (100%) rename 1-js/99-js-misc/{04-bitwise-operators => 05-bitwise-operators}/head.html (100%) mode change 100755 => 100644 rename 1-js/99-js-misc/{05-bigint => 06-bigint}/article.md (100%) diff --git a/1-js/99-js-misc/04-reference-type/2-check-syntax/solution.md b/1-js/99-js-misc/04-reference-type/2-check-syntax/solution.md new file mode 100644 index 0000000000..9a82a922a4 --- /dev/null +++ b/1-js/99-js-misc/04-reference-type/2-check-syntax/solution.md @@ -0,0 +1,37 @@ +**Ошибка**! + +Попробуйте запустить: + +```js run +let user = { + name: "Джон", + go: function() { alert(this.name) } +} + +(user.go)() // ошибка! +``` + +Сообщение об ошибке в большинстве браузеров не даёт понимания, что же пошло не так. + +**Ошибка появляется, потому что точка с запятой пропущена после `user = {...}`.** + +JavaScript не вставляет автоматически точку с запятой перед круглой скобкой `(user.go)()`, поэтому читает этот код так: + +```js no-beautify +let user = { go:... }(user.go)() +``` + +Теперь мы тоже можем увидеть, что такое объединённое выражение синтаксически является вызовом объекта `{ go: ... }` как функции с аргументом `(user.go)`. И это происходит в той же строчке с объявлением переменной `let user`, т.е. объект `user` ещё даже не определён, поэтому получается ошибка. + +Если мы вставим точку с запятой - всё заработает: + +```js run +let user = { + name: "Джон", + go: function() { alert(this.name) } +}*!*;*/!* + +(user.go)() // Джон +``` + +Обратите внимание, что круглые скобки вокруг `(user.go)` ничего не значат. Обычно они определяют последовательность операций (оператор группировки), но здесь вызов метода через точку `.` срабатывает первым в любом случае, поэтому группировка ни на что не влияет. Только точка с запятой имеет значение. diff --git a/1-js/99-js-misc/04-reference-type/2-check-syntax/task.md b/1-js/99-js-misc/04-reference-type/2-check-syntax/task.md new file mode 100644 index 0000000000..28da39ba54 --- /dev/null +++ b/1-js/99-js-misc/04-reference-type/2-check-syntax/task.md @@ -0,0 +1,19 @@ +importance: 2 + +--- + +# Проверка синтаксиса + +Каким будет результат выполнения этого кода? + + +```js no-beautify +let user = { + name: "Джон", + go: function() { alert(this.name) } +} + +(user.go)() +``` + +P.S. Здесь есть подвох :) diff --git a/1-js/99-js-misc/04-reference-type/3-why-this/solution.md b/1-js/99-js-misc/04-reference-type/3-why-this/solution.md new file mode 100644 index 0000000000..e72f1b04f9 --- /dev/null +++ b/1-js/99-js-misc/04-reference-type/3-why-this/solution.md @@ -0,0 +1,22 @@ + +Вот как это объясняется. + +1. Это обычный вызов метода объекта через точку `.`, и `this` ссылается на объект перед точкой. + +2. Здесь то же самое. Круглые скобки (оператор группировки) тут не изменяют порядок выполнения операций - доступ к методу через точку в любом случае срабатывает первым. + +3. Здесь мы имеем более сложный вызов `(expression).method()`. Такой вызов работает, как если бы он был разделён на 2 строчки: + + ```js no-beautify + f = obj.go; // вычисляется выражение (переменная f ссылается на код функции) + f(); // вызов функции, на которую ссылается f + ``` + + Здесь `f()` выполняется как функция, без передачи значения `this`. + +4. Тут похожая ситуация на случай `(3)` - идёт потеря значения `this`. + +Чтобы объяснить поведение в примерах `(3)` и `(4)`, нам нужно помнить, что доступ к свойству (через точку или квадратные скобки) возвращает специальное значение ссылочного типа (Reference Type). + +За исключением вызова метода, любая другая операция (подобно операции присваивания `=` или сравнения через логические операторы, например `||`) превращает это значение в обычное, которое не несёт информации, позволяющей установить `this`. + diff --git a/1-js/99-js-misc/04-reference-type/3-why-this/task.md b/1-js/99-js-misc/04-reference-type/3-why-this/task.md new file mode 100644 index 0000000000..061101af49 --- /dev/null +++ b/1-js/99-js-misc/04-reference-type/3-why-this/task.md @@ -0,0 +1,26 @@ +importance: 3 + +--- + +# Объясните значение "this" + +В представленном ниже коде мы намерены вызвать `obj.go()` метод 4 раза подряд. + +Но вызовы `(1)` и `(2)` работают иначе, чем `(3)` и `(4)`. Почему? + +```js run no-beautify +let obj, method; + +obj = { + go: function() { alert(this); } +}; + +obj.go(); // (1) [object Object] + +(obj.go)(); // (2) [object Object] + +(method = obj.go)(); // (3) undefined + +(obj.go || obj.stop)(); // (4) undefined +``` + diff --git a/1-js/99-js-misc/04-reference-type/article.md b/1-js/99-js-misc/04-reference-type/article.md new file mode 100644 index 0000000000..d5ee931255 --- /dev/null +++ b/1-js/99-js-misc/04-reference-type/article.md @@ -0,0 +1,97 @@ + +## Внутренняя реализация: Ссылочный тип + +```warn header="Продвинутая возможность языка" +Этот раздел объясняет сложную тему, чтобы лучше понимать некоторые запутанные случаи. + +Если вы хотите продвигаться быстрее, его можно пропустить или отложить. +``` + +Некоторые хитрые способы вызова метода приводят к потере значения `this`, например: + +```js run +let user = { + name: "Джон", + hi() { alert(this.name); }, + bye() { alert("Пока"); } +}; + +user.hi(); // Джон (простой вызов метода работает хорошо) + +*!* +// теперь давайте попробуем вызывать user.hi или user.bye +// в зависимости от имени пользователя user.name +(user.name == "Джон" ? user.hi : user.bye)(); // Ошибка! +*/!* +``` + +В последней строчке кода используется условный оператор `?`, который определяет, какой будет вызван метод (`user.hi` или `user.bye`) в зависимости от выполнения условия. В данном случае будет выбран `user.hi`. + +Затем метод тут же вызывается с помощью скобок `()`. Но вызов не работает как положено! + +Вы можете видеть, что при вызове будет ошибка, потому что значением `"this"` внутри функции становится `undefined` (полагаем, что у нас строгий режим). + +Так работает (доступ к методу объекта через точку): +```js +user.hi(); +``` + +Так уже не работает (вызываемый метод вычисляется): +```js +(user.name == "Джон" ? user.hi : user.bye)(); // Ошибка! +``` + +Почему? Если мы хотим понять, почему так происходит, давайте разберёмся (заглянем под капот), как работает вызов методов (`obj.method()`). + +## Reference type explained + +Присмотревшись поближе, в выражении `obj.method()` можно заметить две операции: + +1. Сначала оператор точка `'.'` возвращает свойство объекта - его метод (`obj.method`). +2. Затем скобки `()` вызывают этот метод (исполняется код метода). + +Итак, каким же образом информация о `this` передаётся из первой части во вторую? + +Если мы поместим эти операции в отдельные строки, то значение `this`, естественно, будет потеряно: + +```js run +let user = { + name: "Джон", + hi() { alert(this.name); } +}; + +*!* +// разделим получение метода объекта и его вызов в разных строках +let hi = user.hi; +hi(); // Ошибка, потому что значением this является undefined +*/!* +``` + +Здесь `hi = user.hi` сохраняет функцию в переменной, и далее в последней строке она вызывается полностью сама по себе, без объекта, так что нет `this`. + +**Для работы вызовов типа `user.hi()`, JavaScript использует трюк - точка `'.'` возвращает не саму функцию, а специальное значение "ссылочного типа", называемого [Reference Type](https://tc39.github.io/ecma262/#sec-reference-specification-type).** + +Этот ссылочный тип (Reference Type) является внутренним типом. Мы не можем явно использовать его, но он используется внутри языка. + +Значение ссылочного типа - это "триплет": комбинация из трёх значений `(base, name, strict)`, где: + +- `base` - это объект. +- `name` - это имя свойства объекта. +- `strict` - это режим исполнения. Является true, если действует строгий режим (`use strict`). + +Результатом доступа к свойству `user.hi` является не функция, а значение ссылочного типа. Для `user.hi` в строгом режиме оно будет таким: + +```js +// значение ссылочного типа (Reference Type) +(user, "hi", true) +``` + +Когда скобки `()` применяются к значению ссылочного типа (происходит вызов), то они получают полную информацию об объекте и его методе, и могут поставить правильный `this` (`=user` в данном случае, по `base`). + +Ссылочный тип - исключительно внутренний, промежуточный, используемый, чтобы передать информацию от точки `.` до вызывающих скобок `()`. + +При любой другой операции, например, присваивании `hi = user.hi`, ссылочный тип заменяется на собственно значение `user.hi` (функцию), и дальше работа уже идёт только с ней. Поэтому дальнейший вызов происходит уже без `this`. + +Таким образом, значение `this` передаётся правильно, только если функция вызывается напрямую с использованием синтаксиса точки `obj.method()` или квадратных скобок `obj['method']()` (они делают то же самое). Позднее в этом учебнике мы изучим различные варианты решения проблемы потери значения `this`. Например, такие как [func.bind()](/bind#solution-2-bind). + +## Итог \ No newline at end of file diff --git a/1-js/99-js-misc/04-bitwise-operators/1-bitwise-operator-value/solution.md b/1-js/99-js-misc/05-bitwise-operators/1-bitwise-operator-value/solution.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/1-bitwise-operator-value/solution.md rename to 1-js/99-js-misc/05-bitwise-operators/1-bitwise-operator-value/solution.md diff --git a/1-js/99-js-misc/04-bitwise-operators/1-bitwise-operator-value/task.md b/1-js/99-js-misc/05-bitwise-operators/1-bitwise-operator-value/task.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/1-bitwise-operator-value/task.md rename to 1-js/99-js-misc/05-bitwise-operators/1-bitwise-operator-value/task.md diff --git a/1-js/99-js-misc/04-bitwise-operators/2-check-integer/solution.md b/1-js/99-js-misc/05-bitwise-operators/2-check-integer/solution.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/2-check-integer/solution.md rename to 1-js/99-js-misc/05-bitwise-operators/2-check-integer/solution.md diff --git a/1-js/99-js-misc/04-bitwise-operators/2-check-integer/task.md b/1-js/99-js-misc/05-bitwise-operators/2-check-integer/task.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/2-check-integer/task.md rename to 1-js/99-js-misc/05-bitwise-operators/2-check-integer/task.md diff --git a/1-js/99-js-misc/04-bitwise-operators/3-bitwise-symmetry/solution.md b/1-js/99-js-misc/05-bitwise-operators/3-bitwise-symmetry/solution.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/3-bitwise-symmetry/solution.md rename to 1-js/99-js-misc/05-bitwise-operators/3-bitwise-symmetry/solution.md diff --git a/1-js/99-js-misc/04-bitwise-operators/3-bitwise-symmetry/task.md b/1-js/99-js-misc/05-bitwise-operators/3-bitwise-symmetry/task.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/3-bitwise-symmetry/task.md rename to 1-js/99-js-misc/05-bitwise-operators/3-bitwise-symmetry/task.md diff --git a/1-js/99-js-misc/04-bitwise-operators/4-bit-rounding/solution.md b/1-js/99-js-misc/05-bitwise-operators/4-bit-rounding/solution.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/4-bit-rounding/solution.md rename to 1-js/99-js-misc/05-bitwise-operators/4-bit-rounding/solution.md diff --git a/1-js/99-js-misc/04-bitwise-operators/4-bit-rounding/task.md b/1-js/99-js-misc/05-bitwise-operators/4-bit-rounding/task.md old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/4-bit-rounding/task.md rename to 1-js/99-js-misc/05-bitwise-operators/4-bit-rounding/task.md diff --git a/1-js/99-js-misc/04-bitwise-operators/article.md b/1-js/99-js-misc/05-bitwise-operators/article.md similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/article.md rename to 1-js/99-js-misc/05-bitwise-operators/article.md diff --git a/1-js/99-js-misc/04-bitwise-operators/head.html b/1-js/99-js-misc/05-bitwise-operators/head.html old mode 100755 new mode 100644 similarity index 100% rename from 1-js/99-js-misc/04-bitwise-operators/head.html rename to 1-js/99-js-misc/05-bitwise-operators/head.html diff --git a/1-js/99-js-misc/05-bigint/article.md b/1-js/99-js-misc/06-bigint/article.md similarity index 100% rename from 1-js/99-js-misc/05-bigint/article.md rename to 1-js/99-js-misc/06-bigint/article.md From a906fa54fce729f4948a1e08e522e303ca0bc032 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 12 Mar 2022 15:12:10 +0600 Subject: [PATCH 0117/1128] smth --- .../04-object-methods/article.md | 2 +- 1-js/99-js-misc/04-reference-type/article.md | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index 7afbfb764d..7db6006b2d 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -52,7 +52,7 @@ let user = { // во-первых, объявляем function sayHi() { alert("Привет!"); -}; +} // затем добавляем в качестве метода user.sayHi = sayHi; diff --git a/1-js/99-js-misc/04-reference-type/article.md b/1-js/99-js-misc/04-reference-type/article.md index d5ee931255..2e663b13aa 100644 --- a/1-js/99-js-misc/04-reference-type/article.md +++ b/1-js/99-js-misc/04-reference-type/article.md @@ -2,9 +2,9 @@ ## Внутренняя реализация: Ссылочный тип ```warn header="Продвинутая возможность языка" -Этот раздел объясняет сложную тему, чтобы лучше понимать некоторые запутанные случаи. +Эта статья охватывает продвинутую тему, чтобы лучше понять некоторые крайние случаи. -Если вы хотите продвигаться быстрее, его можно пропустить или отложить. +Это не важно. Многие опытные разработчики прекрасно живут, даже не подозревая об этом. Читайте дальше, если хотите узнать, как все работает под капотом. ``` Некоторые хитрые способы вызова метода приводят к потере значения `this`, например: @@ -43,7 +43,7 @@ user.hi(); Почему? Если мы хотим понять, почему так происходит, давайте разберёмся (заглянем под капот), как работает вызов методов (`obj.method()`). -## Reference type explained +## Ссылочный тип объяснение Присмотревшись поближе, в выражении `obj.method()` можно заметить две операции: @@ -94,4 +94,14 @@ hi(); // Ошибка, потому что значением this являет Таким образом, значение `this` передаётся правильно, только если функция вызывается напрямую с использованием синтаксиса точки `obj.method()` или квадратных скобок `obj['method']()` (они делают то же самое). Позднее в этом учебнике мы изучим различные варианты решения проблемы потери значения `this`. Например, такие как [func.bind()](/bind#solution-2-bind). -## Итог \ No newline at end of file +## Итог + +Ссылочный тип - это внутренний тип языка. + +Чтение свойства, например, с точкой `.` в `obj.method()` возвращает не точное значение свойства, а специальное значение "ссылочного типа", в котором хранится как значение свойства, так и объект, из которого оно было взято. + +Это для последующего вызова метода `()`, чтобы получить объект и установить для него `this`. + +Для всех остальных операций ссылочный тип автоматически становится значением свойства (в нашем случае функцией). + +Вся механика скрыта от наших глаз. Это имеет значение только в тонких случаях, например, когда метод динамически извлекается из объекта с использованием выражения. From b2840d0ac4571d66d8db8aad2d1c7b8efa497709 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 13 Mar 2022 10:47:18 +0600 Subject: [PATCH 0118/1128] typo --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index fd23041093..f0f4a2f30c 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -67,7 +67,7 @@ let user = { name: 'John' }; let admin = user; *!* -admin.name = 'Pete'; // изменено по ссылке из переменной "admin" +admin.name = 'Pete'; // изменено по ссылке из переменной "admin" */!* alert(*!*user.name*/!*); // 'Pete', изменения видны по ссылке из переменной "user" From e509d8b208728f7b3f60ff218ecf9bc479b60278 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 13 Mar 2022 23:25:04 +0600 Subject: [PATCH 0119/1128] typo --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index f0f4a2f30c..10fe5dc009 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -220,7 +220,7 @@ let clone = Object.assign({}, user); alert( user.sizes === clone.sizes ); // true, тот же объект -// user и clone обладают общими размерами +// user и clone обладают общими размерами user.sizes.width++; // изменяем свойства в первом объекте alert(clone.sizes.width); // 51, видим результат в другом ``` From 9898aa7eba9800343337ee2f485d499d43f82861 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 15 Mar 2022 23:54:46 +0600 Subject: [PATCH 0120/1128] minor fix --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 10fe5dc009..0fece04019 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -186,7 +186,7 @@ let clone = Object.assign({}, user); Он копирует все свойства `user` в пустой объект и возвращает его. -Существуют также другие методы клонирования объекта, например при помощи [Spread syntax](info:rest-parameters-spread-operator) `clone = {...user}`, рассмотрим далее в учебнике. +Существуют также другие методы клонирования объекта, например при помощи [Spread syntax](info:rest-parameters-spread-operator) `clone = {...user}`, рассмотренного далее в учебнике. ## Вложенное клонирование From fad1c797732782d3f9fb1ad00947b01a8038ea05 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 00:02:55 +0600 Subject: [PATCH 0121/1128] fix link --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 0fece04019..6971b68dd9 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -186,7 +186,7 @@ let clone = Object.assign({}, user); Он копирует все свойства `user` в пустой объект и возвращает его. -Существуют также другие методы клонирования объекта, например при помощи [Spread syntax](info:rest-parameters-spread-operator) `clone = {...user}`, рассмотренного далее в учебнике. +Существуют также другие методы клонирования объекта, например при помощи [Spread syntax](info:rest-parameters-spread) `clone = {...user}`, рассмотренного далее в учебнике. ## Вложенное клонирование From b5a7ec9dcb7a38069004a10dbac29b2e58ca496b Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 00:15:36 +0600 Subject: [PATCH 0122/1128] fix --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 6971b68dd9..56bcd30f1b 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -205,7 +205,7 @@ let user = { alert( user.sizes.height ); // 182 ``` -Теперь недостаточно просто скопировать `clone.sizes = user.sizes`, потому что `user.sizes` - это объект, он будет скопирован по ссылке. Таким образом, `clone` и `user` будут иметь одинаковые размеры: +Теперь недостаточно просто скопировать `clone.sizes = user.sizes`, потому что `user.sizes` - это объект, он будет скопирован по ссылке. Таким образом, `clone` и `user` будут иметь общий объект `sizes`: ```js run let user = { From 04001bcfdbe9de283fec4ea14de0facc70bf576e Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 00:20:59 +0600 Subject: [PATCH 0123/1128] typo --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 56bcd30f1b..79015027e9 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -225,7 +225,7 @@ user.sizes.width++; // изменяем свойства в первом alert(clone.sizes.width); // 51, видим результат в другом ``` -Чтобы исправить это, мы должны использовать цикл клонирования, который проверяет каждое значение `user[key]` и, если это объект, затем также копирует его структуру. Это называется "глубоким клонированием". +Чтобы исправить это, мы должны использовать цикл клонирования, который проверяет каждое значение `user[key]` и, если это объект, тогда также копирует его структуру. Это называется "глубоким клонированием". Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать заново велосипед, возьмите готовую реализацию, например [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из библиотеки JavaScript [lodash](https://lodash.com). From 8340a8b8bdda6712b2c2944c5f0bb48ef00f63ba Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 00:24:48 +0600 Subject: [PATCH 0124/1128] typo --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 79015027e9..b611b0f636 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -227,7 +227,7 @@ alert(clone.sizes.width); // 51, видим результат в другом Чтобы исправить это, мы должны использовать цикл клонирования, который проверяет каждое значение `user[key]` и, если это объект, тогда также копирует его структуру. Это называется "глубоким клонированием". -Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать заново велосипед, возьмите готовую реализацию, например [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из библиотеки JavaScript [lodash](https://lodash.com). +Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать велосипед заново, возьмите готовую реализацию, например [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из библиотеки JavaScript [lodash](https://lodash.com). ````smart header="Объекты объявленные как константа могут быть изменены" Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как const, может быть изменён. From 057329441d67142845dcdac104474116431a6e32 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 00:27:24 +0600 Subject: [PATCH 0125/1128] add text styling --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index b611b0f636..9b4e061abd 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -230,7 +230,7 @@ alert(clone.sizes.width); // 51, видим результат в другом Мы можем реализовать глубокое клонирование, используя рекурсию. Или, чтобы не изобретать велосипед заново, возьмите готовую реализацию, например [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) из библиотеки JavaScript [lodash](https://lodash.com). ````smart header="Объекты объявленные как константа могут быть изменены" -Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как const, может быть изменён. +Важным побочным эффектом хранения объектов в качестве ссылок является то, что объект, объявленный как `const`, *может* быть изменён. Например: From a551b94dbe15eb35dbafbe047080c1485b32e880 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 00:41:15 +0600 Subject: [PATCH 0126/1128] smth --- 1-js/04-object-basics/03-garbage-collection/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 5b229b1a2d..bebdccfec3 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -23,7 +23,7 @@ 2. Любое другое значение считается достижимым, если оно доступно из корня по ссылке или по цепочке ссылок. - Например, если в локальной переменной есть объект, и он имеет свойство, в котором хранится ссылка на другой объект, то этот объект считается достижимым. И те, на которые он ссылается, тоже достижимы. Далее вы познакомитесь с подробными примерами на эту тему. + Например, если в глобальной переменной есть объект, и он имеет свойство, в котором хранится ссылка на другой объект, то *этот* объект считается достижимым. И те, на которые он ссылается, тоже достижимы. Далее вы познакомитесь с подробными примерами на эту тему. В интерпретаторе JavaScript есть фоновый процесс, который называется [сборщик мусора](https://ru.wikipedia.org/wiki/Сборка_мусора). Он следит за всеми объектами и удаляет те, которые стали недостижимы. From fed59f7c118928b06405c2c71e19665df916e435 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 01:08:55 +0600 Subject: [PATCH 0127/1128] more correct naming --- 1-js/04-object-basics/03-garbage-collection/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index bebdccfec3..081fb87352 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -207,6 +207,6 @@ family = null; Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора интерпретатора V8 находится в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). -Также в [блоге интерпретатора V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам необходимо понимать, как устроен внутри интерпретатор V8 в целом. Об этом вы можете почитать в блоге [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещён статьями в интернете. В других интерпретаторах многие подходы схожи, но сборка мусора во многих аспектах отличается. +Также в [блоге движка V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам необходимо понимать, как устроен внутри интерпретатор V8 в целом. Об этом вы можете почитать в блоге [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещён статьями в интернете. В других интерпретаторах многие подходы схожи, но сборка мусора во многих аспектах отличается. Глубокое понимание работы интерпретаторов необходимо, когда вам нужны низкоуровневые оптимизации. Было бы разумно запланировать их изучение как следующий шаг после освоения языка. From 064765b21545d13615864839c3a999ff545fadbf Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 16 Mar 2022 01:10:45 +0600 Subject: [PATCH 0128/1128] fix --- 1-js/04-object-basics/03-garbage-collection/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 081fb87352..59b0d9a065 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -207,6 +207,6 @@ family = null; Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора интерпретатора V8 находится в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). -Также в [блоге движка V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам необходимо понимать, как устроен внутри интерпретатор V8 в целом. Об этом вы можете почитать в блоге [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещён статьями в интернете. В других интерпретаторах многие подходы схожи, но сборка мусора во многих аспектах отличается. +Также в [блоге движка V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам необходимо понимать, как устроен внутри интерпретатор V8 в целом. Об этом вы можете почитать в блоге [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещён статьями в интернете. В других движках многие подходы схожи, но сборка мусора во многих аспектах отличается. Глубокое понимание работы интерпретаторов необходимо, когда вам нужны низкоуровневые оптимизации. Было бы разумно запланировать их изучение как следующий шаг после освоения языка. From cb5fc6165e7d5a8527da195182ddb7b1215ff8db Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 17 Mar 2022 00:21:54 +0600 Subject: [PATCH 0129/1128] Update article.md --- .../03-garbage-collection/article.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 59b0d9a065..6d76a8854a 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -14,7 +14,7 @@ Например: - - Выполняемая в данный момент функция, ее локальные переменные и параметры. + - Выполняемая в данный момент функция, её локальные переменные и параметры. - Другие функции в текущей цепочке вложенных вызовов, их локальные переменные и параметры. - Глобальные переменные. - (некоторые другие внутренние значения) @@ -25,7 +25,7 @@ Например, если в глобальной переменной есть объект, и он имеет свойство, в котором хранится ссылка на другой объект, то *этот* объект считается достижимым. И те, на которые он ссылается, тоже достижимы. Далее вы познакомитесь с подробными примерами на эту тему. -В интерпретаторе JavaScript есть фоновый процесс, который называется [сборщик мусора](https://ru.wikipedia.org/wiki/Сборка_мусора). Он следит за всеми объектами и удаляет те, которые стали недостижимы. +В движке JavaScript есть фоновый процесс, который называется [сборщиком мусора](https://ru.wikipedia.org/wiki/Сборка_мусора). Он отслеживает все объекты и удаляет те, которые стали недоступными. ## Простой пример @@ -40,7 +40,7 @@ let user = { ![](memory-user-john.svg) -Здесь стрелка обозначает ссылку на объект. Глобальная переменная `user` ссылается на объект `{name: "John"}` (мы будем называть его просто "John"). В свойстве `"name"` объекта John хранится примитив, поэтому оно нарисовано внутри объекта. +Здесь стрелка обозначает ссылку на объект. Глобальная переменная `user` ссылается на объект `{name: "John"}` (мы будем называть его просто "John" для краткости). В свойстве `"name"` объекта John хранится примитив, поэтому оно нарисовано внутри объекта. Если перезаписать значение `user`, то ссылка потеряется: @@ -115,7 +115,7 @@ delete family.mother.husband; ![](family-delete-refs.svg) -Недостаточно удалить только одну из этих ссылок, потому что все объекты останутся достижимыми. +Недостаточно удалить только одну из этих двух ссылок, потому что все объекты останутся достижимыми. Но если мы удалим обе, то увидим, что у объекта John больше нет входящих ссылок: @@ -129,7 +129,7 @@ delete family.mother.husband; ## Недостижимый "остров" -Вполне возможна ситуация, при которой целый "остров" связанных объектов может стать недостижимым и удалиться из памяти. +Вполне возможна ситуация, при которой целый "остров" взаимосвязанных объектов может стать недостижимым и удалиться из памяти. Возьмём объект `family` из примера выше. А затем: @@ -145,68 +145,68 @@ family = null; Объекты John и Ann всё ещё связаны, оба имеют входящие ссылки, но этого недостаточно. -У объекта `family` больше нет ссылки от корня, поэтому весь "остров" становится недостижимым и будет удалён. +Бывший объект `family` был отсоединён от корня, на него больше нет ссылки, поэтому весь "остров" становится недоступным и будет удалён. ## Внутренние алгоритмы -Основной алгоритм сборки мусора - "алгоритм пометок" (англ. "mark-and-sweep"). +Основной алгоритм сборки мусора называется "разметка и зачистка" (от англ. "mark-and-sweep"). Согласно этому алгоритму, сборщик мусора регулярно выполняет следующие шаги: -- Сборщик мусора "помечает" (запоминает) все корневые объекты. -- Затем он идёт по их ссылкам и помечает все найденные объекты. -- Затем он идёт по ссылкам помеченных объектов и помечает объекты, на которые есть ссылка от них. Все объекты запоминаются, чтобы в будущем не посещать один и тот же объект дважды. -- ...И так далее, пока не будут посещены все ссылки (достижимые от корней). +- Сборщик мусора берет корни и "помечает" (запоминает) их. +- Затем он идёт по ним и "помечает" все ссылки из них. +- Затем он идёт по отмеченным объектам и отмечает их ссылки. Все посещённые объекты запоминаются, чтобы в будущем не посещать один и тот же объект дважды. +- ...И так далее, пока не будут посещены все достижимые (из корней) ссылки. - Все непомеченные объекты удаляются. Например, пусть наша структура объектов выглядит так: ![](garbage-collection-1.svg) -Явно виден "недостижимый остров" справа. Теперь посмотрим, как будет работать "алгоритм пометок" сборщика мусора. +Мы ясно видим "недостижимый остров" справа. Теперь давайте посмотрим, как будет работать "разметка и зачистка" сборщика мусора. На первом шаге помечаются корни: ![](garbage-collection-2.svg) -Затем помечаются объекты по их ссылкам: +Затем помечаются их ссылки: ![](garbage-collection-3.svg) -...а затем объекты по их ссылкам и так далее, пока это вообще возможно: +...И их ссылки, пока это вообще возможно: ![](garbage-collection-4.svg) -Теперь объекты, до которых не удалось дойти от корней, считаются недостижимыми и будут удалены: +ТТеперь объекты, которые не удалось посетить в процессе, считаются недостижимыми и будут удалены: ![](garbage-collection-5.svg) -Это и есть принцип работы сборки мусора. +Мы также можем представить себе этот процесс как выливание огромного ведра краски из корней, которая течёт по всем ссылкам и отмечает все достижимые объекты. Затем непомеченные удаляются. -Интерпретаторы JavaScript применяют множество оптимизаций, чтобы сборка мусора работала быстрее и не влияла на производительность. +Это концепция того, как работает сборка мусора. Движки JavaScript применяют множество оптимизаций, чтобы он работал быстрее и не влиял на выполнение. Вот некоторые из оптимизаций: -- **Сборка по поколениям (Generational collection)** - объекты делятся на "новые" и "старые". Многие объекты появляются, выполняют свою задачу и быстро умирают, их можно удалять более агрессивно. Те, которые живут достаточно долго, становятся "старыми" и проверяются реже. -- **Инкрементальная сборка (Incremental collection)** - если объектов много, то обход всех ссылок и пометка достижимых объектов может занять значительное время и привести к видимым задержкам выполнения скрипта. Поэтому интерпретатор пытается организовать сборку мусора поэтапно. Этапы выполняются по отдельности один за другим. Это требует дополнительного учёта для отслеживания изменений между этапами, но зато теперь у нас есть много крошечных задержек вместо одной большой. +- **Сборка по поколениям (Generational collection)** – объекты разделены на два набора: "новые" и "старые". Многие объекты появляются, выполняют свою работу и быстро умирают, их можно агрессивно очищать. Те, которые выживают достаточно долго, становятся "старыми" и проверяются реже. +- **Инкрементальная сборка (Incremental collection)** – если объектов много, и мы пытаемся обойти и пометить весь набор объектов сразу, это может занять некоторое время и привести к видимым задержкам в выполнения скрипта. Таким образом, движок пытается разделить сборку мусора на части. Затем части выполняются одна за другой, по отдельности. Это требует дополнительного учёта для отслеживания изменений между частями, но у нас много крошечных задержек вместо одной большой. - **Сборка в свободное время (Idle-time collection)** - чтобы уменьшить возможное влияние на производительность, сборщик мусора старается работать только во время простоя процессора. -Существуют и другие способы оптимизации и разновидности алгоритмов сборки мусора. Но как бы мне ни хотелось описать их здесь, я должен воздержаться от этого, потому что разные интерпретаторы JavaScript применяют разные приёмы и хитрости. И, что более важно, всё меняется по мере развития интерпретаторов, поэтому углубляться в эту тему заранее, без реальной необходимости, вероятно, не стоит. Если, конечно, это не вопрос чистого интереса, тогда для вас будут полезны некоторые ссылки ниже. +Существуют и другие способы оптимизации и разновидности алгоритмов сборки мусора. Но как бы мне ни хотелось описать их здесь, я должен воздержаться, потому что разные движки реализуют разные хитрости и методы. И, что ещё более важно, все меняется по мере развития движков, поэтому изучать глубже "заранее", без реальной необходимости, вероятно, не стоит. Если, конечно, это не вопрос чистого интереса, то для вас будет несколько ссылок ниже. ## Итого -Главное из того, что мы узнали: +Главное, что нужно знать: - Сборка мусора выполняется автоматически. Мы не можем ускорить или предотвратить её. - Объекты сохраняются в памяти, пока они достижимы. -- Наличие ссылки не гарантирует, что объект достижим (от корня): несколько взаимосвязанных объектов могут стать недостижимыми как единое целое. +- Наличие ссылки - это не то же самое, что быть достижимым (из корня): свора взаимосвязанных объектов может стать недоступна в целом. -Современные интерпретаторы реализуют передовые алгоритмы сборки мусора. +Современные движки реализуют передовые алгоритмы сборки мусора. -Некоторые из них освещены в книге "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones и др.). +Общие сведения о некоторых из них освещены в книге "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones и др.). -Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора интерпретатора V8 находится в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). +Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора V8 находится в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). -Также в [блоге движка V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам необходимо понимать, как устроен внутри интерпретатор V8 в целом. Об этом вы можете почитать в блоге [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещён статьями в интернете. В других движках многие подходы схожи, но сборка мусора во многих аспектах отличается. +Также в [блоге V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам лучше подготовиться, узнав о том как устроен движок V8 внутри в целом и почитав блог [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещается в статьях в Интернете. Для других движков многие подходы схожи, но сборка мусора отличается во многих аспектах. -Глубокое понимание работы интерпретаторов необходимо, когда вам нужны низкоуровневые оптимизации. Было бы разумно запланировать их изучение как следующий шаг после освоения языка. +Глубокое понимание работы движков полезно, когда вам нужна низкоуровневая оптимизация. Было бы разумно запланировать их изучение как следующий шаг после того, как вы познакомитесь с языком. From a18c502e757d269a82a62ce1a28c9593999d917c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 17 Mar 2022 02:05:37 +0600 Subject: [PATCH 0130/1128] add comma --- 8-web-components/3-shadow-dom/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/8-web-components/3-shadow-dom/article.md b/8-web-components/3-shadow-dom/article.md index e67f0f6eb7..ef862635ae 100644 --- a/8-web-components/3-shadow-dom/article.md +++ b/8-web-components/3-shadow-dom/article.md @@ -75,7 +75,7 @@ customElements.define('show-hello', class extends HTMLElement { Есть два ограничения: 1. Для каждого элемента мы можем создать только один shadow root. -2. В качестве `elem` может быть использован пользовательский элемент (Custom Element), либо один из следующих элементов: "article", "aside", "blockquote", "body", "div", "footer", "h1..h6", "header", "main" "nav", "p", "section" или "span". Остальные, например, ``, не могут содержать теневое дерево. +2. В качестве `elem` может быть использован пользовательский элемент (Custom Element), либо один из следующих элементов: "article", "aside", "blockquote", "body", "div", "footer", "h1..h6", "header", "main", "nav", "p", "section" или "span". Остальные, например, ``, не могут содержать теневое дерево. Свойство `mode` задаёт уровень инкапсуляции. У него может быть только два значения: - `"open"` -- корень теневого дерева ("shadow root") доступен как `elem.shadowRoot`. From d9688c6c616e529c35eccf0fbfc83696929ba4b9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 18 Mar 2022 02:31:45 +0600 Subject: [PATCH 0131/1128] update article! --- .../06-constructor-new/article.md | 122 +++++++++--------- 1 file changed, 63 insertions(+), 59 deletions(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index 97733dd2c1..85898e7474 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -1,15 +1,15 @@ -# Конструкторы, создание объектов через "new" +# Конструктор, оператор "new" -Обычный синтаксис `{...}` позволяет создать только один объект. Но зачастую нам нужно создать множество однотипных объектов, таких как пользователи, элементы меню и т.д. +Обычный синтаксис `{...}` позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как множе пользователи, элементы меню и так далее. Это можно сделать при помощи функции-конструктора и оператора `"new"`. ## Функция-конструктор -Функции-конструкторы являются обычными функциями. Но есть два соглашения: +Функции-конструкторы технически являются обычными функциями. Однако есть два соглашения: 1. Имя функции-конструктора должно начинаться с большой буквы. -2. Функция-конструктор должна вызываться при помощи оператора `"new"`. +2. Они должны выполняться только с помощью оператора `"new"`. Например: @@ -20,20 +20,20 @@ function User(name) { } *!* -let user = new User("Вася"); +let user = new User("Jack"); */!* -alert(user.name); // Вася +alert(user.name); // Jack alert(user.isAdmin); // false ``` -Когда функция вызывается как `new User(...)`, происходит следующее: +Когда функция выполняется с помощью `new`, она выполняет следующие действия: -1. Создаётся новый пустой объект, и он присваивается `this`. -2. Выполняется код функции. Обычно он модифицирует `this`, добавляет туда новые свойства. +1. Создаётся новый пустой объект, которому присваивается значение `this`. +2. Выполняется тело функции. Обычно он модифицирует `this`, добавляя туда новые свойства. 3. Возвращается значение `this`. -Другими словами, вызов `new User(...)` делает примерно вот что: +Другими словами, `new User(...)` делает что-то вроде: ```js function User(name) { @@ -51,45 +51,48 @@ function User(name) { } ``` -То есть, результат вызова `let user = new User("Вася")` - это тот же объект, что и: +Таким образом, `let user = new User("Jack")` даёт тот же результат, что и: ```js let user = { - name: "Вася", + name: "Jack", isAdmin: false }; ``` -Теперь, когда нам необходимо будет создать других пользователей, мы можем использовать `new User("Маша")`, -`new User("Даша")` и т.д. Данная конструкция гораздо удобнее и читабельнее, чем каждый раз создавать литерал объекта. Это и является основной целью конструкторов - удобное повторное создание однотипных объектов. +Теперь, если нам будет необходимо создать других пользователей, мы можем просто вызвать `new User("Ann")`, `new User("Alice")` и так далее. Данная конструкция гораздо удобнее и читабельнее, чем каждый раз создавать литерал объекта. -Ещё раз заметим: технически любая функция может быть использована как конструктор. То есть, каждая функция может быть вызвана при помощи оператора `new`, и выполнится алгоритм, указанный выше в примере. Заглавная буква в названии функции является всеобщим соглашением по именованию, она как бы подсказывает разработчику, что данная функция является функцией-конструктором, и её нужно вызывать через `new`. +Это и есть основная цель конструкторов - реализовать код для многократного создания однотипных объектов. + +Давайте ещё раз отметим - технически любая функция (кроме функций со стрелками, поскольку у них нет `this`) может использоваться в качестве конструктора. Его можно запустить с помощью `new`, и он выполнит выше указанный алгоритм. Должна начинаться с "заглавной буквы" - это общее соглашение, чтобы было ясно, что функция должна вызываться с помощью "new". ````smart header="new function() { ... }" -Если в нашем коде большое количество строк, создающих один сложный объект, мы можем обернуть их в функцию-конструктор следующим образом: +Если у нас есть много строк кода, посвящённых созданию одного сложного объекта, мы можем обернуть их в немедленно вызываемую функцию-конструктор, вот так: ```js -let user = new function() { - this.name = "Вася"; +// создаём функцию и сразу же вызываем её с помощью new +let user = new function() { + this.name = "John"; this.isAdmin = false; // ...другой код для создания пользователя - // возможна любая сложная логика и выражения - // локальные переменные и т. д. + // может быть, сложная логика и инструкции + // локальные переменные и так далее }; ``` -Такой конструктор не может быть вызван дважды, так как он нигде не сохраняется, просто создаётся и тут же вызывается. Таким образом, такой метод создания позволяет инкапсулировать код, который создаёт отдельный объект, но без возможности его повторного использования. + +Такой конструктор не может быть вызван снова, так как он нигде не сохраняется, просто создаётся и тут же вызывается. Таким образом, этот трюк направлен на инкапсуляцию кода, который создаёт отдельный объект, без возможности повторного использования в будущем. ```` ## Проверка на вызов в режиме конструктора: new.target ```smart header="Продвинутая возможность" -Данный метод используется очень редко. Вы можете пропустить эту секцию, если не хотите углубляться в детали языка. +Синтаксис из этого раздела используется крайне редко, пропустите его, если не хотите углубляться вo все детали языка. ``` Используя специальное свойство `new.target` внутри функции, мы можем проверить, вызвана ли функция при помощи оператора `new` или без него. -В случае, если функция вызвана при помощи `new`, то в `new.target` будет сама функция, в противном случае `undefined`. +Он будет `undefined` для обычных вызовов и равен функции, если вызывается с помощью `new`: ```js run function User() { @@ -107,43 +110,44 @@ new User(); // function User { ... } */!* ``` -Это можно использовать, чтобы отличить обычный вызов от вызова "в режиме конструктора". В частности, вот так можно сделать, чтобы функцию можно было вызывать как с, так и без `new`: +Это можно использовать внутри функции, чтобы узнать, была ли она вызвана при `new`, "в режиме конструктора", или без него, "в обычном режиме". + +Мы также можем сделать чтобы `new` и обычные вызовы делали то же самое, как-то так: ```js run function User(name) { - if (!new.target) { // в случае, если вы вызвали без оператора new - return new User(name); // ...добавим оператор new за вас + if (!new.target) { // в случае, если вы вызвали меня без оператора new + return new User(name); // ...я добавлю new за вас } this.name = name; } -let vasya = User("Вася"); // переадресовывает вызовы на new User -alert(vasya.name); // Вася +let john = User("John"); // переадресовывает вызовы на new User +alert(john.name); // John ``` -Такой подход иногда используется в библиотеках для создания более гибкого синтаксиса, который позволяет разработчикам вызывать функции при помощи оператора `new` или без него. - -Впрочем, это не очень хорошая практика, так как отсутствие `new` может ввести разработчика в заблуждение. С оператором `new` мы точно знаем, что в итоге будет создан новый объект. +Такой подход иногда используется в библиотеках, чтобы сделать синтаксис более гибким. Так чтобы люди могли вызывать функцию с "new" или без него, и она все ещё могла работать. +Впрочем вероятно, это не очень хорошая практика использовать этот трюк везде, так как опуск `new` делает немного менее очевидным то, что происходит. С помощью `new` мы все знаем, что создаётся новый объект. ## Возврат значения из конструктора return -Обычно конструкторы ничего не возвращают явно. Их задача - записать все необходимое в `this`, который в итоге станет результатом. +Обычно конструкторы не имеют `return`. Их задача - записать все необходимое в `this`, и это автоматически становится результатом. Но если `return` всё же есть, то применяется простое правило: -- При вызове `return` с объектом, будет возвращён объект, а не `this`. -- При вызове `return` с примитивным значением, примитивное значение будет отброшено. +- При вызове `return` с объектом, вместо `this` возвращается объект. +- При вызове `return` с примитивным значением, оно игнорируется. -Другими словами, `return` с объектом возвращает объект, в любом другом случае конструктор вернёт `this`. +Другими словами, `return` с объектом возвращает этот объект, во всех остальных случаях возвращается `this`. -В примере ниже `return` возвращает объект вместо `this`: +К примеру, здесь `return` замещает `this`, возвращая объект: ```js run function BigUser() { - this.name = "Вася"; + this.name = "John"; return { name: "Godzilla" }; // <-- возвращает этот объект } @@ -151,24 +155,23 @@ function BigUser() { alert( new BigUser().name ); // Godzilla, получили этот объект ``` -А вот пример с пустым `return` (или мы могли бы поставить примитив после `return`, неважно) +А вот пример с пустым `return` (или мы могли бы поставить примитив после `return`, неважно): ```js run function SmallUser() { - this.name = "Вася"; + this.name = "John"; return; // <-- возвращает this } -alert( new SmallUser().name ); // Вася +alert( new SmallUser().name ); // John ``` -Обычно у конструкторов отсутствует `return`. В данном блоке мы упомянули особое поведение с возвращаемыми объектами, чтобы не оставлять пробелов в изучении языка. - +Обычно у конструкторов отсутствует `return`. Здесь мы упоминаем об особом поведении с возвращаемыми объектами в основном для полноты картины. -````smart header="Отсутствие скобок" -Кстати, мы можем не ставить скобки после `new`, если вызов конструктора идёт без аргументов. +````smart header="Опуск скобок" +Кстати, мы можем не ставить круглые скобки после `new`, если у него нет аргументов: ```js let user = new User; // <-- без скобок @@ -176,16 +179,16 @@ let user = new User; // <-- без скобок let user = new User(); ``` -Пропуск скобок считается плохой практикой, но синтаксис языка такое позволяет. +Пропуск здесь не считается "хорошим стилем", но такой синтаксис разрешён спецификацией. ```` ## Создание методов в конструкторе -Использование конструкторов для создания объектов даёт большую гибкость. Можно передавать конструктору параметры, определяющие, как создавать объект, и что в него записывать. +Использование функций конструктора для создания объектов обеспечивает большую гибкость. Функции-конструкторы могут иметь параметры, определяющие, как создавать объект и что в него помещать. -В `this` мы можем добавлять не только свойства, но и методы. +Конечно, мы можем добавить к `this` не только свойства, но и методы. -Например, в примере ниже, `new User(name)` создаёт объект с данным именем `name` и методом `sayHi`: +Например, `new User(name)` ниже создаёт объект с заданным `name` и методом `sayHi`: ```js run function User(name) { @@ -197,31 +200,32 @@ function User(name) { } *!* -let vasya = new User("Вася"); +let john = new User("John"); -vasya.sayHi(); // Меня зовут: Вася +john.sayHi(); // Меня зовут: John */!* /* -vasya = { - name: "Вася", +john = { + name: "John", sayHi: function() { ... } } */ ``` -Для создания сложных объектов есть и более "продвинутый" синтаксис - [классы](info:classes), которые мы разберём позже. +Для создания сложных объектов существует более продвинутый синтаксис, [классы](info:classes), который мы рассмотрим позже. ## Итого -- Функции-конструкторы или просто конструкторы являются обычными функциями, именовать которые следует с заглавной буквы. -- Конструкторы следует вызывать при помощи оператора `new`. Такой вызов создаёт пустой `this` в начале выполнения и возвращает заполненный в конце. +- Функции-конструкторы или просто конструкторы, являются обычными функциями, но существует общее соглашение именовать их с заглавной буквы. +- Функции-конструкторы следует вызывать только с помощью `new`. Такой вызов подразумевает создание пустого `this` в начале и возврат заполненного в конце. Мы можем использовать конструкторы для создания множества похожих объектов. -JavaScript предоставляет функции-конструкторы для множества встроенных объектов языка: например, `Date`, `Set` и других, которые нам ещё предстоит изучить. +JavaScript предоставляет функции-конструкторы для множества встроенных объектов языка: таких как `Date` для дат, `Set` для наборов и других, которые нам ещё предстоит изучить. + +```smart header="Объекты, we'll be back! (мы ещё вернёмся!)" +В этой главе мы рассмотрели только основы объектов и конструкторов. Данная информация необходима нам для дальнейшего изучения типов данных и функций в последующих главах. -```smart header="Объекты, мы к ним ещё вернёмся!" -В этой главе мы рассмотрели базовые принципы объектов и конструкторов. Данная информация необходима нам для дальнейшего изучения типов данных и функций. Как только мы с ними разберёмся, мы вернёмся к объектам для более детального изучения в -главах и . +После того, как мы с этим разберёмся, мы вернёмся к объектам для более детального изучения в главах и . ``` From 24029aee0c6a1ae3937862370320ad62102374dd Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 18 Mar 2022 02:36:59 +0600 Subject: [PATCH 0132/1128] smth --- 1-js/04-object-basics/06-constructor-new/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index 85898e7474..c40e8636c3 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -1,6 +1,6 @@ # Конструктор, оператор "new" -Обычный синтаксис `{...}` позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как множе пользователи, элементы меню и так далее. +Обычный синтаксис `{...}` позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как множество пользователей, элементы меню и так далее. Это можно сделать при помощи функции-конструктора и оператора `"new"`. From f741ff5790d1bee9085ea2cb417355b22755bac6 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 18 Mar 2022 23:44:04 +0600 Subject: [PATCH 0133/1128] minor fix --- 1-js/04-object-basics/04-object-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index 7db6006b2d..1b567fa354 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -82,7 +82,7 @@ user = { // сокращённая запись выглядит лучше, не так ли? user = { *!* - sayHi() { // то же самое, что и "sayHi: function()" + sayHi() { // то же самое, что и "sayHi: function(){...}" */!* alert("Привет"); } From 43a095de392ce3416cbcb229e2a275fb660ba412 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 19 Mar 2022 16:24:58 +0600 Subject: [PATCH 0134/1128] typo --- 1-js/04-object-basics/04-object-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index 1b567fa354..7e47957856 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -35,7 +35,7 @@ user.sayHi(); // Привет! Здесь мы просто использовали Function Expression (функциональное выражение), чтобы создать функцию приветствия, и присвоили её свойству `user.sayHi` нашего объекта. -Затем мы можем вызвать ee как `user.SayHi()`. Теперь пользователь может говорить! +Затем мы можем вызвать ee как `user.sayHi()`. Теперь пользователь может говорить! Функцию, которая является свойством объекта, называют *методом* этого объекта. From af76b071939c6d4971aa04a1d760de01160aeb2d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 20 Mar 2022 12:56:07 +0600 Subject: [PATCH 0135/1128] typo --- 1-js/04-object-basics/04-object-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index 7e47957856..0e347fe118 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -233,7 +233,7 @@ sayHi(); // undefined Эта концепция вычисления `this` в момент исполнения имеет как свои плюсы, так и минусы. С одной стороны, функция может быть повторно использована в качестве метода у различных объектов (что повышает гибкость). С другой стороны, большая гибкость создаёт больше возможностей для ошибок. -Здесь наша позиция заключается не в том, чтобы судить, является ли это архитектурное решение в языке хорошим или плохим. Мы должны понимать, как с этим работать, чтобы получать выгоды и избегать проблем. +Здесь наша позиция заключается не в том, чтобы судить, является ли это архитектурное решение в языке хорошим или плохим. Скоро мы поймем, как с этим работать, как получить выгоду и избежать проблем. ``` ## У стрелочных функций нет "this" From 03da499e0fcc8c53db93f6b4497331255e7c6c11 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 20 Mar 2022 21:00:50 +0600 Subject: [PATCH 0136/1128] smth --- .../solution.md | 1 - .../3-primitive-conversions-questions/task.md | 1 - .../11-logical-operators/article.md | 2 +- .../12-nullish-coalescing-operator/article.md | 33 ++++++++++--------- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/solution.md b/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/solution.md index a71061606e..24d683549d 100644 --- a/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/solution.md +++ b/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/solution.md @@ -9,7 +9,6 @@ true + false = 1 "$" + 4 + 5 = "$45" "4" - 2 = 2 "4px" - 2 = NaN -7 / 0 = Infinity " -9 " + 5 = " -9 5" // (3) " -9 " - 5 = -14 // (4) null + 1 = 1 // (5) diff --git a/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/task.md b/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/task.md index 1009616c35..ccabd3689b 100644 --- a/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/task.md +++ b/1-js/02-first-steps/08-operators/3-primitive-conversions-questions/task.md @@ -16,7 +16,6 @@ true + false "$" + 4 + 5 "4" - 2 "4px" - 2 -7 / 0 " -9 " + 5 " -9 " - 5 null + 1 diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index ec2dcfcad3..328c5f4c5f 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -1,6 +1,6 @@ # Логические операторы -В JavaScript есть три логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ). +В JavaScript есть четыре логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ), `??` (Оператор нулевого слияния). Здесь мы рассмотрим первые три, оператор `??` будет в следующей статье. Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип. diff --git a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md index 950c8fdb51..7f29fb0da0 100644 --- a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md +++ b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md @@ -2,10 +2,10 @@ [recent browser="new"] -В этой статье мы будем говорить, что значение выражения "определено", если оно отличается от `null` или `undefined`. - Оператор нулевого слияния представляет собой два вопросительных знака `??`. +Так как он рассматривает `null` и `undefined` аналогично, мы введём специальный термин. Мы будем говорить, что выражение "определено", только если оно не равняется ни `null`, ни `undefined`. + Результат выражения `a ?? b` будет следующим: - `a`, если значение `a` определено, - `b`, если значение `a` не определено. @@ -20,29 +20,31 @@ result = (a !== null && a !== undefined) ? a : b; ``` +Теперь должно быть абсолютно ясно, что `??` делает. Давайте посмотрим, где это может быть полезно. + Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной. -Например, в следующем примере, если переменная `user` не определена, покажем модальное окно с надписью `Аноним`: +Например, здесь мы отобразим `user`, если он определен, в противном случае `Аноним`: ```js run let user; -alert(user ?? "Аноним"); // Аноним +alert(user ?? "Аноним"); // Аноним (user не определен) ``` -Конечно, если бы переменная `user` содержала любое значение, кроме `null/undefined`, то мы бы увидели его: +Вот пример `user`, с присвоенным именем: ```js run let user = "Иван"; -alert(user ?? "Аноним"); // Иван +alert(user ?? "Аноним"); // Иван (user определен) ``` Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое значение из списка, которое не является `null/undefined`. -Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть неопределёнными, если отсутствует соответствующая информация. +Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть не определены, если пользователь решил не вводить значение. -Выведем имя пользователя, используя одну из этих переменных, а в случае если все они не определены, то покажем "Аноним". +Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Анонимный", если все они не определены. Для этого воспользуемся оператором `??`: @@ -74,7 +76,7 @@ alert(firstName || lastName || nickName || "Аноним"); // Суперкод */!* ``` -Оператор ИЛИ `||` существует с самого появления JavaScript, поэтому ранее для решения похожих задач разработчики использовали именно его. +Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала существования JavaScript, поэтому разработчики долгое время использовали его для таких целей. С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`. @@ -95,17 +97,18 @@ alert(height || 100); // 100 alert(height ?? 100); // 0 ``` -- `height || 100` проверяет, имеет ли переменная `height` ложное значение, что так и есть, - - поэтому результатом является второй аргумент, т.е. `100`. +- `height || 100` проверяет `height` на наличие ложного значения, оно равно `0`, так что это действительно false. + - поэтому результатом `||` является второй аргумент, т.е. `100`. - `height ?? 100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так, - то результатом является сама переменная `height`, т.е. `0`. -Если нулевая высота является "нормальным" значением, которое не должно заменяться значением по умолчанию, то оператор `??` делает как раз то, что нужно. +На практике нулевая высота часто является вполне возможным значением, которое не следует заменять значением по умолчанию. Таким образом, `??` делает все правильно. ## Приоритет -Оператор `??` имеет довольно низкий приоритет: `4`, согласно [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). -Таким образом, оператор `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`. +Приоритет оператора `??` такой же, как и у `||`. Они оба равны `4` в [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table). + +Это означает, что, как и `||`, оператор нулевого слияния `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`. Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки: @@ -139,7 +142,7 @@ let area = height ?? (100 * width) ?? 50; let x = 1 && 2 ?? 3; // Синтаксическая ошибка ``` -Это довольно спорное ограничение, которое было описано в спецификации языка, чтобы избежать ошибок при замене оператора `||` на `??`. +Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать ошибок программирования, когда люди начнут переключаться с `||` на `??`. Используйте круглые скобки, чтобы обойти это ограничение: From 924c549335021be0bb8c1ef7348f49d692a61173 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 21 Mar 2022 20:24:33 +0600 Subject: [PATCH 0137/1128] smth --- .../07-optional-chaining/article.md | 162 +++++++++++------- 1 file changed, 99 insertions(+), 63 deletions(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index eb4377daab..58cc72e763 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -7,46 +7,82 @@ ## Проблема "несуществующего свойства" -Если вы только начали читать учебник и изучать JavaScript, то, возможно, эта проблема вам пока незнакома, но она достаточно распространена. +Если вы только начали читать учебник и изучать JavaScript, то, возможно, проблема вас еще не коснулась, но она довольно распространена. -Например, рассмотрим объекты для пользователей `user`. У большинства пользователей есть адрес `user.address` с улицей `user.address.street`, но некоторые адрес не указали. +В качестве примера предположим, что у нас есть объекты "user", которые содержат информацию о наших пользователях. -В этом случае при попытке получить свойство `user.address.street` будет ошибка: +У большинства наших пользователей есть адреса в свойстве `user.address` с улицей `user.address.street`, но некоторые из них их не указали. + +В таком случае, когда мы попытаемся получить `user.address.street`(а пользователь окажется без адреса), мы получим ошибку: ```js run -let user = {}; // пользователь без свойства address +let user = {}; // пользователь без свойства "address" -alert(user.address.street); // ошибка! +alert(user.address.street); // Ошибка! ``` -Это нормальный результат, так работает JavaScript, но во многих реальных ситуациях удобнее было бы получать не ошибку, а просто `undefined` ("нет улицы"). +Это ожидаемый результат. JavaScript работает следующим образом. Поскольку `user.address` имеет значение `undefined`, попытка получить `user.address.street` завершается ошибкой. + +Во многих практических случаях мы бы предпочли получить здесь `undefined` вместо ошибки (что означало бы "улицы нет"). -Или ещё пример. В веб-разработке нам бывает нужно получить данные об HTML-элементе, который иногда может отсутствовать на странице: +...и еще один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет. ```js run -// Произойдёт ошибка, если querySelector(...) равен null. -let html = document.querySelector('.my-element').innerHTML; +// document.querySelector('.elem') равен нулю, если элемента нет +let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен нулю ``` -До появления `?.` в языке для решения подобных проблем использовался оператор `&&`. +Еще раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата. -Например: +Как мы можем это сделать? + +Очевидным решением было бы проверить значение с помощью `if` или условного оператора `?`, прежде чем обращаться к его свойству, вот так: + +```js +let user = {}; + +alert(user.address ? user.address.street : undefined); +``` + +Это работает, тут нет ошибки... Но это довольно неэлегантно. Как вы можете видеть, `"user.address"` появляется в коде дважды. Для более глубоко вложенных свойств это становится проблемой, поскольку потребуется больше повторений. + +Так например, давайте попробуем получить `user.address.street.name`. + +Нам нужно проверить как `user.address`, так и `user.address.street`: + +```js +let user = {}; // у пользователя нет адреса + +alert(user.address ? user.address.street ? user.address.street.name : null : null); +``` + +Это просто ужасно, у кого-то могут даже возникнуть проблемы с пониманием такого кода. + +Даже не беспокойтесь об этом, так как есть лучший способ написать это, используя оператор `&&`: ```js run let user = {}; // пользователь без адреса -alert( user && user.address && user.address.street ); // undefined (без ошибки) +alert( user.address && user.address.street && user.address.street.name ); // undefined (без ошибки) ``` -Использование логического И со всей цепочкой свойств гарантирует, что все они существуют (а если нет - вычисление прекращается), но это довольно длинная и громоздкая конструкция. +Проход при помощи логического оператора И '`&&` через весь путь к свойству гарантирует, что все компоненты существуют (если нет, вычисление прекращается), но также не является идеальным. + +Как вы можете видеть, имена свойств по-прежнему дублируются в коде. Например, в приведенном выше коде `user.address` появляется три раза. + +Вот почему в язык была добавлена опциональная цепочка `?.`. Чтобы решить эту проблему раз и навсегда! ## Опциональная цепочка -Опциональная цепочка `?.` останавливает вычисление и возвращает `undefined`, если часть перед `?.` имеет значение `undefined` или `null`. +Опциональная цепочка `?.` останавливает вычисление и возвращает `undefined`, если значение перед `?.` имеет значение `undefined` или `null`. + +**Далее в этой статье, для краткости, мы будем говорить, что что-то "существует", если оно не является `null` и не `undefined`.** -**Для краткости в этой статье мы будем говорить о значении, что оно "существует", если оно отличается от `null` или `undefined`.** +Другими словами, `value?.prop`: +- работает как `value.prop`, если значение `value` существует, +- в противном случае (когда `value` равно `undefined/null`) он возвращает `undefined`. -Вот безопасный способ обратиться к свойству `user.address.street`: +Вот безопасный способ получить доступ к `user.address.street`, используя `?.`: ```js run let user = {}; // пользователь без адреса @@ -54,7 +90,9 @@ let user = {}; // пользователь без адреса alert( user?.address?.street ); // undefined (без ошибки) ``` -Чтение адреса с помощью конструкции `user?.address` выполняется без ошибок, даже если объекта `user` не существует: +Код лаконичный и понятный, в нем вообще нет дублирования. + +Считывание адреса с помощью `user?.address` работает, даже если объект `user` не существует: ```js run let user = null; @@ -63,35 +101,33 @@ alert( user?.address ); // undefined alert( user?.address.street ); // undefined ``` -Обратите внимание, что синтаксис `?.` делает необязательным только свойство перед ним, а не какое-либо последующее. - -В приведённом выше примере конструкция `user?.` допускает, что переменная `user` может содержать `null/undefined`. +Обратите внимание: синтаксис `?.` делает необязательным значение перед ним, но не какое-либо последующее. -С другой стороны, если объект `user` существует, то в нём должно быть свойство `user.address`, иначе выполнение `user?.address.street` вызовет ошибку из-за второй точки. +Так например, в `user?.address.street.name` `?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`. ```warn header="Не злоупотребляйте опциональной цепочкой" -Используйте `?.` только тогда, когда допускаете ситуацию, что значение перед ним не существует. +Мы должны использовать `?.` только там, где это нормально, что чего-то не существует. -Например, если по нашей логике объект `user` точно существует, но его свойство `address` является необязательным, то предпочтительнее использовать следующую конструкцию: `user.address?.street`. +К примеру, если в соответствии с нашей логикой кодирования объект `user` должен существовать, но `address` является необязательным, то нам следует написать `user.address?.street`, но не `user?.address?.street`. -Тогда если переменная `user` по ошибке окажется пустой, мы увидим программную ошибку и исправим это. +Таким образом, если `user` окажется неопределенным из-за погрешности, мы увидим программную ошибку по этому поводу и исправим ее. В противном случае ошибки кодирования могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. ``` ````warn header="Переменная перед `?.` должна быть объявлена" -Если переменной `user` вообще не существует, то выражение `user?.anything` выдаст ошибку: +Если переменной `user` вообще нет, то `user?.anything` приведет к ошибке: ```js run // ReferenceError: user is not defined user?.address; ``` -Объявление переменной (например `let/const/var user`) обязательно должно быть. Опциональная цепочка работает только с существующими переменными. +Переменная должна быть объявлена (к примеру как, `let/const/var user` или как параметр функции). Опциональная цепочка работает только с объявленными переменными. ```` -## Сокращённое вычисление +## Короткое замыкание -Как уже говорилось, `?.` немедленно останавливает вычисление, если левой части не существует. +Как было сказано ранее, `?.` немедленно останавливает ("закорачивает\замыкает") вычисление, если левая часть не существует. -Таким образом, последующие вызовы функций или операции не будут выполнены. +Таким образом, если есть какие-либо последующие вызовы функций или побочные явления, они не совершаться. Например: @@ -99,86 +135,86 @@ user?.address; let user = null; let x = 0; -user?.sayHi(x++); // нет user, поэтому до x++ вычисление не дойдет +user?.sayHi(x++); // нет "sayHi", поэтому выполнение не достигает x++ -alert(x); // 0, значение не было увеличено на единицу +alert(x); // 0, значение не увеличилось ``` ## Другие варианты применения: ?.(), ?.[] Опциональная цепочка `?.` — это не оператор, а специальная синтаксическая конструкция, которая также работает с функциями и квадратными скобками. -Например, `?.()` используется для вызова потенциально несуществующей функции. +Например, `?.()` используется для вызова функции, которая может не существовать. -В следующем примере не у всех пользователей есть метод `admin`: +В приведенном ниже коде у некоторых наших пользователей есть метод `admin`, а у некоторых его нет: ```js run -let user1 = { +let userAdmin = { admin() { - alert("Я администратор"); + alert("I am admin"); } -} +}; -let user2 = {}; +let userGuest = {}; + +*!* +userAdmin.admin?.(); // I am admin +*/!* *!* -user1.admin?.(); // Я администратор -user2.admin?.(); +userGuest.admin?.(); // ничего (такого метода нет) */!* ``` -В обоих вызовах сначала используем точку (`user1.admin`), чтобы получить свойство `admin`, потому что объект пользователя точно существует, к нему можно обратиться без какой-либо ошибки. +Здесь в обеих строках мы сначала используем точку (`userAdmin.admin`), чтобы получить свойство `admin`, потому что мы предполагаем, что объект user существует, так что читать из него безопасно. -Затем уже `?.()` проверяет левую часть: если функция `admin` существует, то она выполнится (это так для `user1`). Иначе (для `user2`) вычисление остановится без ошибок. +Затем `?.()` проверяет левую часть: если функция `admin` существует, то она запускается (это так для `UserAdmin`). В противном случае (для `userGuest`) вычисление остановится без ошибок. -Также существует синтаксис `?.[]`, если значение свойства требуется получить с помощью квадратных скобок `[]`, а не через точку `.`. Как и в остальных случаях, такой способ позволяет защититься от ошибок при доступе к свойству объекта, которого может не быть. +Синтаксис `?.[]` также работает, если мы хотим использовать скобки `[]` для доступа к свойствам вместо точки `.`. Как и в предыдущих случаях, он позволяет безопасно считывать свойство из объекта, который может не существовать. ```js run +let key = "firstName"; + let user1 = { - firstName: "Иван" + firstName: "John" }; -let user2 = null; // Представим, что пользователь не авторизован - -let key = "firstName"; +let user2 = null; -alert( user1?.[key] ); // Иван +alert( user1?.[key] ); // John alert( user2?.[key] ); // undefined - -alert( user1?.[key]?.something?.not?.existing); // undefined ``` -Кроме этого, `?.` можно использовать совместно с `delete`: +Также мы можем использовать `?.` с `delete`: ```js run -delete user?.name; // Удалить user.name, если пользователь существует +delete user?.name; // удаляет user.name если пользователь существует ``` -````warn header="Можно использовать `?.` для безопасного чтения и удаления, но не для записи" +````warn header="Мы можем использовать `?.` для безопасного чтения и удаления, но не для записи" Опциональная цепочка `?.` не имеет смысла в левой части присваивания. Например: - ```js run -let user; +let user = null; -user?.name = "John"; // Ошибка, это не сработает -// это по сути то же самое что undefined = "John" +user?.name = "John"; // Error, не работает +// потому что он вычисляется как undefined = "John" ``` -Она недостаточно "умна" для этого. +Она недостаточно умна для этого. ```` ## Итого Синтаксис опциональной цепочки `?.` имеет три формы: -1. `obj?.prop` -- возвращает `obj.prop`, если существует `obj`, и `undefined` в противном случае. -2. `obj?.[prop]` -- возвращает `obj[prop]`, если существует `obj`, и `undefined` в противном случае. -3. `obj.method?.()` -- вызывает `obj.method()`, если существует `obj.method`, в противном случае возвращает `undefined`. +1. `obj?.prop` -- возвращает `obj.prop` если `obj` существует, в противном случае `undefined`. +2. `obj?.[prop]` -- возвращает `obj[prop]` если `obj` существует, в противном случае `undefined`. +3. `obj.метод?.()` -- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`. -Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть выражения на равенство `null/undefined`, и продолжает дальнейшее вычисление, только если это не так. +Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть на 'null/undefined` и позволяет продолжить вычисление, если это не так. -Цепочка `?.` позволяет без возникновения ошибок обратиться к вложенным свойствам. +Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам. -Тем не менее, нужно разумно использовать `?.` — только там, где это уместно, если допустимо, что левая часть не существует. Чтобы таким образом не скрывать возможные ошибки программирования. +Тем не менее, мы должны использовать `?.` осторожно, только там, где это допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут. From 5daf338d5cac7461dd29e15851d7134bdf4d63ac Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 21 Mar 2022 20:31:01 +0600 Subject: [PATCH 0138/1128] =?UTF-8?q?just=20placed=20"=D1=91"=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../07-optional-chaining/article.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 58cc72e763..db5f8a43f8 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -7,7 +7,7 @@ ## Проблема "несуществующего свойства" -Если вы только начали читать учебник и изучать JavaScript, то, возможно, проблема вас еще не коснулась, но она довольно распространена. +Если вы только начали читать учебник и изучать JavaScript, то, возможно, проблема вас ещё не коснулась, но она довольно распространена. В качестве примера предположим, что у нас есть объекты "user", которые содержат информацию о наших пользователях. @@ -25,14 +25,14 @@ alert(user.address.street); // Ошибка! Во многих практических случаях мы бы предпочли получить здесь `undefined` вместо ошибки (что означало бы "улицы нет"). -...и еще один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет. +...и ещё один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет. ```js run // document.querySelector('.elem') равен нулю, если элемента нет let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен нулю ``` -Еще раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата. +Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата. Как мы можем это сделать? @@ -68,7 +68,7 @@ alert( user.address && user.address.street && user.address.street.name ); // und Проход при помощи логического оператора И '`&&` через весь путь к свойству гарантирует, что все компоненты существуют (если нет, вычисление прекращается), но также не является идеальным. -Как вы можете видеть, имена свойств по-прежнему дублируются в коде. Например, в приведенном выше коде `user.address` появляется три раза. +Как вы можете видеть, имена свойств по-прежнему дублируются в коде. Например, в приведённом выше коде `user.address` появляется три раза. Вот почему в язык была добавлена опциональная цепочка `?.`. Чтобы решить эту проблему раз и навсегда! @@ -110,11 +110,11 @@ alert( user?.address.street ); // undefined К примеру, если в соответствии с нашей логикой кодирования объект `user` должен существовать, но `address` является необязательным, то нам следует написать `user.address?.street`, но не `user?.address?.street`. -Таким образом, если `user` окажется неопределенным из-за погрешности, мы увидим программную ошибку по этому поводу и исправим ее. В противном случае ошибки кодирования могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. +Таким образом, если `user` окажется неопределённым из-за погрешности, мы увидим программную ошибку по этому поводу и исправим её. В противном случае ошибки кодирования могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. ``` ````warn header="Переменная перед `?.` должна быть объявлена" -Если переменной `user` вообще нет, то `user?.anything` приведет к ошибке: +Если переменной `user` вообще нет, то `user?.anything` приведёт к ошибке: ```js run // ReferenceError: user is not defined @@ -146,7 +146,7 @@ alert(x); // 0, значение не увеличилось Например, `?.()` используется для вызова функции, которая может не существовать. -В приведенном ниже коде у некоторых наших пользователей есть метод `admin`, а у некоторых его нет: +В приведённом ниже коде у некоторых наших пользователей есть метод `admin`, а у некоторых его нет: ```js run let userAdmin = { @@ -213,7 +213,7 @@ user?.name = "John"; // Error, не работает 2. `obj?.[prop]` -- возвращает `obj[prop]` если `obj` существует, в противном случае `undefined`. 3. `obj.метод?.()` -- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`. -Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть на 'null/undefined` и позволяет продолжить вычисление, если это не так. +Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть на `null/undefined` и позволяет продолжить вычисление, если это не так. Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам. From 87df8510a5401eb695e91f3f5e49c3fdd43b6933 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Tue, 22 Mar 2022 17:45:57 +0300 Subject: [PATCH 0139/1128] minor fixes --- 1-js/09-classes/03-static-properties-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/03-static-properties-methods/article.md b/1-js/09-classes/03-static-properties-methods/article.md index 56b26311f4..11a384cb98 100644 --- a/1-js/09-classes/03-static-properties-methods/article.md +++ b/1-js/09-classes/03-static-properties-methods/article.md @@ -1,7 +1,7 @@ # Статические свойства и методы -Мы также можем присвоить метод самой функции-классу, а не её `"prototype"`. Такие методы называются *статическими*. +Мы также можем присвоить метод самому классу. Такие методы называются *статическими*. В классе такие методы обозначаются ключевым словом `static`, например: From 897723ce0cbe4ca5c808de6c20a6892182701f7b Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 23 Mar 2022 20:39:04 +0600 Subject: [PATCH 0140/1128] fix links --- .../1-why-return-false-fails/solution.md | 4 ++-- .../1-why-return-false-fails/task.md | 2 +- .../2-catch-link-navigation/solution.view/index.html | 2 +- .../2-catch-link-navigation/source.view/index.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/solution.md b/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/solution.md index 5ba0edea03..33c2f6ac7d 100644 --- a/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/solution.md +++ b/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/solution.md @@ -20,7 +20,7 @@ function(event) { } -w3.org +w3.org ``` Также мы можем использовать `event.preventDefault()`, например: @@ -35,5 +35,5 @@ function(event) { */!* -w3.org +w3.org ``` diff --git a/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/task.md b/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/task.md index e31af8d99d..606ae793b4 100644 --- a/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/task.md +++ b/2-ui/2-events/04-default-browser-action/1-why-return-false-fails/task.md @@ -14,7 +14,7 @@ importance: 3 } -браузер откроет w3.org +браузер откроет w3.org ``` Браузер переходит по указанной ссылке, но нам этого не нужно. diff --git a/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/solution.view/index.html b/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/solution.view/index.html index 0a724f261d..083cfac0d1 100644 --- a/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/solution.view/index.html +++ b/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/solution.view/index.html @@ -16,7 +16,7 @@
#contents

- Как насчёт того, чтобы прочитать Википедию или посетить W3.org и узнать о современных стандартах? + Как насчёт того, чтобы прочитать Википедию или посетить W3.org и узнать о современных стандартах?

diff --git a/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/source.view/index.html b/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/source.view/index.html index f6963f609a..b8e6509f6d 100644 --- a/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/source.view/index.html +++ b/2-ui/2-events/04-default-browser-action/2-catch-link-navigation/source.view/index.html @@ -16,7 +16,7 @@
#contents

- Как насчёт того, чтобы прочитать Википедию или посетить W3.org и узнать о современных стандартах? + Как насчёт того, чтобы прочитать Википедию или посетить W3.org и узнать о современных стандартах?

From bee2889190161148a025ce316602291b717eef82 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 23 Mar 2022 23:58:07 +0600 Subject: [PATCH 0141/1128] add changes according to https://github.com/javascript-tutorial/en.javascript.info/commit/bf6d3c959e28dfc4471e6abd00ce31b2a869526f --- .../03-static-properties-methods/article.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/1-js/09-classes/03-static-properties-methods/article.md b/1-js/09-classes/03-static-properties-methods/article.md index 11a384cb98..ff16301958 100644 --- a/1-js/09-classes/03-static-properties-methods/article.md +++ b/1-js/09-classes/03-static-properties-methods/article.md @@ -3,7 +3,7 @@ Мы также можем присвоить метод самому классу. Такие методы называются *статическими*. -В классе такие методы обозначаются ключевым словом `static`, например: +В объявлении класса они добавляются с помощью ключевого слова `static`, например: ```js run class User { @@ -29,9 +29,11 @@ User.staticMethod = function() { Значением `this` при вызове `User.staticMethod()` является сам конструктор класса `User` (правило "объект до точки"). -Обычно статические методы используются для реализации функций, принадлежащих классу, но не к каким-то конкретным его объектам. +Обычно статические методы используются для реализации функций, принадлежащих самому классу, а не какому-либо конкретному его объекту. -Например, есть объекты статей `Article`, и нужна функция для их сравнения. Естественное решение - сделать для этого метод `Article.compare`: +Например, есть объекты статей `Article`, и нужна функция для их сравнения. + +Естественным решением было бы добавить статический метод `Article.compare`: ```js run class Article { @@ -61,9 +63,11 @@ articles.sort(Article.compare); alert( articles[0].title ); // CSS ``` -Здесь метод `Article.compare` стоит "над" статьями, как способ их сравнения. Это метод не отдельной статьи, а всего класса. +Здесь метод `Article.compare` стоит "над" статьями, как средство для их сравнения. Это не метод статьи, а скорее метод всего класса. + +Другим примером может быть так называемый "фабричный" метод. -Другим примером может быть так называемый "фабричный" метод. Представим, что нам нужно создавать статьи различными способами: +Скажем, нам нужно несколько способов создания статьи: 1. Создание через заданные параметры (`title`, `date` и т. д.). 2. Создание пустой статьи с сегодняшней датой. @@ -99,7 +103,7 @@ alert( article.title ); // Сегодняшний дайджест ```js // предположим, что Article - это специальный класс для управления статьями -// статический метод для удаления статьи: +// статический метод для удаления статьи по id: Article.remove({id: 12345}); ``` From c7775b19bb22d357d15ebf3ef25048b8e7f0d443 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 24 Mar 2022 12:33:34 +0600 Subject: [PATCH 0142/1128] Update article.md --- 1-js/09-classes/03-static-properties-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/03-static-properties-methods/article.md b/1-js/09-classes/03-static-properties-methods/article.md index ff16301958..38a56a22eb 100644 --- a/1-js/09-classes/03-static-properties-methods/article.md +++ b/1-js/09-classes/03-static-properties-methods/article.md @@ -3,7 +3,7 @@ Мы также можем присвоить метод самому классу. Такие методы называются *статическими*. -В объявлении класса они добавляются с помощью ключевого слова `static`, например: +В объявление класса они добавляются с помощью ключевого слова `static`, например: ```js run class User { From c5c726d8df3b292cf8b003dae2af123b173cabd3 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 24 Mar 2022 12:55:59 +0600 Subject: [PATCH 0143/1128] Made the required changes --- .../07-optional-chaining/article.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index db5f8a43f8..2611df6b1d 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -28,8 +28,8 @@ alert(user.address.street); // Ошибка! ...и ещё один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет. ```js run -// document.querySelector('.elem') равен нулю, если элемента нет -let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен нулю +// document.querySelector('.elem') равен null, если элемента нет +let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен null ``` Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата. @@ -58,7 +58,7 @@ alert(user.address ? user.address.street ? user.address.street.name : null : nul Это просто ужасно, у кого-то могут даже возникнуть проблемы с пониманием такого кода. -Даже не беспокойтесь об этом, так как есть лучший способ написать это, используя оператор `&&`: +Вообще не стоит волноваться, так как есть лучший способ написать это, используя оператор `&&`: ```js run let user = {}; // пользователь без адреса @@ -74,7 +74,7 @@ alert( user.address && user.address.street && user.address.street.name ); // und ## Опциональная цепочка -Опциональная цепочка `?.` останавливает вычисление и возвращает `undefined`, если значение перед `?.` имеет значение `undefined` или `null`. +Опциональная цепочка `?.` останавливает вычисление и возвращает `undefined`, если значение перед `?.` равно `undefined` или `null`. **Далее в этой статье, для краткости, мы будем говорить, что что-то "существует", если оно не является `null` и не `undefined`.** @@ -106,11 +106,11 @@ alert( user?.address.street ); // undefined Так например, в `user?.address.street.name` `?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`. ```warn header="Не злоупотребляйте опциональной цепочкой" -Мы должны использовать `?.` только там, где это нормально, что чего-то не существует. +Нам следует использовать `?.` только там, где это нормально, что чего-то не существует. -К примеру, если в соответствии с нашей логикой кодирования объект `user` должен существовать, но `address` является необязательным, то нам следует написать `user.address?.street`, но не `user?.address?.street`. +К примеру, если в соответствии с нашей логикой кода объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`. -Таким образом, если `user` окажется неопределённым из-за погрешности, мы увидим программную ошибку по этому поводу и исправим её. В противном случае ошибки кодирования могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. +В этом случае, если вдруг `user` окажется `undefined`, мы увидим программную ошибку по этому поводу и исправим её. В противном случае, если слишком часто использовать `?.`, ошибки могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. ``` ````warn header="Переменная перед `?.` должна быть объявлена" @@ -120,14 +120,14 @@ alert( user?.address.street ); // undefined // ReferenceError: user is not defined user?.address; ``` -Переменная должна быть объявлена (к примеру как, `let/const/var user` или как параметр функции). Опциональная цепочка работает только с объявленными переменными. +Переменная должна быть объявлена (к примеру, как `let/const/var user` или как параметр функции). Опциональная цепочка работает только с объявленными переменными. ```` -## Короткое замыкание +## Вычисления по короткой схеме -Как было сказано ранее, `?.` немедленно останавливает ("закорачивает\замыкает") вычисление, если левая часть не существует. +Как было сказано ранее, `?.` немедленно останавливает вычисление, если левая часть не существует. -Таким образом, если есть какие-либо последующие вызовы функций или побочные явления, они не совершаться. +Так что если после `?.` есть какие-то вызовы функций или операции, то они не произойдут. Например: @@ -135,7 +135,7 @@ user?.address; let user = null; let x = 0; -user?.sayHi(x++); // нет "sayHi", поэтому выполнение не достигает x++ +user?.sayHi(x++); // нет "user", поэтому выполнение не достигает вызова sayHi и x++ alert(x); // 0, значение не увеличилось ``` @@ -202,7 +202,7 @@ user?.name = "John"; // Error, не работает // потому что он вычисляется как undefined = "John" ``` -Она недостаточно умна для этого. +Она недостаточно "умна" для этого. ```` ## Итого @@ -211,10 +211,10 @@ user?.name = "John"; // Error, не работает 1. `obj?.prop` -- возвращает `obj.prop` если `obj` существует, в противном случае `undefined`. 2. `obj?.[prop]` -- возвращает `obj[prop]` если `obj` существует, в противном случае `undefined`. -3. `obj.метод?.()` -- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`. +3. `obj.method?.()` -- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`. Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть на `null/undefined` и позволяет продолжить вычисление, если это не так. Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам. -Тем не менее, мы должны использовать `?.` осторожно, только там, где это допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут. +Тем не менее, мы должны использовать `?.` осторожно, только там, где допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут. From 9754e3ecaae95ca85eba7103cf1284a137c7f474 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 24 Mar 2022 18:45:04 +0600 Subject: [PATCH 0144/1128] mini change --- 1-js/04-object-basics/07-optional-chaining/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 2611df6b1d..4569186754 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -25,7 +25,7 @@ alert(user.address.street); // Ошибка! Во многих практических случаях мы бы предпочли получить здесь `undefined` вместо ошибки (что означало бы "улицы нет"). -...и ещё один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет. +...Или ещё один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет. ```js run // document.querySelector('.elem') равен null, если элемента нет From 51b22ee5674c5d67632ed6ff2fe11f06644e2a78 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 24 Mar 2022 19:12:36 +0600 Subject: [PATCH 0145/1128] smth --- .../07-optional-chaining/article.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 4569186754..4a1ae6c517 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -9,11 +9,11 @@ Если вы только начали читать учебник и изучать JavaScript, то, возможно, проблема вас ещё не коснулась, но она довольно распространена. -В качестве примера предположим, что у нас есть объекты "user", которые содержат информацию о наших пользователях. +В качестве примера предположим, что у нас есть объекты `user`, которые содержат информацию о наших пользователях. У большинства наших пользователей есть адреса в свойстве `user.address` с улицей `user.address.street`, но некоторые из них их не указали. -В таком случае, когда мы попытаемся получить `user.address.street`(а пользователь окажется без адреса), мы получим ошибку: +В таком случае, когда мы попытаемся получить `user.address.street`, а пользователь окажется без адреса, мы получим ошибку: ```js run let user = {}; // пользователь без свойства "address" @@ -46,7 +46,7 @@ alert(user.address ? user.address.street : undefined); Это работает, тут нет ошибки... Но это довольно неэлегантно. Как вы можете видеть, `"user.address"` появляется в коде дважды. Для более глубоко вложенных свойств это становится проблемой, поскольку потребуется больше повторений. -Так например, давайте попробуем получить `user.address.street.name`. +К примеру, давайте попробуем получить `user.address.street.name`. Нам нужно проверить как `user.address`, так и `user.address.street`: @@ -58,7 +58,7 @@ alert(user.address ? user.address.street ? user.address.street.name : null : nul Это просто ужасно, у кого-то могут даже возникнуть проблемы с пониманием такого кода. -Вообще не стоит волноваться, так как есть лучший способ написать это, используя оператор `&&`: +На самом деле это не большая проблема, так как есть лучший способ написать это, используя оператор `&&`: ```js run let user = {}; // пользователь без адреса @@ -106,9 +106,9 @@ alert( user?.address.street ); // undefined Так например, в `user?.address.street.name` `?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`. ```warn header="Не злоупотребляйте опциональной цепочкой" -Нам следует использовать `?.` только там, где это нормально, что чего-то не существует. +Нам следует использовать `?.` только там, где нормально, что чего-то не существует. -К примеру, если в соответствии с нашей логикой кода объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`. +К примеру, если, в соответствии с нашей логикой кода, объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`. В этом случае, если вдруг `user` окажется `undefined`, мы увидим программную ошибку по этому поводу и исправим её. В противном случае, если слишком часто использовать `?.`, ошибки могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. ``` @@ -123,7 +123,7 @@ user?.address; Переменная должна быть объявлена (к примеру, как `let/const/var user` или как параметр функции). Опциональная цепочка работает только с объявленными переменными. ```` -## Вычисления по короткой схеме +## Сокращённое вычисление Как было сказано ранее, `?.` немедленно останавливает вычисление, если левая часть не существует. @@ -198,8 +198,8 @@ delete user?.name; // удаляет user.name если пользователь ```js run let user = null; -user?.name = "John"; // Error, не работает -// потому что он вычисляется как undefined = "John" +user?.name = "John"; // Ошибка, не работает +// потому что вычисляется как undefined = "John" ``` Она недостаточно "умна" для этого. From 739ec8ad562a657e2f19178c423f07456a3b21e4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 25 Mar 2022 18:09:15 +0600 Subject: [PATCH 0146/1128] Update article.md --- 1-js/04-object-basics/06-constructor-new/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index c40e8636c3..4f6219d84f 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -123,7 +123,7 @@ function User(name) { this.name = name; } -let john = User("John"); // переадресовывает вызовы на new User +let john = User("John"); // переадресовывает вызов на new User alert(john.name); // John ``` From 073df457165681aaefc77f773b8c2ae10484e2f9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 26 Mar 2022 03:04:41 +0600 Subject: [PATCH 0147/1128] Update article.md --- .../04-object-basics/06-constructor-new/article.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index 4f6219d84f..83d1681818 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -129,16 +129,16 @@ alert(john.name); // John Такой подход иногда используется в библиотеках, чтобы сделать синтаксис более гибким. Так чтобы люди могли вызывать функцию с "new" или без него, и она все ещё могла работать. -Впрочем вероятно, это не очень хорошая практика использовать этот трюк везде, так как опуск `new` делает немного менее очевидным то, что происходит. С помощью `new` мы все знаем, что создаётся новый объект. +Впрочем вероятно, это не очень хорошая практика использовать этот трюк везде, так как опуск `new` делает немного менее очевидным то, что происходит. С `new` мы все понимаем, что создаётся новый объект. -## Возврат значения из конструктора return +## Возврат значения из конструктора, return Обычно конструкторы не имеют `return`. Их задача - записать все необходимое в `this`, и это автоматически становится результатом. Но если `return` всё же есть, то применяется простое правило: -- При вызове `return` с объектом, вместо `this` возвращается объект. -- При вызове `return` с примитивным значением, оно игнорируется. +- При вызове `return` с объектом, вместо `this` вернётся объект. +- При вызове `return` с примитивным значением, оно проигнорируется. Другими словами, `return` с объектом возвращает этот объект, во всех остальных случаях возвращается `this`. @@ -179,12 +179,12 @@ let user = new User; // <-- без скобок let user = new User(); ``` -Пропуск здесь не считается "хорошим стилем", но такой синтаксис разрешён спецификацией. +Пропуск скобок здесь не считается "хорошим стилем", но просто чтобы вы знали, такой синтаксис разрешён спецификацией. ```` ## Создание методов в конструкторе -Использование функций конструктора для создания объектов обеспечивает большую гибкость. Функции-конструкторы могут иметь параметры, определяющие, как создавать объект и что в него помещать. +Использование конструкторов для создания объектов даёт большую гибкость. Функции-конструкторы могут иметь параметры, определяющие, как создавать объект и что в него помещать. Конечно, мы можем добавить к `this` не только свойства, но и методы. @@ -213,7 +213,7 @@ john = { */ ``` -Для создания сложных объектов существует более продвинутый синтаксис, [классы](info:classes), который мы рассмотрим позже. +Для создания сложных объектов существует более продвинутый синтаксис - [классы](info:classes), который мы рассмотрим позже. ## Итого From 6da7642230d3a725138b1d3ea25bd8324106a367 Mon Sep 17 00:00:00 2001 From: Igor Storozhuk Date: Sat, 26 Mar 2022 10:31:43 +0300 Subject: [PATCH 0148/1128] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=B4=D0=BE=20=D0=BA=D0=BE=D0=BD=D1=86=D0=B0=20"Hello"=20"?= =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D1=82"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Перевод был выполнен не до конца, значение одного и того же аргумента указывалось и как "Hello", и как "Привет" Исправил на "Привет" --- 1-js/02-first-steps/15-function-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index 1e819bf597..f17fea9e39 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -184,7 +184,7 @@ alert( from ); // Аня Мы объявляем функции со списком параметров, затем вызываем их, передавая аргументы. -В приведённом выше примере можно было бы сказать: "функция `showMessage` объявляется с двумя параметрами, затем вызывается с двумя аргументами: `from` и `"Hello"`". +В приведённом выше примере можно было бы сказать: "функция `showMessage` объявляется с двумя параметрами, затем вызывается с двумя аргументами: `from` и `"Привет"`". ## Параметры по умолчанию From 9ded4d4f40d9a41acb981f13c9db953415424be1 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 26 Mar 2022 16:38:08 +0600 Subject: [PATCH 0149/1128] update tasks --- .../4-object-property-this/solution.md | 33 ++++++++++++------- .../4-object-property-this/task.md | 4 +-- .../7-calculator/_js.view/test.js | 13 +++++--- .../8-chain-calls/_js.view/solution.js | 1 + .../8-chain-calls/_js.view/test.js | 12 +++++-- .../8-chain-calls/solution.md | 12 +++---- .../04-object-methods/8-chain-calls/task.md | 12 ++++--- 7 files changed, 57 insertions(+), 30 deletions(-) diff --git a/1-js/04-object-basics/04-object-methods/4-object-property-this/solution.md b/1-js/04-object-basics/04-object-methods/4-object-property-this/solution.md index fcdae3f3e5..b6ad563552 100644 --- a/1-js/04-object-basics/04-object-methods/4-object-property-this/solution.md +++ b/1-js/04-object-basics/04-object-methods/4-object-property-this/solution.md @@ -4,41 +4,52 @@ ```js run function makeUser() { return { - name: "Джон", + name: "John", ref: this }; -}; +} let user = makeUser(); alert( user.ref.name ); // Error: Cannot read property 'name' of undefined ``` -Это потому, что правила, которые определяют значение `this`, никак не смотрят на объявление объекта. Важен лишь момент вызова метода. +Это потому, что правила, которые определяют значение `this`, никак не смотрят на объявление объекта. Важен лишь момент вызова. -Здесь значение `this` внутри `makeUser()` является `undefined`, потому что `makeUser()` вызвана как функция, не через "точку" как метод. +Здесь значение `this` внутри `makeUser()` равно `undefined`, потому что оно вызывается как функция, а не через "точечный" синтаксис как метод. -Литерал объекта сам по себе не влияет на `this`. Значение `this` одно для всей функции и блоков кода в ней, литеральные объекты не меняют его. +Значение `this` одно для всей функции, блоки кода и объектные литералы на него не влияют. -Таким образом, при создании объекта `ref: this` берёт текущее значение `this` функции `makeUser()`. +Таким образом, `ref: this` фактически принимает текущее `this` функции. -А вот противоположный случай: +Мы можем переписать функцию и вернуть то же самое `this` со значением `undefined`: + +```js run +function makeUser(){ + return this; // this time there's no object literal +} + +alert( makeUser().name ); // Error: Cannot read property 'name' of undefined +``` +Как вы можете видеть, результат `alert( makeUser().name )` совпадает с результатом `alert( user.ref.name )` из предыдущего примера. + +Вот противоположный случай: ```js run function makeUser() { return { - name: "Джон", + name: "John", *!* ref() { return this; } */!* }; -}; +} let user = makeUser(); -alert( user.ref().name ); // Джон +alert( user.ref().name ); // John ``` -Теперь это работает, поскольку `user.ref()` вызывается как метод. И значением `this` становится объект перед точкой `.`. +Теперь это работает, потому что `user.ref()` - это метод. И значением `this` становится объект перед точкой `.`. diff --git a/1-js/04-object-basics/04-object-methods/4-object-property-this/task.md b/1-js/04-object-basics/04-object-methods/4-object-property-this/task.md index 9f0e04d0a2..f40a201fd8 100644 --- a/1-js/04-object-basics/04-object-methods/4-object-property-this/task.md +++ b/1-js/04-object-basics/04-object-methods/4-object-property-this/task.md @@ -11,10 +11,10 @@ importance: 5 ```js function makeUser() { return { - name: "Джон", + name: "John", ref: this }; -}; +} let user = makeUser(); diff --git a/1-js/04-object-basics/04-object-methods/7-calculator/_js.view/test.js b/1-js/04-object-basics/04-object-methods/7-calculator/_js.view/test.js index bc8139ff5e..8c92e13473 100644 --- a/1-js/04-object-basics/04-object-methods/7-calculator/_js.view/test.js +++ b/1-js/04-object-basics/04-object-methods/7-calculator/_js.view/test.js @@ -1,8 +1,8 @@ -describe("калькулятор", function() { +describe("calculator", function() { - context("Когда 2 и 3 введены", function() { + context("когда 2 и 3 введены", function() { beforeEach(function() { sinon.stub(window, "prompt"); @@ -15,12 +15,17 @@ describe("калькулятор", function() { afterEach(function() { prompt.restore(); }); + + it('read получает два значения и сохраняет их как свойства объекта', function () { + assert.equal(calculator.a, 2); + assert.equal(calculator.b, 3); + }); - it("Сумма равна 5", function() { + it("сумма равна 5", function() { assert.equal(calculator.sum(), 5); }); - it("Произведение равно 6", function() { + it("произведение равно 6", function() { assert.equal(calculator.mul(), 6); }); }); diff --git a/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/solution.js b/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/solution.js index e98fe6410c..a35c009cce 100644 --- a/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/solution.js +++ b/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/solution.js @@ -11,5 +11,6 @@ let ladder = { }, showStep: function() { alert(this.step); + return this; } }; \ No newline at end of file diff --git a/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/test.js b/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/test.js index 14a8c13de4..a8b5a9c98a 100644 --- a/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/test.js +++ b/1-js/04-object-basics/04-object-methods/8-chain-calls/_js.view/test.js @@ -21,17 +21,25 @@ describe('Лестница', function() { assert(alert.called); }); - it('up() должен увеличивать ступеньки', function() { + it('up() должен увеличивать ступеньку', function() { assert.equal(ladder.up().up().step, 2); }); - it('down() должен уменьшать ступеньки', function() { + it('down() должен уменьшать ступеньку', function() { assert.equal(ladder.down().step, -1); }); it('down().up().up().up() ', function() { assert.equal(ladder.down().up().up().up().step, 2); }); + + it('showStep() should return this', function() { + assert.equal(ladder.showStep(), ladder); + }); + + it('up().up().down().showStep().down().showStep()', function () { + assert.equal(ladder.up().up().down().showStep().down().showStep().step, 0) + }); after(function() { ladder.step = 0; diff --git a/1-js/04-object-basics/04-object-methods/8-chain-calls/solution.md b/1-js/04-object-basics/04-object-methods/8-chain-calls/solution.md index c8b4b87a3c..a86d51627d 100644 --- a/1-js/04-object-basics/04-object-methods/8-chain-calls/solution.md +++ b/1-js/04-object-basics/04-object-methods/8-chain-calls/solution.md @@ -1,4 +1,4 @@ -Решением является возврат самого объекта в каждом методе. +Решение состоит в том, чтобы возвращать сам объект из каждого вызова. ```js run demo let ladder = { @@ -21,19 +21,19 @@ let ladder = { return this; */!* } -} +}; -ladder.up().up().down().up().down().showStep(); // 1 +ladder.up().up().down().showStep().down().showStep(); // показывает 1 затем 0 ``` -Мы также можем писать один вызов на одной строке. Для длинной цепи вызовов это более читабельно: +Мы также можем записать один вызов на строку. Для длинных цепочек это более читабельно: ```js ladder .up() .up() .down() - .up() + .showStep() // 1 .down() - .showStep(); // 1 + .showStep(); // 0 ``` diff --git a/1-js/04-object-basics/04-object-methods/8-chain-calls/task.md b/1-js/04-object-basics/04-object-methods/8-chain-calls/task.md index 2e492c253a..f65e44dcfd 100644 --- a/1-js/04-object-basics/04-object-methods/8-chain-calls/task.md +++ b/1-js/04-object-basics/04-object-methods/8-chain-calls/task.md @@ -2,9 +2,9 @@ importance: 2 --- -# Цепь вызовов +# Цепочка вызовов -Это `ladder` (лестница) - объект, который позволяет подниматься вверх и спускаться: +Есть объект `ladder` (лестница), который позволяет подниматься и спускаться: ```js let ladder = { @@ -21,19 +21,21 @@ let ladder = { }; ``` -Теперь, если нам нужно сделать несколько последовательных вызовов, мы можем выполнить это так: +Теперь, если нам нужно сделать несколько последовательных вызовов, мы можем сделать это так: ```js ladder.up(); ladder.up(); ladder.down(); ladder.showStep(); // 1 +ladder.down(); +ladder.showStep(); // 0 ``` -Измените код методов `up`, `down` и `showStep` таким образом, чтобы их вызов можно было сделать по цепочке, например так: +Измените код `up`, `down` и `showStep`, чтобы сделать их вызовы цепными, вот так: ```js -ladder.up().up().down().showStep(); // 1 +ladder.up().up().down().showStep().down().showStep(); // показывает 1 затем 0 ``` Такой подход широко используется в библиотеках JavaScript. From c933566a91891e508fd9f920bd81b4027d959c91 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 26 Mar 2022 17:13:50 +0600 Subject: [PATCH 0150/1128] update tasks --- .../1-two-functions-one-object/solution.md | 6 +++--- .../1-two-functions-one-object/task.md | 5 ++--- .../2-calculator-constructor/_js.view/test.js | 5 +++++ .../2-calculator-constructor/task.md | 9 ++++----- .../3-accumulator/_js.view/solution.js | 2 +- .../06-constructor-new/3-accumulator/task.md | 12 ++++++------ 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md b/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md index ed865531cd..058b1668e6 100644 --- a/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md +++ b/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md @@ -1,8 +1,8 @@ -Да, возможно. +Да, это возможно. -Если функция возвращает объект, то вместо `this` будет возвращён этот объект. +Если функция возвращает объект, то `new` вернёт его вместо `this`. -Например, они могут вернуть один и тот же объект `obj`, определённый снаружи: +Таким образом, они могут, к примеру, возвращать один и тот же внешне определённый объект `obj`: ```js run no-beautify let obj = {}; diff --git a/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/task.md b/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/task.md index 5ecac1f57b..f80e71645e 100644 --- a/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/task.md +++ b/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/task.md @@ -4,8 +4,7 @@ importance: 2 # Две функции - один объект -Возможно ли создать функции `A` и `B` в примере ниже, где объекты равны `new A()==new B()`? - +Возможно ли создать функции `A` и `B`, так чтобы `new A() == new B()`? ```js no-beautify function A() { ... } @@ -17,4 +16,4 @@ let b = new B; alert( a == b ); // true ``` -Если да - приведите пример вашего кода. +Если это так, то приведите пример вашего кода. diff --git a/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/_js.view/test.js b/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/_js.view/test.js index 036053927c..bba80e5c2e 100644 --- a/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/_js.view/test.js +++ b/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/_js.view/test.js @@ -10,6 +10,11 @@ describe("calculator", function() { calculator = new Calculator(); calculator.read(); }); + + it("the read method asks for two values using prompt and remembers them in object properties", function() { + assert.equal(calculator.a, 2); + assert.equal(calculator.b, 3); + }); it("when 2 and 3 are entered, the sum is 5", function() { assert.equal(calculator.sum(), 5); diff --git a/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/task.md b/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/task.md index b0bc1dfa63..cdc406e6f4 100644 --- a/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/task.md +++ b/1-js/04-object-basics/06-constructor-new/2-calculator-constructor/task.md @@ -2,14 +2,13 @@ importance: 5 --- -# Создание калькулятора при помощи конструктора +# Создайте калькулятор при помощи конструктора, new Calculator -Создайте функцию-конструктор `Calculator`, который создаёт объекты с тремя методами: +Создайте функцию-конструктор `Calculator`, которая создаёт объекты с тремя методами: - `read()` запрашивает два значения при помощи `prompt` и сохраняет их значение в свойствах объекта. -- `sum()` возвращает сумму введённых свойств. -- `mul()` возвращает произведение введённых свойств. - +- `sum()` возвращает сумму этих свойств. +- `mul()` возвращает произведение этих свойств. Например: diff --git a/1-js/04-object-basics/06-constructor-new/3-accumulator/_js.view/solution.js b/1-js/04-object-basics/06-constructor-new/3-accumulator/_js.view/solution.js index 585287c542..3c9983aeb1 100644 --- a/1-js/04-object-basics/06-constructor-new/3-accumulator/_js.view/solution.js +++ b/1-js/04-object-basics/06-constructor-new/3-accumulator/_js.view/solution.js @@ -2,7 +2,7 @@ function Accumulator(startingValue) { this.value = startingValue; this.read = function() { - this.value += +prompt('How much to add?', 0); + this.value += +prompt('Сколько нужно добавить?', 0); }; } diff --git a/1-js/04-object-basics/06-constructor-new/3-accumulator/task.md b/1-js/04-object-basics/06-constructor-new/3-accumulator/task.md index d821d9d3ad..d9831dd220 100644 --- a/1-js/04-object-basics/06-constructor-new/3-accumulator/task.md +++ b/1-js/04-object-basics/06-constructor-new/3-accumulator/task.md @@ -2,24 +2,24 @@ importance: 5 --- -# Создаём Accumulator +# Создайте new Accumulator -Напишите функцию-конструктор `Accumulator(startingValue)`. +Создайте функцию-конструктор `Accumulator(startingValue)`. Объект, который она создаёт, должен уметь следующее: - Хранить "текущее значение" в свойстве `value`. Начальное значение устанавливается в аргументе конструктора `startingValue`. -- Метод `read()` использует `prompt` для получения числа и прибавляет его к свойству `value`. +- Метод `read()` должен использовать `prompt` для считывания нового числа и прибавления его к `value`. -Таким образом, свойство `value` является текущей суммой всего, что ввёл пользователь при вызовах метода `read()`, с учётом начального значения `startingValue`. +Другими словами, свойство `value` представляет собой сумму всех введённых пользователем значений, с учётом начального значения `startingValue`. Ниже вы можете посмотреть работу кода: ```js let accumulator = new Accumulator(1); // начальное значение 1 -accumulator.read(); // прибавит ввод prompt к текущему значению -accumulator.read(); // прибавит ввод prompt к текущему значению +accumulator.read(); // прибавляет введённое пользователем значение +accumulator.read(); // прибавляет введённое пользователем значение alert(accumulator.value); // выведет сумму этих значений ``` From 9ab329a2e62ac2a9da2dbda5ac180f2679ea9117 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 26 Mar 2022 17:15:43 +0600 Subject: [PATCH 0151/1128] typo --- 1-js/04-object-basics/06-constructor-new/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index 83d1681818..0b1af0ba22 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -127,7 +127,7 @@ let john = User("John"); // переадресовывает вызов на new alert(john.name); // John ``` -Такой подход иногда используется в библиотеках, чтобы сделать синтаксис более гибким. Так чтобы люди могли вызывать функцию с "new" или без него, и она все ещё могла работать. +Такой подход иногда используется в библиотеках, чтобы сделать синтаксис более гибким. Так чтобы люди могли вызывать функцию с `new` или без него, и она все ещё могла работать. Впрочем вероятно, это не очень хорошая практика использовать этот трюк везде, так как опуск `new` делает немного менее очевидным то, что происходит. С `new` мы все понимаем, что создаётся новый объект. From c32feab963af739e895e4442fc0fa6bf11281e48 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 26 Mar 2022 21:17:29 +0600 Subject: [PATCH 0152/1128] typo --- 1-js/02-first-steps/12-nullish-coalescing-operator/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md index 7f29fb0da0..1b63671fa7 100644 --- a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md +++ b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md @@ -142,7 +142,7 @@ let area = height ?? (100 * width) ?? 50; let x = 1 && 2 ?? 3; // Синтаксическая ошибка ``` -Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать ошибок программирования, когда люди начнут переключаться с `||` на `??`. +Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переключаться с `||` на `??`. Используйте круглые скобки, чтобы обойти это ограничение: From 60b88ef79a01291551cf763b74cb353e7ff0c57d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 27 Mar 2022 02:42:29 +0600 Subject: [PATCH 0153/1128] typo --- 1-js/04-object-basics/07-optional-chaining/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 4a1ae6c517..95b6981f67 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -66,7 +66,7 @@ let user = {}; // пользователь без адреса alert( user.address && user.address.street && user.address.street.name ); // undefined (без ошибки) ``` -Проход при помощи логического оператора И '`&&` через весь путь к свойству гарантирует, что все компоненты существуют (если нет, вычисление прекращается), но также не является идеальным. +Проход при помощи логического оператора И `&&` через весь путь к свойству гарантирует, что все компоненты существуют (если нет, вычисление прекращается), но также не является идеальным. Как вы можете видеть, имена свойств по-прежнему дублируются в коде. Например, в приведённом выше коде `user.address` появляется три раза. From dc8a516c86276a4df5641903628d2e3b01bdcc12 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 27 Mar 2022 03:01:12 +0600 Subject: [PATCH 0154/1128] fix --- 1-js/04-object-basics/07-optional-chaining/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 95b6981f67..7a4d671f63 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -168,7 +168,7 @@ userGuest.admin?.(); // ничего (такого метода нет) Здесь в обеих строках мы сначала используем точку (`userAdmin.admin`), чтобы получить свойство `admin`, потому что мы предполагаем, что объект user существует, так что читать из него безопасно. -Затем `?.()` проверяет левую часть: если функция `admin` существует, то она запускается (это так для `UserAdmin`). В противном случае (для `userGuest`) вычисление остановится без ошибок. +Затем `?.()` проверяет левую часть: если функция `admin` существует, то она запускается (это так для `userAdmin`). В противном случае (для `userGuest`) вычисление остановится без ошибок. Синтаксис `?.[]` также работает, если мы хотим использовать скобки `[]` для доступа к свойствам вместо точки `.`. Как и в предыдущих случаях, он позволяет безопасно считывать свойство из объекта, который может не существовать. From 0974dfff49f98447a80aa2cc6ba22e63f5ec4f39 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 28 Mar 2022 22:41:25 +0600 Subject: [PATCH 0155/1128] =?UTF-8?q?just=20placed=20"=D1=91"=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/02-number/article.md | 2 +- 2-ui/1-document/08-styles-and-classes/article.md | 2 +- 2-ui/3-event-details/4-mouse-drag-and-drop/1-slider/task.md | 2 +- 5-network/11-websocket/article.md | 2 +- 99-archive/124-books/article.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/02-number/article.md b/1-js/05-data-types/02-number/article.md index 3245a5b6b4..225792de5e 100644 --- a/1-js/05-data-types/02-number/article.md +++ b/1-js/05-data-types/02-number/article.md @@ -244,7 +244,7 @@ let sum = 0.1 + 0.2; alert( +sum.toFixed(2) ); // 0.3 ``` -Также можно временно умножить число на 100 (или на большее), чтобы привести его к целому, выполнить математические действия, а после разделить обратно. Суммируя целые числа, мы уменьшаем погрешность, но она все равно появляется при финальном делении: +Также можно временно умножить число на 100 (или на большее), чтобы привести его к целому, выполнить математические действия, а после разделить обратно. Суммируя целые числа, мы уменьшаем погрешность, но она всё равно появляется при финальном делении: ```js run alert( (0.1 * 10 + 0.2 * 10) / 10 ); // 0.3 diff --git a/2-ui/1-document/08-styles-and-classes/article.md b/2-ui/1-document/08-styles-and-classes/article.md index c749321f1d..9062d46f80 100644 --- a/2-ui/1-document/08-styles-and-classes/article.md +++ b/2-ui/1-document/08-styles-and-classes/article.md @@ -1,6 +1,6 @@ # Стили и классы -До того, как начнёте изучать способы работы со стилями и классами в JavaScript, есть одно важное правило. Надеемся, это достаточно очевидно, но мы все равно должны об этом упомянуть. +До того, как начнёте изучать способы работы со стилями и классами в JavaScript, есть одно важное правило. Надеемся, это достаточно очевидно, но мы всё равно должны об этом упомянуть. Как правило, существует два способа задания стилей для элемента: diff --git a/2-ui/3-event-details/4-mouse-drag-and-drop/1-slider/task.md b/2-ui/3-event-details/4-mouse-drag-and-drop/1-slider/task.md index 61c9320ef8..dc3954d7a4 100644 --- a/2-ui/3-event-details/4-mouse-drag-and-drop/1-slider/task.md +++ b/2-ui/3-event-details/4-mouse-drag-and-drop/1-slider/task.md @@ -13,4 +13,4 @@ importance: 5 Важные детали: - Слайдер должен нормально работать при резком движении мыши влево или вправо за пределы полосы. При этом бегунок должен останавливаться чётко в нужном конце полосы. -- При нажатом бегунке мышь может выходить за пределы полосы слайдера, но слайдер пусть все равно работает (это удобно для пользователя). +- При нажатом бегунке мышь может выходить за пределы полосы слайдера, но слайдер пусть всё равно работает (это удобно для пользователя). diff --git a/5-network/11-websocket/article.md b/5-network/11-websocket/article.md index 6ec43d1f39..79be8d7437 100644 --- a/5-network/11-websocket/article.md +++ b/5-network/11-websocket/article.md @@ -88,7 +88,7 @@ Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q== Sec-WebSocket-Version: 13 ``` -- `Origin` -- источник текущей страницы (например `https://javascript.info`). Объект WebSocket по своей природе не завязан на текущий источник. Нет никаких специальных заголовков или других ограничений. Старые сервера все равно не могут работать с WebSocket, поэтому проблем с совместимостью нет. Но заголовок `Origin` важен, так как он позволяет серверу решать, использовать ли WebSocket с этим сайтом. +- `Origin` -- источник текущей страницы (например `https://javascript.info`). Объект WebSocket по своей природе не завязан на текущий источник. Нет никаких специальных заголовков или других ограничений. Старые сервера всё равно не могут работать с WebSocket, поэтому проблем с совместимостью нет. Но заголовок `Origin` важен, так как он позволяет серверу решать, использовать ли WebSocket с этим сайтом. - `Connection: Upgrade` -- сигнализирует, что клиент хотел бы изменить протокол. - `Upgrade: websocket` -- запрошен протокол "websocket". - `Sec-WebSocket-Key` -- случайный ключ, созданный браузером для обеспечения безопасности. diff --git a/99-archive/124-books/article.md b/99-archive/124-books/article.md index d2d2d486a3..21fd14a40f 100755 --- a/99-archive/124-books/article.md +++ b/99-archive/124-books/article.md @@ -5,7 +5,7 @@ archive: # Книги по JS, HTML/CSS и не только -Мне часто задают вопрос: "Какую литературу порекомендуете?". На этой странице я предлагаю рекомендации по различным темам. Всего несколько книг на каждую тему, из большего количества все равно пришлось бы выбирать. +Мне часто задают вопрос: "Какую литературу порекомендуете?". На этой странице я предлагаю рекомендации по различным темам. Всего несколько книг на каждую тему, из большего количества всё равно пришлось бы выбирать. Кстати, по всем книжкам, особенно тем, которые касаются технологий, всегда ищите последнее издание. From fed6b0f8c4ec31dc0cf77b6a1cbaeb3f318ec641 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 02:50:46 +0300 Subject: [PATCH 0156/1128] fix --- .../09-classes/03-static-properties-methods/article.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/1-js/09-classes/03-static-properties-methods/article.md b/1-js/09-classes/03-static-properties-methods/article.md index 38a56a22eb..8711fa673a 100644 --- a/1-js/09-classes/03-static-properties-methods/article.md +++ b/1-js/09-classes/03-static-properties-methods/article.md @@ -29,11 +29,13 @@ User.staticMethod = function() { Значением `this` при вызове `User.staticMethod()` является сам конструктор класса `User` (правило "объект до точки"). -Обычно статические методы используются для реализации функций, принадлежащих самому классу, а не какому-либо конкретному его объекту. +Обычно статические методы используются для реализации функций, принадлежащих классу целиком, вообще, и при этом не относящимся к каким-то отдельным объектам. + +Звучит не очень понятно? Сейчас все встанет на свои места. Например, есть объекты статей `Article`, и нужна функция для их сравнения. -Естественным решением было бы добавить статический метод `Article.compare`: +Естественное решение – сделать для этого статический метод `Article.compare`: ```js run class Article { @@ -63,9 +65,9 @@ articles.sort(Article.compare); alert( articles[0].title ); // CSS ``` -Здесь метод `Article.compare` стоит "над" статьями, как средство для их сравнения. Это не метод статьи, а скорее метод всего класса. +Здесь метод `Article.compare` стоит "над" статьями, как средство для их сравнения. Это метод не отдельной статьи, а всего класса. -Другим примером может быть так называемый "фабричный" метод. +Другим примером может быть так называемый "фабричный" метод. Скажем, нам нужно несколько способов создания статьи: From 56313bffffdec086ee2c29f577f5d9e1f548aea4 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 03:08:39 +0300 Subject: [PATCH 0157/1128] minor fixes --- .../17-arrow-functions-basics/article.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index f7a8ee438d..385d8d294a 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -47,7 +47,7 @@ alert( sum(1, 2) ); // 3 alert( double(3) ); // 6 ``` -- Если аргументов нет, круглые скобки будут пустыми (но они должны присутствовать): +- Если аргументов нет, круглые скобки будут пустыми, но они должны присутствовать: ```js run let sayHi = () => alert("Hello!"); @@ -66,18 +66,18 @@ let welcome = (age < 18) ? () => alert('Привет') : () => alert("Здравствуйте!"); -welcome(); +welcome(); ``` Поначалу стрелочные функции могут показаться необычными и даже трудночитаемыми, но это быстро пройдёт по мере того, как глаза привыкнут к этим конструкциям. -Они очень удобны для простых однострочных действий, когда нам просто лень писать много слов. +Они очень удобны для простых однострочных действий, когда лень писать много слов. ## Многострочные стрелочные функции -В приведённых выше примерах аргументы брались слева от `=>`, а затем справа вычислялось выражение с их значениями. +Стрелочные функции, которые мы видели до этого, были очень простыми. Они брали аргументы слева от `=>` и вычисляли и возвращали выражение справа. -Иногда нам нужно что-то немного более сложное, например, несколько выражений или инструкций. Это также возможно, нужно лишь заключить их в фигурные скобки. Затем используйте обычный `return` внутри них. +Иногда нам нужна более сложная функция, с несколькими выражениями и инструкциями. Это также возможно, нужно лишь заключить их в фигурные скобки. При этом важное отличие - в том, что в таких скобках для возврата значения нужно использовать `return` (как в обычных функциях). Вроде этого: @@ -104,7 +104,9 @@ alert( sum(1, 2) ); // 3 ## Итого -Стрелочные функции очень удобны для однострочных действий. Они бывают двух типов: +Стрелочные функции очень удобны для простых действий, особенно для однострочныз. -1. Без фигурных скобок: `(...args) => expression` -- правая сторона выражение: функция вычисляет его и возвращает результат. -2. С фигурными скобками: `(...args) => { body }` -- скобки позволяют нам писать многострочные инструкции внутри функции, но при этом необходимо явно указывать директиву `return`, чтобы вернуть какое-либо значение. +Они бывают двух типов: + +1. Без фигурных скобок: `(...args) => expression` -- правая сторона выражение: функция вычисляет его и возвращает результат. Скобки можно не ставить, если аргумент только один: `n => n * 2`. +2. С фигурными скобками: `(...args) => { body }` -- скобки позволяют нам писать несколько инструкций внутри функции, но при этом необходимо явно вызывать `return`, чтобы вернуть значение. From 4f2ad9460c4d167d9db4d878981a398864b0f01f Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 03:36:06 +0300 Subject: [PATCH 0158/1128] minor fixes --- .../07-optional-chaining/article.md | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 7a4d671f63..6ad5be1f9c 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -32,7 +32,7 @@ alert(user.address.street); // Ошибка! let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен null ``` -Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата. +Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к свойству `.innerHTML` у `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата. Как мы можем это сделать? @@ -44,9 +44,19 @@ let user = {}; alert(user.address ? user.address.street : undefined); ``` -Это работает, тут нет ошибки... Но это довольно неэлегантно. Как вы можете видеть, `"user.address"` появляется в коде дважды. Для более глубоко вложенных свойств это становится проблемой, поскольку потребуется больше повторений. +Это работает, тут нет ошибки... Но это довольно неэлегантно. Как вы можете видеть, `"user.address"` появляется в коде дважды. -К примеру, давайте попробуем получить `user.address.street.name`. +Вот как то же самое выглядело бы для `document.querySelector`: + +```js run +let html = document.querySelector('.elem') ? document.querySelector('.elem').innerHTML : null; +``` + +Как видно, поиск элемента `document.querySelector('.elem')` здесь вызывается дважды, что не очень хорошо. + +Для более глубоко вложенных свойств это ещё менее красиво, поскольку потребуется больше повторений. + +К примеру, давайте аналогично вычислим `user.address.street.name`. Нам нужно проверить как `user.address`, так и `user.address.street`: @@ -58,7 +68,7 @@ alert(user.address ? user.address.street ? user.address.street.name : null : nul Это просто ужасно, у кого-то могут даже возникнуть проблемы с пониманием такого кода. -На самом деле это не большая проблема, так как есть лучший способ написать это, используя оператор `&&`: +Есть немного лучший способ написать это, используя оператор `&&`: ```js run let user = {}; // пользователь без адреса @@ -70,7 +80,7 @@ alert( user.address && user.address.street && user.address.street.name ); // und Как вы можете видеть, имена свойств по-прежнему дублируются в коде. Например, в приведённом выше коде `user.address` появляется три раза. -Вот почему в язык была добавлена опциональная цепочка `?.`. Чтобы решить эту проблему раз и навсегда! +Вот почему в язык была добавлена опциональная цепочка `?.`. Чтобы решить эту проблему - раз и навсегда! ## Опциональная цепочка @@ -92,6 +102,12 @@ alert( user?.address?.street ); // undefined (без ошибки) Код лаконичный и понятный, в нем вообще нет дублирования. +А вот пример с `document.querySelector`: + +```js run +let html = document.querySelector('.elem')?.innerHTML; // будет null, если элемента нет +``` + Считывание адреса с помощью `user?.address` работает, даже если объект `user` не существует: ```js run @@ -103,12 +119,12 @@ alert( user?.address.street ); // undefined Обратите внимание: синтаксис `?.` делает необязательным значение перед ним, но не какое-либо последующее. -Так например, в `user?.address.street.name` `?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`. +Так например, в записи `user?.address.street.name` `?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это так только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`. ```warn header="Не злоупотребляйте опциональной цепочкой" Нам следует использовать `?.` только там, где нормально, что чего-то не существует. -К примеру, если, в соответствии с нашей логикой кода, объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`. +К примеру, если, в соответствии с логикой нашего кода, объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`. В этом случае, если вдруг `user` окажется `undefined`, мы увидим программную ошибку по этому поводу и исправим её. В противном случае, если слишком часто использовать `?.`, ошибки могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать. ``` @@ -151,22 +167,22 @@ alert(x); // 0, значение не увеличилось ```js run let userAdmin = { admin() { - alert("I am admin"); + alert("Я админ"); } }; let userGuest = {}; *!* -userAdmin.admin?.(); // I am admin +userAdmin.admin?.(); // Я админ */!* *!* -userGuest.admin?.(); // ничего (такого метода нет) +userGuest.admin?.(); // ничего не произойдет (такого метода нет) */!* ``` -Здесь в обеих строках мы сначала используем точку (`userAdmin.admin`), чтобы получить свойство `admin`, потому что мы предполагаем, что объект user существует, так что читать из него безопасно. +Здесь в обеих строках мы сначала используем точку (`userAdmin.admin`), чтобы получить свойство `admin`, потому что мы предполагаем, что объект `user` существует, так что читать из него безопасно. Затем `?.()` проверяет левую часть: если функция `admin` существует, то она запускается (это так для `userAdmin`). В противном случае (для `userGuest`) вычисление остановится без ошибок. @@ -179,7 +195,7 @@ let user1 = { firstName: "John" }; -let user2 = null; +let user2 = null; alert( user1?.[key] ); // John alert( user2?.[key] ); // undefined @@ -199,10 +215,9 @@ delete user?.name; // удаляет user.name если пользователь let user = null; user?.name = "John"; // Ошибка, не работает -// потому что вычисляется как undefined = "John" +// то же самое что написать undefined = "John" ``` -Она недостаточно "умна" для этого. ```` ## Итого @@ -217,4 +232,4 @@ user?.name = "John"; // Ошибка, не работает Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам. -Тем не менее, мы должны использовать `?.` осторожно, только там, где допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут. +Тем не менее, мы должны использовать `?.` осторожно, только там, где по логике кода допустимо, что левая часть не существует. Чтобы он не скрывал от нас ошибки программирования, если они возникнут. From 71e0221bc019922e3f2ccedd64746ca75a4c7864 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 05:27:18 +0300 Subject: [PATCH 0159/1128] minor fixes --- .../01-debugging-chrome/article.md | 73 +++++++++---------- 1 file changed, 36 insertions(+), 37 deletions(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index cd9fcca691..d0cd727177 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -1,4 +1,4 @@ -# Отладка в браузере Chrome +# Отладка в браузере Давайте отвлечёмся от написания кода и поговорим о его отладке. @@ -18,19 +18,19 @@ ![](chrome-open-sources.svg) -Кнопка-переключатель откроет вкладку со списком файлов. +Кнопка-переключатель откроет вкладку со списком файлов. -Кликните на неё и выберите `hello.js`. Вот что появится: +Кликните на неё и выберите `hello.js` в дереве файлов. Вот что появится: ![](chrome-tabs.svg) Интерфейс состоит из трёх зон: -1. В зоне **File Navigator** pane (панель для навигации файлов) показаны файлы HTML, JavaScript, CSS, включая изображения, используемые на странице. Здесь также могут быть файлы различных расширений Chrome. -2. Зона **Code Editor** pane показывает исходный код. -3. Наконец, зона **JavaScript Debugging** pane (панель отладки JavaScript) отведена для отладки, скоро мы к ней вернёмся. +1. В зоне **File Navigator** (панель для навигации файлов) показаны файлы HTML, JavaScript, CSS, включая изображения, используемые на странице. Здесь также могут быть файлы различных расширений Chrome. +2. Зона **Code Editor** (редактор кода) показывает исходный код. +3. Наконец, зона **JavaScript Debugging** (панель отладки JavaScript) отведена для отладки, скоро мы к ней вернёмся. -Чтобы скрыть список ресурсов и освободить экранное место для исходного кода, щёлкните по тому же переключателю . +Чтобы скрыть список ресурсов и освободить экранное место для исходного кода, щёлкните по тому же переключателю . ## Консоль @@ -38,13 +38,13 @@ Результат выполнения инструкций сразу же отображается в консоли. -Например, результатом `1+2` будет `3`, а инструкция `hello("debugger")` ничего не возвращает, так что получаем `undefined`: +Например, результатом `1+2` будет `3`, а вызов функции `hello("debugger")` ничего не возвращает, так что результатом будет `undefined`: ![](chrome-sources-console.svg) ## Точки останова (breakpoints) -Давайте разберёмся, как работает код нашей [тестовой страницы](debugging/index.html). В файле `hello.js` щёлкните по строчке номер `4`. Да, щёлкайте именно по самой цифре, не по коду. +Давайте разберёмся, как работает код нашей [тестовой страницы](debugging/index.html). В файле `hello.js` щёлкните на номере строки `4`. Да-да, щёлкайте именно по самой цифре, не по коду. Ура! Вы поставили точку останова. А теперь щёлкните по цифре `8` на восьмой линии. @@ -63,12 +63,12 @@ - ...и так далее. ```smart header="Условные точки останова" -*Щелчок правой кнопкой мыши* по номеру строки позволяет создать *условную* точку останова. Она сработает только в тот момент, когда вы задали выражение, и если оно истинно, то выполнение кода будет приостановлено. +*Щелчок правой кнопкой мыши* по номеру строки позволяет создать *условную* точку останова. Она сработает только в тот момент, когда выражение, которое вы должны указать при создании такой точки, истинно. -Это удобно, когда нам нужно остановиться только для определённого значения переменной или для определённых параметров функции. +Это удобно, когда нам нужно остановиться только для при определённом значении переменной или для определённых параметров функции. ``` -## Команда Debugger +## Команда debugger Выполнение кода можно также приостановить с помощью команды `debugger` прямо изнутри самого кода: @@ -84,14 +84,13 @@ function hello(name) { } ``` -Это очень удобно, когда мы находимся в редакторе кода и не хотим переключаться на браузер и просматривать скрипт в инструментах разработчика, чтобы установить точку останова. - +Такая команда сработает только если открыты инструменты разработки, иначе браузер ее проигнорирует. ## Остановимся и оглядимся В нашем примере функция `hello()` вызывается во время загрузки страницы, поэтому для начала отладки (после того, как мы поставили точки останова) проще всего её перезагрузить. Нажмите `key:F5` (Windows, Linux) или `key:Cmd+R` (Mac). -Выполнение прервётся на четвёртой строчке: +Выполнение прервётся на четвёртой строчке (где находится точка останова): ![](chrome-sources-debugger-pause.svg) @@ -99,10 +98,10 @@ function hello(name) { 1. **`Watch`– показывает текущие значения для любых выражений.** - Вы можете нажать на `+` и ввести выражение. Отладчик покажет его значение в любой момент, автоматически пересчитав его в процессе выполнения. + Вы можете нажать на `+` и ввести выражение. Отладчик покажет его значение, автоматически пересчитывая его в процессе выполнения. 2. **`Call Stack` – показывает цепочку вложенных вызовов.** - + В текущий момент отладчик находится внутри вызова `hello()`, вызываемого скриптом в `index.html` (там нет функции, поэтому она называется “анонимной”). Если вы нажмёте на элемент стека (например, "anonymous"), отладчик перейдёт к соответствующему коду, и нам представляется возможность его проанализировать. @@ -113,7 +112,7 @@ function hello(name) { В `Global` перечисляются глобальные переменные (то есть вне каких-либо функций). - Там также есть ключевое слово `this`, которое мы ещё не изучали, но скоро сделаем это. + Там также есть ключевое слово `this`, которое мы ещё не изучали, но скоро изучим. ## Пошаговое выполнение скрипта @@ -121,47 +120,47 @@ function hello(name) { Для этого есть кнопки в верхней части правой панели. Давайте рассмотрим их. - – "Resume": продолжить выполнение, быстрая клавиша `key:F8`. -: Возобновляет выполнение кода. Если больше нет точек останова, отладчик прекращает работу и выполнение просто продолжается. + – "Resume": продолжить выполнение, быстрая клавиша `key:F8`. +: Возобновляет выполнение кода. Если больше нет точек останова, то выполнение просто продолжается, без контроля отладчиком. Вот, что мы увидим, кликнув на неё: ![](chrome-sources-debugger-trace-1.svg) Выполнение кода возобновилось, дошло до другой точки останова внутри `say()`, и отладчик снова приостановил выполнение. Обратите внимание на пункт "Call stack" справа: в списке появился ещё один вызов. Сейчас мы внутри `say()`. - + – "Step": выполнить следующую команду, быстрая клавиша `key:F9`. : Выполняет следующую инструкцию. Если мы нажмём на неё сейчас, появится `alert`. Нажатие на эту кнопку снова и снова приведёт к пошаговому выполнению всех инструкций скрипта одного за другим. - – "Step over": выполнить следующую команду, но *не заходя в функцию*, быстрая клавиша `key:F10`. -: Подобно предыдущей команде "Step", но ведёт себя по-другому, если следующая инкструкция является вызовом функции. То есть имеется ввиду: не встроенная, как `alert`, а наша собственная функция. + – "Step over": выполнить следующую команду, но *не заходя внутрь функции*, быстрая клавиша `key:F10`. +: Работает аналогично предыдущей команде "Step", но ведёт себя по-другому, если следующая инкструкция является вызовом функции (имеется ввиду: не встроенная, как `alert`, а объявленная нами функция). - Команда "Step" переходит в неё и приостанавливает выполнение в первой строке, в то время как "Step over" незаметно выполняет вызов вложенной функции, пропуская внутренности функции. + Если сравнить, то кманда "Step" переходит во вложенный вызов функцию и приостанавливает выполнение в первой строке, в то время как "Step over" выполняет вызов вложенной функции незаметно для нас, пропуская её внутренний код. - Затем выполнение приостанавливается сразу после этой функции. + Затем выполнение приостанавливается сразу после вызова функции. Это хорошо, если нам не интересно видеть, что происходит внутри вызова функции. - – "Step into", быстрая клавиша `key:F11`. + – "Step into", быстрая клавиша `key:F11`. : Это похоже на "Step", но ведёт себя по-другому в случае асинхронных вызовов функций. Если вы только начинаете изучать JavaScript, то можете не обращать внимания на разницу, так как у нас ещё нет асинхронных вызовов. На будущее просто помните, что команда "Step" игнорирует асинхронные действия, такие как `setTimeout` (вызов функции по расписанию), которые выполняются позже. "Step into" входит в их код, ожидая их, если это необходимо. См. [DevTools manual](https://developers.google.com/web/updates/2018/01/devtools#async) для получения более подробной информации. - – "Step out": продолжить выполнение до завершения текущей функции, быстрая клавиша `key:Shift+F11`. + – "Step out": продолжить выполнение до завершения текущей функции, быстрая клавиша `key:Shift+F11`. : Продолжает выполнение и останавливает его в самой последней строке текущей функции. Это удобно, когда мы случайно вошли во вложенный вызов, используя , но это нас не интересует, и мы хотим продолжить его до конца как можно скорее. - – активировать/деактивировать все точки останова(breakpoints). + – активировать/деактивировать все точки останова(breakpoints). : Эта кнопка не влияет на выполнение кода, она лишь позволяет массово включить/отключить точки останова. - – включить/отключить автоматическую паузу в случае ошибки. -: При включении и открытии инструментов разработчика ошибка скрипта автоматически приостанавливает выполнение. Затем мы можем проанализировать переменные, чтобы понять, что пошло не так. Поэтому, если наш скрипт умирает с ошибкой, мы можем открыть debugger, включить эту опцию и перезагрузить страницу, чтобы увидеть, где он умирает и каков контекст в этот момент. + – включить/отключить автоматическую паузу в случае ошибки. +: При включении, если открыты инструментов разработчика, ошибка при выполнении скрипта автоматически приостанавливает его. Затем мы можем проанализировать переменные в отладчике, чтобы понять, что пошло не так. Поэтому, если наш скрипт умирает с ошибкой, мы можем открыть отладчик, включить эту опцию и перезагрузить страницу, чтобы увидеть, где он умирает и каков контекст в этот момент. ```smart header="Continue to here" Щелчок правой кнопкой мыши по строке кода открывает контекстное меню с отличной опцией под названием "Continue to here" ("продолжить до этого места"). -Это удобно, когда мы хотим перейти на несколько шагов вперёд к строке, но нам слишком лень устанавливать точку останова(breakpoint). +Это удобно, когда мы хотим перейти на несколько шагов вперёд к строке, но лень устанавливать точку останова (breakpoint). ``` ## Логирование @@ -177,7 +176,7 @@ for (let i = 0; i < 5; i++) { } ``` -Обычный пользователь сайта не увидит такой вывод, так как он в консоли. Чтобы увидеть это, либо откройте консольную панель инструментов разработчика, либо нажмите `key:Esc`, находясь в другой панели: это откроет консоль внизу. +Обычный пользователь сайта не увидит такой вывод, так как он в консоли. Чтобы увидеть его, либо откройте консольную панель инструментов разработчика, либо нажмите `key:Esc`, находясь в другой панели: это откроет консоль внизу. Если правильно выстроить логирование в приложении, то можно и без отладчика разобраться, что происходит в коде. @@ -187,12 +186,12 @@ for (let i = 0; i < 5; i++) { 1. Точками останова (breakpoints). 2. Использованием в коде команд `debugger`. -3. При ошибке (если инструменты разработчика открыты и кнопка "включена"). +3. При ошибке (если инструменты разработчика открыты и кнопка "включена"). -При остановке мы можем отлаживать - проанализировать переменные и пошагово пройти по процессу, что поможет отыскать проблему. +При остановке мы можем отлаживать: анализировать переменные и пошагово пройти по процессу, чтобы отыскать проблему. -В инструментах разработчика гораздо больше опций, чем описано здесь. С полным руководством можно ознакомиться здесь: . +В инструментах разработчика гораздо больше опций, чем описано здесь. С полным руководством можно ознакомиться на . -Информации из этой главы достаточно, чтобы начать отладку, но позже, особенно если вы много работаете с браузером, пожалуйста, перейдите туда и ознакомьтесь с более расширенными возможностями инструментов разработчика. +Информации из этой главы достаточно, чтобы начать отладку, но позже, особенно если вы много работаете с браузером, пожалуйста, перейдите туда и ознакомьтесь с расширенными возможностями инструментов разработчика. -И, конечно, вы можете щёлкнуть по различным местам инструментов разработки и просто посмотреть, что появляется. Пожалуй, это наискорейший способ ими овладеть. Не забывайте про правый клик мыши и контекстные меню! +И, конечно, вы можете просто кликать по различным местам инструментов разработки и смотреть, что при этом появляется. Пожалуй, это наискорейший способ ими овладеть. Не забывайте про правый клик мыши и контекстные меню! From d92a93ca7a2f893890ccb32ecf8a46cedb579299 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 05:28:29 +0300 Subject: [PATCH 0160/1128] minor fixes --- .../chrome-open-sources.svg | 2 +- .../chrome-sources-breakpoint.svg | 2 +- .../chrome-sources-debugger-pause.svg | 2 +- .../chrome-sources-debugger-trace-1.svg | 2 +- .../01-debugging-chrome/largeIcons.svg | 1472 +++++++++++++++++ 5 files changed, 1476 insertions(+), 4 deletions(-) create mode 100644 1-js/03-code-quality/01-debugging-chrome/largeIcons.svg diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg index a850a00603..a3c7db6ec4 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg @@ -1 +1 @@ -открыть исходные файлы \ No newline at end of file +open sources \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg index bef78e166d..6e7b60f854 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg @@ -1 +1 @@ -вот списокточки останова \ No newline at end of file +here's the listbreakpoints \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg index c5d92a7564..83468fddb1 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg @@ -1 +1 @@ -213посмотреть детали внешнего вызовасмотреть за выражениямитекущие переменные \ No newline at end of file +213see the outer call detailswatch expressionscurrent variables \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg index e9bccf2df7..23937e0d68 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg @@ -1 +1 @@ -вложенные вызовы \ No newline at end of file +nested calls \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg b/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg new file mode 100644 index 0000000000..83303365bd --- /dev/null +++ b/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg @@ -0,0 +1,1472 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + b + c + d + e + f + g + h + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + + + + + + + + + + + + + + + + + + From f0f3b20f1476ffcb8eed82b110b240061a360c57 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 05:47:57 +0300 Subject: [PATCH 0161/1128] minor fixes --- .../2-check-standard/ifelse_task2.svg | 2 +- .../chrome-open-sources.svg | 2 +- .../chrome-sources-breakpoint.svg | 2 +- .../chrome-sources-debugger-pause.svg | 2 +- .../chrome-sources-debugger-trace-1.svg | 2 +- .../01-debugging-chrome/head.html | 6 +- .../toolbarButtonGlyphs.svg | 1035 ----------------- 7 files changed, 8 insertions(+), 1043 deletions(-) delete mode 100644 1-js/03-code-quality/01-debugging-chrome/toolbarButtonGlyphs.svg diff --git a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg index bf9bf85761..2ef4442c7b 100644 --- a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg +++ b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg @@ -1 +1 @@ -НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное название" JavaScript?ДругоеECMAScript \ No newline at end of file +НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное" название JavaScript?ДругоеECMAScript \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg index a3c7db6ec4..a850a00603 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg @@ -1 +1 @@ -open sources \ No newline at end of file +открыть исходные файлы \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg index 6e7b60f854..bef78e166d 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg @@ -1 +1 @@ -here's the listbreakpoints \ No newline at end of file +вот списокточки останова \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg index 83468fddb1..c5d92a7564 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg @@ -1 +1 @@ -213see the outer call detailswatch expressionscurrent variables \ No newline at end of file +213посмотреть детали внешнего вызовасмотреть за выражениямитекущие переменные \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg index 23937e0d68..e9bccf2df7 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg @@ -1 +1 @@ -nested calls \ No newline at end of file +вложенные вызовы \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/head.html b/1-js/03-code-quality/01-debugging-chrome/head.html index f219b0af18..615326c08e 100644 --- a/1-js/03-code-quality/01-debugging-chrome/head.html +++ b/1-js/03-code-quality/01-debugging-chrome/head.html @@ -1,8 +1,8 @@ diff --git a/1-js/03-code-quality/01-debugging-chrome/toolbarButtonGlyphs.svg b/1-js/03-code-quality/01-debugging-chrome/toolbarButtonGlyphs.svg deleted file mode 100644 index 5bdf20a83a..0000000000 --- a/1-js/03-code-quality/01-debugging-chrome/toolbarButtonGlyphs.svg +++ /dev/null @@ -1,1035 +0,0 @@ - -image/svg+xml \ No newline at end of file From 6eaa8e8cfad20b6e27a679c48e9a8cc2d548e2a9 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 09:03:02 +0300 Subject: [PATCH 0162/1128] minor fixes --- 1-js/02-first-steps/14-switch/article.md | 2 +- 1-js/02-first-steps/18-javascript-specials/article.md | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/1-js/02-first-steps/14-switch/article.md b/1-js/02-first-steps/14-switch/article.md index 551d990f8f..7f356dc2da 100644 --- a/1-js/02-first-steps/14-switch/article.md +++ b/1-js/02-first-steps/14-switch/article.md @@ -117,7 +117,7 @@ switch (+a) { Для примера, выполним один и тот же код для `case 3` и `case 5`, сгруппировав их: ```js run no-beautify -let a = 2 + 2; +let a = 3; switch (a) { case 4: diff --git a/1-js/02-first-steps/18-javascript-specials/article.md b/1-js/02-first-steps/18-javascript-specials/article.md index 1daaa3aef3..7a7625c270 100644 --- a/1-js/02-first-steps/18-javascript-specials/article.md +++ b/1-js/02-first-steps/18-javascript-specials/article.md @@ -31,7 +31,7 @@ alert("После этого сообщения ждите ошибку") ```js function f() { - // после объявления функции необязательно ставить точку с запятой + // после объявления функции необязательно ставить точку с запятой } for(;;) { @@ -152,6 +152,9 @@ JavaScript поддерживает следующие операторы: Логические операторы : Логические И `&&`, ИЛИ `||` используют так называемое "ленивое вычисление" и возвращают значение, на котором оно остановилось (не обязательно `true` или `false`). Логическое НЕ `!` конвертирует операнд в логический тип и возвращает инвертированное значение. +Оператор нулевого слияния +: Оператор `??` предоставляет способ выбора определённого значения из списка переменных. Результатом `a ?? b` будет `a`, если только оно не равно `null/undefined`, тогда `b`. + Сравнение : Проверка на равенство `==` значений разных типов конвертирует их в число (за исключением `null` и `undefined`, которые могут равняться только друг другу), так что примеры ниже равны: @@ -171,7 +174,7 @@ JavaScript поддерживает следующие операторы: Другие операторы : Существуют и другие операторы, такие как запятая. -Подробности: , , . +Подробности: , , , . ## Циклы From f6f15180e1e07ee04ef2fdbbffb06f36093d0117 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 30 Mar 2022 16:15:42 +0300 Subject: [PATCH 0163/1128] minor fixes --- .../09-size-and-scroll/metric-client-left-top-rtl.svg | 2 +- 2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg b/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg index dd9e17cf8b..e8dd3d60a0 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg @@ -1 +1 @@ -clientTop: 25px = borderclientLeft: 41px \ No newline at end of file +clientTop: 25px = borderclientLeft: 41px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg b/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg index 968590466e..8097afa78f 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.clientTop: 25px = borderclientLeft: 25px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.clientTop: 25px = borderclientLeft: 25px \ No newline at end of file From 5d5238d86b75de41b6de7d8c9b4e577ef0f9c6af Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 30 Mar 2022 22:05:23 +0600 Subject: [PATCH 0164/1128] update object to primitive article --- .../09-object-toprimitive/article.md | 204 +++++++++++------- 1 file changed, 129 insertions(+), 75 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index ac2575dd70..5646d08a71 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -3,28 +3,45 @@ Что произойдёт, если сложить два объекта `obj1 + obj2`, вычесть один из другого `obj1 - obj2` или вывести их на экран, воспользовавшись `alert(obj)`? -В этом случае объекты сначала автоматически преобразуются в примитивы, а затем выполняется операция. +JavaScript совершенно не позволяет настраивать, как операторы работают с объектами. В отличие от некоторых других языков программирования, таких как Ruby или C++, мы не можем реализовать специальный объектный метод для обработки сложения (или других операторов). -В главе мы видели правила для численных, строковых и логических преобразований. Но обделили вниманием объекты. Теперь, поскольку мы уже знаем о методах объектов и символах, можно исправить это упущение. +В случае таких операций, объекты автоматически преобразуются в примитивы, затем выполняется сама операция над этими примитивами, и на выходе мы получаем примитивное значение. -1. Все объекты в логическом контексте являются `true`. Существуют лишь их численные и строковые преобразования. -2. Численные преобразования происходят, когда мы вычитаем объекты или выполняем математические операции. Например, объекты `Date` (мы рассмотрим их в статье ) могут вычитаться, и результатом `date1 - date2` будет временной отрезок между двумя датами. -3. Что касается строковых преобразований -- они обычно происходят, когда мы выводим объект `alert(obj)`, а также в других случаях, когда объект используется как строка. +Это важное ограничение, результатом `obj1 + obj2` не может быть другой объект! -## Преобразование к примитивам +К примеру, мы не можем создавать объекты, представляющие векторы или матрицы (или достижения или может ещё что-то), складывать их и ожидать в качестве результата "суммированный" объект. Такие архитектурные подвиги автоматически оказываются "за бортом". -Мы можем тонко настраивать строковые и численные преобразования, используя специальные методы объекта. +Итак, поскольку мы здесь мало что можем сделать, в реальных проектах нет математики с объектами. Когда это происходит, обычно это происходит из-за ошибки в коде. -Существуют три варианта преобразований ("три хинта"), описанные в [спецификации](https://tc39.github.io/ecma262/#sec-toprimitive): +В этой главе мы рассмотрим, как объект преобразуется в примитив и как это можно настроить. + +У нас есть две цели: + +1. Это позволит нам понять, что происходит в случае ошибок коде, когда такая операция произошла случайно. +2. Есть исключения, когда такие операции возможны и выглядят хорошо. Например, вычитание или сравнение дат (`Date` объекты). Мы встретимся с ними позже. + +## Правила преобразования + +В главе мы рассмотрели правила для числовых, строковых и логических преобразований примитивов. Но мы оставили пробел для объектов. Но теперь, когда мы уже знаем о методах и символах, пришло время заполнить этот пробел. + +1. Все объекты являются `true` в логическом контексте. Существуют лишь их численные и строковые преобразования. +2. Числовое преобразование происходит, когда мы вычитаем объекты или применяем математические функции. Например, объекты `Date` (которые будут рассмотрены в главе ) могут быть вычтены, и результатом `date1 - date2` будет разница во времени между двумя датами. +3. Что касается преобразования строки -- это обычно происходит, когда мы выводим их на экран объект как `alert(obj)` и в подобных контекстах. + +Мы можем точно настроить преобразование строк и чисел, используя специальные объектные методы. + +Существует три варианта преобразования типов, которые происходят в различных ситуациях. + +Они называются "хинтами", как описано в [спецификации](https://tc39.github.io/ecma262/#sec-toprimitive): `"string"` -: Для преобразования объекта к строке, когда операция ожидает получить строку, например `alert`: +: Для преобразования объекта в строку, когда мы выполняем операцию над объектом, которая ожидает строку, например `alert`: ```js // вывод alert(obj); - // используем объект в качестве имени свойства + // используем объект в качестве ключа свойства anotherObj[obj] = 123; ``` @@ -35,53 +52,62 @@ // явное преобразование let num = Number(obj); - // математическое (исключая бинарный оператор "+") + // математические (не считая бинарного плюса) let n = +obj; // унарный плюс let delta = date1 - date2; - // сравнения больше/меньше + // сравнение больше/меньше let greater = user1 > user2; ``` `"default"` -: Происходит редко, когда оператор "не уверен", какой тип ожидать. +: Возникает в редких случаях, когда оператор "не уверен", какого типа ожидать. - Например, бинарный плюс `+` может работать с обоими типами: строками (объединять их) и числами (складывать). Таким образом, и те, и другие будут вычисляться. Или когда происходит сравнение объектов с помощью нестрогого равенства `==` со строкой, числом или символом, и неясно, какое преобразование должно быть выполнено. + Например, бинарный плюс `+` может работать как со строками (объединяя их), так и с числами (складывая их), поэтому подойдут и строки, и числа. Таким образом, если двоичный плюс получает объект в качестве аргумента, он использует хинт `"default"` для его преобразования. + + Кроме того, если объект сравнивается с помощью `==` со строкой, числом или символом, также неясно, какое преобразование следует выполнить, поэтому используется хинт "default". ```js - // бинарный плюс - let total = car1 + car2; + // бинарный плюс использует хинт "default" + let total = obj1 + obj2; - // obj == string/number/symbol + // obj == number использует хинт "default" if (user == 1) { ... }; ``` - Оператор больше/меньше `<>` также может работать как со строками, так и с числами. Однако, по историческим причинам он использует хинт "number", а не "default". + Операторы сравнения больше/меньше, такие как `<` `>`, также могут работать как со строками, так и с числами. Тем не менее, по историческим причинам, они используют хинт `"number"`, а не `"default"`. - На практике все встроенные объекты, исключая `Date` (мы познакомимся с ним чуть позже), реализуют `"default"` преобразования тем же способом, что и `"number"`. И нам следует поступать так же. + Впрочем на практике, нам не нужно запоминать эти специфические детали, потому что все встроенные объекты, за исключением одного случая (объект `Date`, который мы рассмотрим позже), реализуют `"default"` преобразование тем же способом, что и `"number"`. И мы можем поступать так же. -Обратите внимание, что существуют лишь три варианта хинтов. Всё настолько просто. Не существует хинта со значением "boolean" (все объекты являются `true` в логическом контексте) или каких-либо ещё. И если мы считаем `"default"` и `"number"` одинаковыми, как большинство встроенных объектов, то остаются всего два варианта преобразований. +```smart header="Нет `\"логического\"` хинта" +Обратите внимание -- есть только три хинта. Это очень просто. -**В процессе преобразования движок JavaScript пытается найти и вызвать три следующих метода объекта:** +Не существует хинта со значением "boolean" (все объекты являются `true` в логическом контексте) или каких-либо ещё. И если мы будем относиться к "default" и "number" одинаково, как это делают большинство встроенных объектов, то тогда будет только два преобразования. +``` -1. Вызывает `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, и передаёт ему хинт. -2. Иначе, если хинт равен `"string"` - - пытается вызвать `obj.toString()`, а если его нет, то `obj.valueOf()`, если он существует. +**Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих объектных метода:** + +1. Вызов `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, +2. В противном случае, если хинт равен `"string"` + - пробует `obj.toString()` и `obj.valueOf()`, независимо от того, что существует. 3. В случае, если хинт равен `"number"` или `"default"` - - пытается вызвать `obj.valueOf()`, а если его нет, то `obj.toString()`, если он существует. + - пробует `obj.valueOf()` и `obj.toString()`, независимо от того, что существует. ## Symbol.toPrimitive -Начнём с универсального подхода - символа `Symbol.toPrimitive`: метод с таким названием (если есть) используется для всех преобразований: +Давайте начнём с первого метода. Есть встроенный символ с именем `Symbol.toPrimitive`, который следует использовать для обозначения метода преобразования, например: ```js obj[Symbol.toPrimitive] = function(hint) { - // должен вернуть примитивное значение - // hint равно чему-то одному из: "string", "number" или "default" + // вот код для преобразования этого объекта в примитив + // он должен вернуть примитивное значение + // hint = чему-то из "string", "number", "default" }; ``` -Для примера используем его в реализации объекта `user`: +Если метод `Symbol.toPrimitive` существует, он используется для всех хинтов, и больше никаких методов не требуется. + +Например, здесь объект `user` реализует это: ```js run let user = { @@ -100,19 +126,41 @@ alert(+user); // hint: number -> 1000 alert(user + 500); // hint: default -> 1500 ``` -Как мы видим из кода, `user` преобразовывается либо в информативную читаемую строку, либо в денежный счёт в зависимости от значения хинта. Единственный метод `user[Symbol.toPrimitive]` смог обработать все случаи преобразований. +Как мы можем видеть из кода, `user` становится либо самодостаточной строкой или денежной суммой в зависимости от преобразования. Один метод `user[Symbol.toPrimitive]` обрабатывает все случаи преобразования. + + +## toString/valueOf + +Если нет `Symbol.toPrimitive`, тогда JavaScript пытается найти методы `toString` и `valueOf`: + +- Для хинта "string": `toString`, а если он не существует, то `valueOf` (таким образом `toString` имеет приоритет для преобразования строк). +- Для других хинтов: `valueOf`, а если он не существует, то `toString` (таким образом `valueOf` имеет приоритет для математических операций). + +Методы `toString` и `valueOf` берут своё начало с древних времён. Это не символы (символов ещё тогда не было), а скорее просто "обычные" методы со строковыми именами. Они предоставляют альтернативный "старомодный" способ реализации преобразования. + +Эти методы должны возвращать примитивное значение. Если `toString` или `valueOf` возвращает объект, то он игнорируется (так же, как если бы метода не было). + +По умолчанию обычный объект имеет следующие методы `toString` и `valueOf`: +- Метод `toString` возвращает строку `"[object Object]"`. +- Метод `valueOf` возвращает сам объект. -## Методы toString/valueOf +Взгляните на пример: -Методы `toString` и `valueOf` берут своё начало с древних времён. Это не символы, так как в то время символов ещё не существовало, а просто обычные методы объектов со строковыми именами. Они предоставляют "устаревший" способ реализации преобразований объектов. +```js run +let user = {name: "John"}; + +alert(user); // [object Object] +alert(user.valueOf() === user); // true +``` -Если нет метода `Symbol.toPrimitive`, движок JavaScript пытается найти эти методы и вызвать их следующим образом: +Таким образом, если мы попытаемся использовать объект в качестве строки, как например в 'alert' или вроде того, то по умолчанию мы увидим `[object Object]`. -- `toString -> valueOf` для хинта со значением "string". -- `valueOf -> toString` -- в ином случае. +Значение по умолчанию `valueOf` упоминается здесь только для полноты картины, чтобы избежать какой-либо путаницы. Как вы можете видеть, он возвращает сам объект и поэтому игнорируется. Не спрашивайте меня почему, это по историческим причинам. Так что мы можем предположить, что его не существует. -Для примера, используем их в реализации всё того же объекта `user`. Воспроизведём его поведение комбинацией методов `toString` и `valueOf`: +Давайте применим эти методы для настройки преобразования. + +Для примера, используем их в реализации всё того же объекта `user`. Но уже используя комбинацию `toString` и `valueOf` вместо `Symbol.toPrimitive`: ```js run let user = { @@ -138,7 +186,7 @@ alert(user + 500); // valueOf -> 1500 Как видим, получилось то же поведение, что и в предыдущем примере с `Symbol.toPrimitive`. -Довольно часто мы хотим описать одно "универсальное" преобразование объекта к примитиву для всех ситуаций. Для этого достаточно создать один `toString`: +Довольно часто нам нужно единое "универсальное" место для обработки всех примитивных преобразований. В этом случае мы можем реализовать только `toString`: ```js run let user = { @@ -153,71 +201,77 @@ alert(user); // toString -> John alert(user + 500); // toString -> John500 ``` -В отсутствие `Symbol.toPrimitive` и `valueOf`, `toString` обработает все случаи преобразований к примитивам. - +В отсутствие Symbol.toPrimitive` и `valueOf`, `toString` обработает все примитивные преобразования. -## Возвращаемые типы +### Преобразование может вернуть любой примитивный тип -Важно понимать, что все описанные методы для преобразований объектов не обязаны возвращать именно требуемый "хинтом" тип примитива. +Важная вещь, которую следует знать обо всех методах преобразования примитивов, заключается в том, что они не обязательно возвращают подсказанный хинтом примитив. -Нет обязательного требования, чтобы `toString()` возвращал именно строку, или чтобы метод `Symbol.toPrimitive` возвращал именно число для хинта "number". +Нет никакого контроля над тем, вернёт ли `toString` именно строку, или чтобы метод `Symbol.toPrimitive` возращал число для хинта `"number"`. -**Единственное обязательное требование: методы должны возвращать примитив, а не объект.** +Единственное обязательное условие: эти методы должны возвращать примитив, а не объект. ```smart header="Историческая справка" -По историческим причинам, если `toString` или `valueOf` вернёт объект, то ошибки не будет, но такое значение будет проигнорировано (как если бы метода вообще не существовало). +По историческим причинам, если `toString` или `valueOf` вернёт объект, то ошибки не будет, но такое значение будет проигнорировано (как если бы метода вообще не существовало). Это всё потому, что в древние времена в JavaScript не было хорошей концепции "ошибки". -Метод `Symbol.toPrimitive`, напротив, *обязан* возвращать примитив, иначе будет ошибка. +К примеру `Symbol.toPrimitive`, напротив, *обязан* возвращать примитив, иначе будет ошибка. ``` -## Последующие операции +## Дальнейшие преобразования -Операция, инициировавшая преобразование, получает примитив и затем продолжает работу с ним, производя дальнейшие преобразования, если это необходимо. +Как мы уже знаем, многие операторы и функции выполняют преобразования типов, например, умножение `*` преобразует операнды в числа. + +Если мы передаём объект в качестве аргумента, то на это есть два этапа: +1. Объект преобразуется в примитив (с использованием правил, описанных выше). +2. Если полученный примитив не имеет подходящего типа, он преобразуется. Например: -- Математические операции, исключая бинарный плюс, преобразуют примитив к числу: +```js run +let obj = { + // toString обрабатывает все преобразования в случае отсутствия других методов + toString() { + return "2"; + } +}; - ```js run - let obj = { - // toString обрабатывает все преобразования в случае отсутствия других методов - toString() { - return "2"; - } - }; +alert(obj * 2); // 4, объект был преобразован к примитиву "2", затем умножение сделало его числом +``` - alert(obj * 2); // 4, объект был преобразован к примитиву "2", затем умножение сделало его числом - ``` +1. 1. Умножение `obj * 2` сначала преобразует объект в примитив (это строка `"2"`). +2. Затем `"2" * 2` становится `2 * 2` (строка преобразуется в число). -- Бинарный плюс `+` в аналогичном случае сложит строки: +А вот, к примеру, бинарный плюс в подобной ситуации соединил бы строки, так как он совсем не брезгует строк: - ```js run - let obj = { - toString() { - return "2"; - } - }; +```js run +let obj = { + toString() { + return "2"; + } +}; - alert(obj + 2); // 22 (преобразование к примитиву вернуло строку => конкатенация) - ``` +alert(obj + 2); // 22 ("2" + 2), conversion to primitive returned a string => concatenation +``` ## Итого -Преобразование объектов в примитивы вызывается автоматически многими встроенными функциями и операторами, которые ожидают примитив в качестве аргумента. +Преобразование объекта в примитив вызывается автоматически многими встроенными функциями и операторами, которые ожидают примитив в качестве значения. -Существует всего 3 типа преобразований (хинтов): +Существует всего 3 типа (хинтов) для этого: - `"string"` (для `alert` и других операций, которым нужна строка) - `"number"` (для математических операций) -- `"default"` (для некоторых операций) +- `"default"` (для нескольких других операторов) -В спецификации явно указано, какой хинт должен использовать каждый оператор. И существует совсем немного операторов, которые не знают, что ожидать, и используют хинт со значением `"default"`. Обычно для встроенных объектов хинт `"default"` обрабатывается так же, как `"number"`. Таким образом, последние два очень часто объединяют вместе. +Спецификация явно описывает, какой оператор использует тот или иной хинт. И существует совсем немного операторов, которые "не знают, чего ожидать" и используют хинт `"default"`. Обычно для встроенных объектов хинт `"default"` обрабатывается так же, как `"number"`, поэтому на практике последние два часто сливаются воедино. -Алгоритм преобразований к примитивам следующий: +Алгоритм преобразования таков: 1. Сначала вызывается метод `obj[Symbol.toPrimitive](hint)`, если он существует. -2. Иначе, если хинт равен `"string"` - - происходит попытка вызвать `obj.toString()`, затем `obj.valueOf()`, смотря что есть. +2. В случае, если хинт равен `"string"` + - происходит попытка вызвать `obj.toString()` и `obj.valueOf()`, смотря что есть. 3. Иначе, если хинт равен `"number"` или `"default"` - - происходит попытка вызвать `obj.valueOf()`, затем `obj.toString()`, смотря что есть. + - происходит попытка вызвать `obj.valueOf()` и `obj.toString()`, смотря что есть. + +На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований строк, который должен возвращать удобочитаемое представление объекта для целей ведения логирования или отладки. -На практике довольно часто достаточно реализовать только `obj.toString()` как "универсальный" метод для всех типов преобразований, возвращающий "читаемое" представление объекта, достаточное для логирования или отладки. +Что касается математических операций, JavaScript не предоставляет способа "переопределить" их с помощью методов, поэтому в реальных проектах они редко используются для объектов. From ee13ccba24f049f1920766f71a842ef952538283 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 30 Mar 2022 22:10:14 +0600 Subject: [PATCH 0165/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 5646d08a71..f9d5ad1f85 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -250,7 +250,7 @@ let obj = { } }; -alert(obj + 2); // 22 ("2" + 2), conversion to primitive returned a string => concatenation +alert(obj + 2); // 22 ("2" + 2), преобразование к примитиву вернуло строку => конкатенация ``` ## Итого From 598e16133c0050ac4ec17e43956d4b6f5321197f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 30 Mar 2022 22:12:45 +0600 Subject: [PATCH 0166/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index f9d5ad1f85..63b83dc7cc 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -266,7 +266,7 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити Алгоритм преобразования таков: -1. Сначала вызывается метод `obj[Symbol.toPrimitive](hint)`, если он существует. +1. Сначала вызывается метод `obj[Symbol.toPrimitive](hint)`, если он существует, 2. В случае, если хинт равен `"string"` - происходит попытка вызвать `obj.toString()` и `obj.valueOf()`, смотря что есть. 3. Иначе, если хинт равен `"number"` или `"default"` From fca6453a6656df61f37359114f773043ac59b1d1 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 30 Mar 2022 22:19:09 +0600 Subject: [PATCH 0167/1128] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/04-object-basics/09-object-toprimitive/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 63b83dc7cc..4c9cb816a2 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -35,7 +35,7 @@ JavaScript совершенно не позволяет настраивать, Они называются "хинтами", как описано в [спецификации](https://tc39.github.io/ecma262/#sec-toprimitive): `"string"` -: Для преобразования объекта в строку, когда мы выполняем операцию над объектом, которая ожидает строку, например `alert`: +: Для преобразования объекта в строку, когда мы выполняем операцию над объектом, которая ожидает строку, например `alert`: ```js // вывод @@ -56,12 +56,12 @@ JavaScript совершенно не позволяет настраивать, let n = +obj; // унарный плюс let delta = date1 - date2; - // сравнение больше/меньше + // сравнения больше/меньше let greater = user1 > user2; ``` `"default"` -: Возникает в редких случаях, когда оператор "не уверен", какого типа ожидать. +: Происходит редко, когда оператор "не уверен", какой тип ожидать. Например, бинарный плюс `+` может работать как со строками (объединяя их), так и с числами (складывая их), поэтому подойдут и строки, и числа. Таким образом, если двоичный плюс получает объект в качестве аргумента, он использует хинт `"default"` для его преобразования. From 63c59672c52ba38fb4feef1dfdd72027c2e6a6e1 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 30 Mar 2022 22:22:59 +0600 Subject: [PATCH 0168/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 4c9cb816a2..a5abcb9a9a 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -28,14 +28,14 @@ JavaScript совершенно не позволяет настраивать, 2. Числовое преобразование происходит, когда мы вычитаем объекты или применяем математические функции. Например, объекты `Date` (которые будут рассмотрены в главе ) могут быть вычтены, и результатом `date1 - date2` будет разница во времени между двумя датами. 3. Что касается преобразования строки -- это обычно происходит, когда мы выводим их на экран объект как `alert(obj)` и в подобных контекстах. -Мы можем точно настроить преобразование строк и чисел, используя специальные объектные методы. +Мы можем тонко настроить преобразование строк и чисел, используя специальные объектные методы. Существует три варианта преобразования типов, которые происходят в различных ситуациях. Они называются "хинтами", как описано в [спецификации](https://tc39.github.io/ecma262/#sec-toprimitive): `"string"` -: Для преобразования объекта в строку, когда мы выполняем операцию над объектом, которая ожидает строку, например `alert`: +: Для преобразования объекта к строке, когда мы выполняем операцию над объектом, которая ожидает строку, например `alert`: ```js // вывод From 316809fe64c927bfa3e6abe52db77e7b767bf5d1 Mon Sep 17 00:00:00 2001 From: Yevhen Yanchak Date: Wed, 30 Mar 2022 19:25:21 +0300 Subject: [PATCH 0169/1128] Update article.md --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 385d8d294a..85bb940889 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -104,7 +104,7 @@ alert( sum(1, 2) ); // 3 ## Итого -Стрелочные функции очень удобны для простых действий, особенно для однострочныз. +Стрелочные функции очень удобны для простых действий, особенно для однострочных. Они бывают двух типов: From 3dc728c5ad286932ebad1f8e189a3571cdae525c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 30 Mar 2022 22:25:46 +0600 Subject: [PATCH 0170/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index a5abcb9a9a..baba5c5894 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -88,7 +88,7 @@ JavaScript совершенно не позволяет настраивать, **Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих объектных метода:** 1. Вызов `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, -2. В противном случае, если хинт равен `"string"` +2. В случае, если хинт равен `"string"` - пробует `obj.toString()` и `obj.valueOf()`, независимо от того, что существует. 3. В случае, если хинт равен `"number"` или `"default"` - пробует `obj.valueOf()` и `obj.toString()`, независимо от того, что существует. @@ -269,7 +269,7 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити 1. Сначала вызывается метод `obj[Symbol.toPrimitive](hint)`, если он существует, 2. В случае, если хинт равен `"string"` - происходит попытка вызвать `obj.toString()` и `obj.valueOf()`, смотря что есть. -3. Иначе, если хинт равен `"number"` или `"default"` +3. В случае, если хинт равен `"number"` или `"default"` - происходит попытка вызвать `obj.valueOf()` и `obj.toString()`, смотря что есть. На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований строк, который должен возвращать удобочитаемое представление объекта для целей ведения логирования или отладки. From d929d5653ceb0b1b977eb2bda4814cf3d3e7e00d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Thu, 31 Mar 2022 01:23:23 +0600 Subject: [PATCH 0171/1128] Removed the superfluous translation --- .../06-constructor-new/article.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index 0b1af0ba22..c116f7aee3 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -6,7 +6,7 @@ ## Функция-конструктор -Функции-конструкторы технически являются обычными функциями. Однако есть два соглашения: +Функции-конструкторы технически являются обычными функциями. Но есть два соглашения: 1. Имя функции-конструктора должно начинаться с большой буквы. 2. Они должны выполняться только с помощью оператора `"new"`. @@ -62,7 +62,7 @@ let user = { Теперь, если нам будет необходимо создать других пользователей, мы можем просто вызвать `new User("Ann")`, `new User("Alice")` и так далее. Данная конструкция гораздо удобнее и читабельнее, чем каждый раз создавать литерал объекта. -Это и есть основная цель конструкторов - реализовать код для многократного создания однотипных объектов. +Это и является основной целью конструкторов - реализовать код для многократного создания однотипных объектов. Давайте ещё раз отметим - технически любая функция (кроме функций со стрелками, поскольку у них нет `this`) может использоваться в качестве конструктора. Его можно запустить с помощью `new`, и он выполнит выше указанный алгоритм. Должна начинаться с "заглавной буквы" - это общее соглашение, чтобы было ясно, что функция должна вызываться с помощью "new". @@ -110,9 +110,9 @@ new User(); // function User { ... } */!* ``` -Это можно использовать внутри функции, чтобы узнать, была ли она вызвана при `new`, "в режиме конструктора", или без него, "в обычном режиме". +Это можно использовать внутри функции, чтобы узнать, была ли она вызвана при помощи `new`, "в режиме конструктора", или без него, "в обычном режиме". -Мы также можем сделать чтобы `new` и обычные вызовы делали то же самое, как-то так: +Мы также можем сделать чтобы `new` и обычные вызовы делали одно и тоже, как-то так: ```js run function User(name) { @@ -129,7 +129,7 @@ alert(john.name); // John Такой подход иногда используется в библиотеках, чтобы сделать синтаксис более гибким. Так чтобы люди могли вызывать функцию с `new` или без него, и она все ещё могла работать. -Впрочем вероятно, это не очень хорошая практика использовать этот трюк везде, так как опуск `new` делает немного менее очевидным то, что происходит. С `new` мы все понимаем, что создаётся новый объект. +Впрочем, вероятно, это не очень хорошая практика использовать этот трюк везде, так как опуск `new` делает немного менее очевидным то, что происходит. С `new` мы все точно знаем, что создаётся новый объект. ## Возврат значения из конструктора, return @@ -168,7 +168,7 @@ function SmallUser() { alert( new SmallUser().name ); // John ``` -Обычно у конструкторов отсутствует `return`. Здесь мы упоминаем об особом поведении с возвращаемыми объектами в основном для полноты картины. +Обычно у конструкторов отсутствует `return`. Здесь мы упомянули особое поведение с возвращаемыми объектами в основном для полноты картины. ````smart header="Опуск скобок" Кстати, мы можем не ставить круглые скобки после `new`, если у него нет аргументов: @@ -179,7 +179,7 @@ let user = new User; // <-- без скобок let user = new User(); ``` -Пропуск скобок здесь не считается "хорошим стилем", но просто чтобы вы знали, такой синтаксис разрешён спецификацией. +Пропуск скобок считается плохой практикой, но просто чтобы вы знали, такой синтаксис разрешён спецификацией. ```` ## Создание методов в конструкторе @@ -213,7 +213,7 @@ john = { */ ``` -Для создания сложных объектов существует более продвинутый синтаксис - [классы](info:classes), который мы рассмотрим позже. +Для создания сложных объектов есть и более продвинутый синтаксис - [классы](info:classes), который мы рассмотрим позже. ## Итого @@ -227,5 +227,5 @@ JavaScript предоставляет функции-конструкторы д ```smart header="Объекты, we'll be back! (мы ещё вернёмся!)" В этой главе мы рассмотрели только основы объектов и конструкторов. Данная информация необходима нам для дальнейшего изучения типов данных и функций в последующих главах. -После того, как мы с этим разберёмся, мы вернёмся к объектам для более детального изучения в главах и . +Как только мы с ними разберёмся, мы вернёмся к объектам для более детального изучения в главах и . ``` From c5d6340b7f9baf7ed58063d676ba73129e510a4b Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 1 Apr 2022 02:06:21 +0600 Subject: [PATCH 0172/1128] some fixes --- 1-js/04-object-basics/09-object-toprimitive/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index baba5c5894..6c1cdd2ac5 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -5,7 +5,7 @@ JavaScript совершенно не позволяет настраивать, как операторы работают с объектами. В отличие от некоторых других языков программирования, таких как Ruby или C++, мы не можем реализовать специальный объектный метод для обработки сложения (или других операторов). -В случае таких операций, объекты автоматически преобразуются в примитивы, затем выполняется сама операция над этими примитивами, и на выходе мы получаем примитивное значение. +В случае таких операций, объекты автоматически преобразуются в примитивы, затем выполняется сама операция над этими примитивами, и на выходе мы получим примитивное значение. Это важное ограничение, результатом `obj1 + obj2` не может быть другой объект! @@ -201,7 +201,7 @@ alert(user); // toString -> John alert(user + 500); // toString -> John500 ``` -В отсутствие Symbol.toPrimitive` и `valueOf`, `toString` обработает все примитивные преобразования. +В отсутствие `Symbol.toPrimitive` и `valueOf`, `toString` обработает все примитивные преобразования. ### Преобразование может вернуть любой примитивный тип @@ -274,4 +274,4 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований строк, который должен возвращать удобочитаемое представление объекта для целей ведения логирования или отладки. -Что касается математических операций, JavaScript не предоставляет способа "переопределить" их с помощью методов, поэтому в реальных проектах они редко используются для объектов. +Что касается математических операций, JavaScript не предоставляет способа "переопределить" их с помощью методов, поэтому в реальных проектах они редко используются на объектах. From 2a86ce4efb3d4ce44afe82784848a9fbb04b9086 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 1 Apr 2022 02:48:37 +0600 Subject: [PATCH 0173/1128] Removed the superfluous translation --- .../06-constructor-new/1-two-functions-one-object/solution.md | 2 +- 1-js/04-object-basics/06-constructor-new/article.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md b/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md index 058b1668e6..06167834b4 100644 --- a/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md +++ b/1-js/04-object-basics/06-constructor-new/1-two-functions-one-object/solution.md @@ -1,4 +1,4 @@ -Да, это возможно. +Да, возможно. Если функция возвращает объект, то `new` вернёт его вместо `this`. diff --git a/1-js/04-object-basics/06-constructor-new/article.md b/1-js/04-object-basics/06-constructor-new/article.md index c116f7aee3..2cc2ecdcab 100644 --- a/1-js/04-object-basics/06-constructor-new/article.md +++ b/1-js/04-object-basics/06-constructor-new/article.md @@ -1,6 +1,6 @@ # Конструктор, оператор "new" -Обычный синтаксис `{...}` позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как множество пользователей, элементы меню и так далее. +Обычный синтаксис `{...}` позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как пользователи, элементы меню и так далее. Это можно сделать при помощи функции-конструктора и оператора `"new"`. @@ -184,7 +184,7 @@ let user = new User(); ## Создание методов в конструкторе -Использование конструкторов для создания объектов даёт большую гибкость. Функции-конструкторы могут иметь параметры, определяющие, как создавать объект и что в него помещать. +Использование конструкторов для создания объектов даёт большую гибкость. Функции-конструкторы могут иметь параметры, определяющие, как создавать объект и что в него записывать. Конечно, мы можем добавить к `this` не только свойства, но и методы. From e1ccd6ada151f0290f98ba20af963dcd3f374a46 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 1 Apr 2022 02:57:02 +0600 Subject: [PATCH 0174/1128] fix --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 6c1cdd2ac5..aec32328e0 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -41,7 +41,7 @@ JavaScript совершенно не позволяет настраивать, // вывод alert(obj); - // используем объект в качестве ключа свойства + // используем объект в качестве ключа anotherObj[obj] = 123; ``` From 362577ad887b847fa20781105772c574cbed8708 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 1 Apr 2022 04:51:43 +0600 Subject: [PATCH 0175/1128] Update article.md --- 1-js/05-data-types/01-primitives-methods/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/01-primitives-methods/article.md b/1-js/05-data-types/01-primitives-methods/article.md index 78c3f734a3..d5fb12e134 100644 --- a/1-js/05-data-types/01-primitives-methods/article.md +++ b/1-js/05-data-types/01-primitives-methods/article.md @@ -39,8 +39,8 @@ roma.sayHi(); // Привет, дружище! Вот парадокс, с которым столкнулся создатель JavaScript: -- Есть много всего, что хотелось бы сделать с примитивами, такими как строка или число. Было бы замечательно, если бы мы могли работать с ними через вызовы методов. -- Примитивы должны быть лёгкими и быстрыми. +- Есть много всего, что хотелось бы сделать с примитивами, такими как строка или число. Было бы замечательно, если бы мы могли обращаться к ним при помощи методов. +- Примитивы должны быть лёгкими и быстрыми насколько это возможно. Выбранное решение, хотя выглядит оно немного неуклюже: @@ -48,7 +48,7 @@ roma.sayHi(); // Привет, дружище! 2. Язык позволяет осуществлять доступ к методам и свойствам строк, чисел, булевых значений и символов. 3. Чтобы это работало, при таком доступе создаётся специальный "объект-обёртка", который предоставляет нужную функциональность, а после удаляется. -Каждый примитив имеет свой собственный "объект-обёртку", которые называются: `String`, `Number`, `Boolean` и `Symbol`. Таким образом, они имеют разный набор методов. +Каждый примитив имеет свой собственный "объект-обёртку", которые называются: `String`, `Number`, `Boolean`, `Symbol` и `BigInt`. Таким образом, они имеют разный набор методов. К примеру, существует метод [str.toUpperCase()](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase), который возвращает строку в верхнем регистре. From c4fcdeca72735161d79fa36078e1c8bd8fcd369c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 1 Apr 2022 05:05:18 +0600 Subject: [PATCH 0176/1128] Update article.md --- 1-js/05-data-types/01-primitives-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/01-primitives-methods/article.md b/1-js/05-data-types/01-primitives-methods/article.md index d5fb12e134..c73d7b5deb 100644 --- a/1-js/05-data-types/01-primitives-methods/article.md +++ b/1-js/05-data-types/01-primitives-methods/article.md @@ -1,4 +1,4 @@ -# Методы у примитивов +# Методы примитивов JavaScript позволяет нам работать с примитивными типами данных - строками, числами и т.д., как будто они являются объектами. У них есть и методы. Мы изучим их позже, а сначала разберём, как это всё работает, потому что, конечно, примитивы - не объекты. From 3f6fed500a2ce3f26507cd8877900829161bd333 Mon Sep 17 00:00:00 2001 From: LexaWin <87317612+LexaWin@users.noreply.github.com> Date: Sat, 2 Apr 2022 13:24:56 +0300 Subject: [PATCH 0177/1128] =?UTF-8?q?=D0=A1=D0=B8=D0=BD=D1=85=D1=80=D0=BE?= =?UTF-8?q?=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=20=D0=B0?= =?UTF-8?q?=D0=BD=D0=B3=D0=BB=D0=B8=D0=B9=D1=81=D0=BA=D0=BE=D0=B9=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил переведенный блок про запуск модулей, который есть в английской версии и которого нет в русской. Будет полезно для тех, кто испытывает проблемы с запуском примеров из глав про модули. Правки перевода категорически приветствуются. --- 1-js/13-modules/01-modules-intro/article.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/1-js/13-modules/01-modules-intro/article.md b/1-js/13-modules/01-modules-intro/article.md index 6da06ae14e..05fdb0ee00 100644 --- a/1-js/13-modules/01-modules-intro/article.md +++ b/1-js/13-modules/01-modules-intro/article.md @@ -57,6 +57,10 @@ sayHi('John'); // Hello, John! Браузер автоматически загрузит и запустит импортированный модуль (и те, которые он импортирует, если надо), а затем запустит скрипт. +```warn header="Модули не работают локально. Только через HTTP(s)" +Если вы попытаетесь открыть веб-страницу локально, через протокол `file://`, вы обнаружите, что директивы `import/export` не работают. Для тестирования модулей используйте локальный веб-сервер, например, [static-server](https://www.npmjs.com/package/static-server#getting-started) или используйте возможности "живого сервера" вашего редактора, например, расширение [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) для VS Code. +``` + ## Основные возможности модулей Чем отличаются модули от "обычных" скриптов? From e4f6b5682ad89a1c93cfa63714923811c05158e9 Mon Sep 17 00:00:00 2001 From: ovarn Date: Sat, 2 Apr 2022 13:49:17 +0200 Subject: [PATCH 0178/1128] =?UTF-8?q?=D0=9D=D0=B5=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BE=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=87=D0=B8=D1=81=D0=BB=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 5-network/02-formdata/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5-network/02-formdata/article.md b/5-network/02-formdata/article.md index 17b034a9ac..4f0337002e 100644 --- a/5-network/02-formdata/article.md +++ b/5-network/02-formdata/article.md @@ -160,7 +160,7 @@ for(let [name, value] of formData) { formData.append("image", imageBlob, "image.png"); ``` -Это как если бы в форме был элемент `` и пользователь прикрепил бы файл с именем `"image.png"` (3й аргумент) и данными `imageBlob` (2й аргумент) из своей файловой системы. +Это как если бы в форме был элемент `` и пользователь прикрепил бы файл с именем `"image.png"` (3-й аргумент) и данными `imageBlob` (2-й аргумент) из своей файловой системы. Сервер прочитает и данные и файл, точно так же, как если бы это была обычная отправка формы. From 987a9312c1206eb13bc57ab228850849dd7a397f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 2 Apr 2022 17:49:43 +0600 Subject: [PATCH 0179/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index aec32328e0..d677471ed4 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -11,7 +11,7 @@ JavaScript совершенно не позволяет настраивать, К примеру, мы не можем создавать объекты, представляющие векторы или матрицы (или достижения или может ещё что-то), складывать их и ожидать в качестве результата "суммированный" объект. Такие архитектурные подвиги автоматически оказываются "за бортом". -Итак, поскольку мы здесь мало что можем сделать, в реальных проектах нет математики с объектами. Когда это происходит, обычно это происходит из-за ошибки в коде. +Итак, поскольку мы здесь мало что можем сделать, в реальных проектах нет математики с объектами. Если это всё же происходит, то обычно это из-за ошибки в коде. В этой главе мы рассмотрим, как объект преобразуется в примитив и как это можно настроить. From 0ff5d8b00b8705410d7f871b4651b848e679787e Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 2 Apr 2022 17:53:14 +0600 Subject: [PATCH 0180/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index d677471ed4..0812102a98 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -17,8 +17,8 @@ JavaScript совершенно не позволяет настраивать, У нас есть две цели: -1. Это позволит нам понять, что происходит в случае ошибок коде, когда такая операция произошла случайно. -2. Есть исключения, когда такие операции возможны и выглядят хорошо. Например, вычитание или сравнение дат (`Date` объекты). Мы встретимся с ними позже. +1. Это позволит нам понять, что происходит в случае ошибок в коде, когда такая операция произошла случайно. +2. Есть исключения, когда такие операции возможны и вполне уместны. Например, вычитание или сравнение дат (`Date` объекты). Мы встретимся с ними позже. ## Правила преобразования From e9b42e98a469a3fa9c9c8d97dc0f7bb306fedf1b Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 2 Apr 2022 17:57:16 +0600 Subject: [PATCH 0181/1128] =?UTF-8?q?placed=20"=D1=91"=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/01-getting-started/4-devtools/article.md | 2 +- 20-css-for-js/5-position/article.md | 2 +- 99-archive/094-regexp-specials/article.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/01-getting-started/4-devtools/article.md b/1-js/01-getting-started/4-devtools/article.md index b986e79d67..495dcfe2a2 100644 --- a/1-js/01-getting-started/4-devtools/article.md +++ b/1-js/01-getting-started/4-devtools/article.md @@ -6,7 +6,7 @@ Для решения задач такого рода в браузер встроены так называемые "Инструменты разработки" (Developer tools или сокращённо — devtools). -Chrome и Firefox снискали любовь подавляющего большинства программистов во многом благодаря своим отменным инструментам разработчика. Остальные браузеры, хотя и оснащены подобными инструментами, но все же зачастую находятся в роли догоняющих и по качеству, и по количеству свойств и особенностей. В общем, почти у всех программистов есть свой "любимый" браузер. Другие используются только для отлова и исправления специфичных "браузерозависимых" ошибок. +Chrome и Firefox снискали любовь подавляющего большинства программистов во многом благодаря своим отменным инструментам разработчика. Остальные браузеры, хотя и оснащены подобными инструментами, но всё же зачастую находятся в роли догоняющих и по качеству, и по количеству свойств и особенностей. В общем, почти у всех программистов есть свой "любимый" браузер. Другие используются только для отлова и исправления специфичных "браузерозависимых" ошибок. Для начала знакомства с этими мощными инструментами давайте выясним, как их открывать, смотреть ошибки и запускать команды JavaScript. diff --git a/20-css-for-js/5-position/article.md b/20-css-for-js/5-position/article.md index a9e5ffb588..d1fc07a71a 100755 --- a/20-css-for-js/5-position/article.md +++ b/20-css-for-js/5-position/article.md @@ -99,7 +99,7 @@ top: 10px;
``` -**Свойства `left/top` не будут работать для `position:static`**. Если их все же поставить, браузер их проигнорирует. Эти свойства предназначены для работы только с позиционированными элементами. +**Свойства `left/top` не будут работать для `position:static`**. Если их всё же поставить, браузер их проигнорирует. Эти свойства предназначены для работы только с позиционированными элементами. ## position: absolute diff --git a/99-archive/094-regexp-specials/article.md b/99-archive/094-regexp-specials/article.md index 5ac233300c..ec7f75b678 100755 --- a/99-archive/094-regexp-specials/article.md +++ b/99-archive/094-regexp-specials/article.md @@ -49,7 +49,7 @@ alert(bbtagit(line)) ## Жадность -Это не совсем особенность, скорее фича, но все же достойная отдельного абзаца. +Это не совсем особенность, скорее фича, но всё же достойная отдельного абзаца. Все регулярные выражения в javascript - жадные. То есть, выражение старается отхватить как можно больший кусок строки. From 65da810eb3455356008f75442e6642111bcd34c0 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 2 Apr 2022 18:01:53 +0600 Subject: [PATCH 0182/1128] smth --- 3-frames-and-windows/01-popup-windows/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3-frames-and-windows/01-popup-windows/article.md b/3-frames-and-windows/01-popup-windows/article.md index a375db0985..3ca49c7be0 100644 --- a/3-frames-and-windows/01-popup-windows/article.md +++ b/3-frames-and-windows/01-popup-windows/article.md @@ -250,7 +250,7 @@ window.onblur = () => window.focus(); Например, мобильный браузер обычно полностью игнорирует такие вызовы метода `window.focus()`. Также фокусировка не работает, когда попап открыт в отдельной вкладке (в отличие от открытия в отдельном окне). -Но все-таки иногда методы фокусировки бывают полезны. Например: +Но всё-таки иногда методы фокусировки бывают полезны. Например: - Когда мы открываем попап, может быть хорошей идеей запустить для него `newWindow.focus()`. Для некоторых комбинаций браузера и операционной системы это устранит неоднозначность – заметит ли пользователь это новое окно. - Если нужно отследить, когда посетитель использует веб-приложение, можно отслеживать `window.onfocus/onblur`. Это позволит ставить на паузу и продолжать выполнение анимаций и других интерактивных действий на странице. При этом важно помнить, что `blur` означает, что окно больше не в фокусе, но пользователь может по-прежнему видеть его. @@ -262,7 +262,7 @@ window.onblur = () => window.focus(); Если мы открываем попап, хорошей практикой будет предупредить пользователя об этом. Иконка открывающегося окошка на ссылке поможет посетителю понять, что происходит и не потерять оба окна из поля зрения. - Новое окно можно открыть с помощью вызова `open(url, name, params)`. Этот метод возвращает ссылку на это новое окно. -- По умолчанию браузеры блокируют вызовы `open`, выполненные не в результате действий пользователя. Обычно браузеры показывают предупреждение, так что пользователь все-таки может разрешить вызов этого метода. +- По умолчанию браузеры блокируют вызовы `open`, выполненные не в результате действий пользователя. Обычно браузеры показывают предупреждение, так что пользователь всё-таки может разрешить вызов этого метода. - Вместо попапа открывается вкладка, если в вызове `open` не указаны его размеры. - У попапа есть доступ к породившему его окну через свойство `window.opener`. - Если основное окно и попап имеют один домен и протокол, то они свободно могут читать и изменять друг друга. В противном случае, они могут только изменять положение друг друга и взаимодействовать [с помощью сообщений](info:cross-window-communication). From 7c925ab4ea69bac6586ff1b903c3272dedb6282a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 2 Apr 2022 22:18:10 +0600 Subject: [PATCH 0183/1128] smth --- 1-js/04-object-basics/09-object-toprimitive/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 0812102a98..2b9cd9a5e2 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -26,9 +26,9 @@ JavaScript совершенно не позволяет настраивать, 1. Все объекты являются `true` в логическом контексте. Существуют лишь их численные и строковые преобразования. 2. Числовое преобразование происходит, когда мы вычитаем объекты или применяем математические функции. Например, объекты `Date` (которые будут рассмотрены в главе ) могут быть вычтены, и результатом `date1 - date2` будет разница во времени между двумя датами. -3. Что касается преобразования строки -- это обычно происходит, когда мы выводим их на экран объект как `alert(obj)` и в подобных контекстах. +3. Что касается преобразований к строке -- это обычно происходит, когда мы выводим на экран объект как `alert(obj)` и в подобных контекстах. -Мы можем тонко настроить преобразование строк и чисел, используя специальные объектные методы. +Мы можем тонко настроить преобразования к строкам и числам, используя специальные объектные методы. Существует три варианта преобразования типов, которые происходят в различных ситуациях. From df30b7a0b743391faf3adfb5c8fe6a91b30986bd Mon Sep 17 00:00:00 2001 From: EvgeniyMukhamedjanov Date: Mon, 4 Apr 2022 14:58:40 +0500 Subject: [PATCH 0184/1128] Update article.md --- 1-js/04-object-basics/07-optional-chaining/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/07-optional-chaining/article.md b/1-js/04-object-basics/07-optional-chaining/article.md index 6ad5be1f9c..f19a896ded 100644 --- a/1-js/04-object-basics/07-optional-chaining/article.md +++ b/1-js/04-object-basics/07-optional-chaining/article.md @@ -105,7 +105,7 @@ alert( user?.address?.street ); // undefined (без ошибки) А вот пример с `document.querySelector`: ```js run -let html = document.querySelector('.elem')?.innerHTML; // будет null, если элемента нет +let html = document.querySelector('.elem')?.innerHTML; // будет undefined, если элемента нет ``` Считывание адреса с помощью `user?.address` работает, даже если объект `user` не существует: From 3b906494e809a5d3721d2c5da33eecd85f57a9e9 Mon Sep 17 00:00:00 2001 From: Zaiko Euheni Date: Wed, 6 Apr 2022 11:18:00 +0300 Subject: [PATCH 0185/1128] feat: add task and solution --- .../2-promise-and-timer-2/solution.md | 32 +++++++++++++++++++ .../2-promise-and-timer-2/task.md | 22 +++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md create mode 100644 2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/task.md diff --git a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md new file mode 100644 index 0000000000..377dd4f129 --- /dev/null +++ b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md @@ -0,0 +1,32 @@ +Вывод в консоли: +1 +7 +3 +5 +2 +6 +4 + +Давайте разберем что здесь происходит. + +Сразу исполняются функции стоящие в стеке первой макрозадачи - главного скрипта. +Вывод в консоль: "1" . + +В второй строке `setTimeout`, который ставит переданный колбэк в очередь макрозадач (macrotask queue) на выполнение.("2") +Далее происходит аналогичная операция в шестой строке.("6") + +Вывод в консоль: "7". +Конец первой макрозадачи. + +Переходим в область микрозадач, происходит выполнение всех микрозадач: +1. Вывод в консоль: "3". +2. Создаётся макрозадача setTimeout, которая ставится в очередь уже имеющеёся макрозадачи.("4") +3. Вывод в консоль: "5". +Стек микрозадач пуст. + +Продолжается выполнение кода из очереди макрозадач: +Вывод в консоль: "2". +Вывод в консоль: "6". +Вывод в консоль: "4". + + diff --git a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/task.md b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/task.md new file mode 100644 index 0000000000..ef61141f81 --- /dev/null +++ b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/task.md @@ -0,0 +1,22 @@ +importance: 5 + +--- + +# Что код выведет в консоли? + +```js +console.log(1); + +setTimeout(() => console.log(2)); + +Promise.resolve().then(() => console.log(3)); + +Promise.resolve().then(() => setTimeout(() => console.log(4))); + +Promise.resolve().then(() => console.log(5)); + +setTimeout(() => console.log(6)); + +console.log(7); +``` + From db839233df17ce99c573364a73166b9ce96f78ab Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 6 Apr 2022 11:45:53 +0300 Subject: [PATCH 0186/1128] minor fixes --- .../2-promise-and-timer-2/solution.md | 66 ++++++++++++------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md index 377dd4f129..1a9b022079 100644 --- a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md +++ b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md @@ -1,32 +1,50 @@ -Вывод в консоли: -1 -7 -3 -5 -2 -6 -4 +Вывод в консоли: 1 7 3 5 2 6 4. -Давайте разберем что здесь происходит. +Задача довольно простая, нужно лишь понимать, как работают очереди микрозадач и макрозадач. -Сразу исполняются функции стоящие в стеке первой макрозадачи - главного скрипта. -Вывод в консоль: "1" . +Давайте разберем, что здесь происходит, по шагам. -В второй строке `setTimeout`, который ставит переданный колбэк в очередь макрозадач (macrotask queue) на выполнение.("2") -Далее происходит аналогичная операция в шестой строке.("6") +```js +console.log(1); +// Первая строка выполняется сразу и выводит `1`. +// Очереди микрозадач и макрозадач на данный момент пусты. -Вывод в консоль: "7". -Конец первой макрозадачи. +setTimeout(() => console.log(2)); +// `setTimeout` ставит переданный колбэк в очередь макрозадач +// - содержимое очереди макрозадач: +// `console.log(2)` -Переходим в область микрозадач, происходит выполнение всех микрозадач: -1. Вывод в консоль: "3". -2. Создаётся макрозадача setTimeout, которая ставится в очередь уже имеющеёся макрозадачи.("4") -3. Вывод в консоль: "5". -Стек микрозадач пуст. +Promise.resolve().then(() => console.log(3)); +// В очередь микрозадач ставится колбэк, выводящий `3` +// - содержимое очереди микрозадач: +// `console.log(3)` -Продолжается выполнение кода из очереди макрозадач: -Вывод в консоль: "2". -Вывод в консоль: "6". -Вывод в консоль: "4". +Promise.resolve().then(() => setTimeout(() => console.log(4))); +// В очередь микрозадач ставится колбэк с `setTimeout` +// - содержимое очереди микрозадач: +// `console.log(3); setTimeout(...4)` +Promise.resolve().then(() => console.log(5)); +// В очередь микрозадач ставится колбэк, выводящий `5` +// - содержимое очереди микрозадач: +// `console.log(3); setTimeout(...4); console.log(5)` +setTimeout(() => console.log(6)); +// `setTimeout` ставит переданный колбэк в очередь макрозадач +// - содержимое очереди макрозадач: +// `console.log(2); console.log(6)` + +console.log(7); +// Тут же выводит `7`. +``` + +Итак, получается, что: + +1. Числа `1` и `7` выводятся сразу же, так как они не используют очереди задач вообще. +2. Далее после окончания основного потока кода срабатывает очередь микрозадач. + - Её содержимое: `console.log(3); setTimeout(...4); console.log(5)`. + - Выведется `3` и `5`, а `setTimeout(() => console.log(4))` поставит в конец очереди макрозадач вывод `4`. + - В очереди макрозадач получается теперь: `console.log(2); console.log(6); console.log(4)`. +3. Очередь микрозадач полностью выполнена, срабатывает очередь макрозадач. Она выведет `2`, `6`, `4`. + +Получается вывод `1 7 3 5 2 6 4`. \ No newline at end of file From cfb531b27837bbfe7ee2d91ffd981b55fb3170db Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 6 Apr 2022 11:46:38 +0300 Subject: [PATCH 0187/1128] minor fixes --- .../{2-promise-and-timer-2 => 2-micro-macro-queue}/solution.md | 0 .../{2-promise-and-timer-2 => 2-micro-macro-queue}/task.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename 2-ui/99-ui-misc/03-event-loop/{2-promise-and-timer-2 => 2-micro-macro-queue}/solution.md (100%) rename 2-ui/99-ui-misc/03-event-loop/{2-promise-and-timer-2 => 2-micro-macro-queue}/task.md (100%) diff --git a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md b/2-ui/99-ui-misc/03-event-loop/2-micro-macro-queue/solution.md similarity index 100% rename from 2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md rename to 2-ui/99-ui-misc/03-event-loop/2-micro-macro-queue/solution.md diff --git a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/task.md b/2-ui/99-ui-misc/03-event-loop/2-micro-macro-queue/task.md similarity index 100% rename from 2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/task.md rename to 2-ui/99-ui-misc/03-event-loop/2-micro-macro-queue/task.md From 4cbffd4c2abd469f3c65e7e3501654dce37c88c5 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Wed, 6 Apr 2022 11:57:02 +0300 Subject: [PATCH 0188/1128] minor fixes --- .../2-promise-and-timer-2/solution.md | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md diff --git a/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md new file mode 100644 index 0000000000..749c88687d --- /dev/null +++ b/2-ui/99-ui-misc/03-event-loop/2-promise-and-timer-2/solution.md @@ -0,0 +1,50 @@ +Вывод в консоли: 1 7 3 5 2 6 4. + +Задача довольно простая, нужно лишь понимать, как работают очереди микрозадач и макрозадач. + +Давайте разберем, что здесь происходит, по шагам. + +```js +console.log(1); +// Первая строка выполняется сразу и выводит `1`. +// Очереди микрозадач и макрозадач на данный момент пусты. + +setTimeout(() => console.log(2)); +// `setTimeout` ставит переданный колбэк в очередь макрозадач +// - содержимое очереди макрозадач: +// `console.log(2)` + +Promise.resolve().then(() => console.log(3)); +// В очередь микрозадач ставится колбэк, выводящий `3` +// - содержимое очереди микрозадач: +// `console.log(3)` + +Promise.resolve().then(() => setTimeout(() => console.log(4))); +// В очередь микрозадач ставится колбэк с `setTimeout(...4)` +// - содержимое очереди микрозадач: +// `console.log(3); setTimeout(...4)` + +Promise.resolve().then(() => console.log(5)); +// В очередь микрозадач ставится колбэк, выводящий `5` +// - содержимое очереди микрозадач: +// `console.log(3); setTimeout(...4); console.log(5)` + +setTimeout(() => console.log(6)); +// `setTimeout` ставит переданный колбэк в очередь макрозадач +// - содержимое очереди макрозадач: +// `console.log(2); console.log(6)` + +console.log(7); +// Тут же выводит `7`. +``` + +Итак, получается, что: + +1. Числа `1` и `7` выводятся сразу же, так как они не используют очереди задач вообще. +2. Далее после окончания основного потока кода срабатывает очередь микрозадач. + - Её содержимое: `console.log(3); setTimeout(...4); console.log(5)`. + - Выведется `3` и `5`, а `setTimeout(() => console.log(4))` поставит команду `console.log(4)` в конец очереди макрозадач. + - В очереди макрозадач теперь: `console.log(2); console.log(6); console.log(4)`. +3. Когда очередь микрозадач полностью выполнена, срабатывает очередь макрозадач. Она выведет `2`, `6`, `4`. + +Итоговый вывод: `1 7 3 5 2 6 4`. \ No newline at end of file From 3a9eb06c371244892f6274840b43c4d21ccb55c1 Mon Sep 17 00:00:00 2001 From: Roman Timashoff <83927854+timashoff@users.noreply.github.com> Date: Fri, 8 Apr 2022 16:11:13 +0600 Subject: [PATCH 0189/1128] =?UTF-8?q?=D0=BF=D0=BE=D0=94=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit исправлена небольшая опечатка в слове "походит" на "поДходит" --- 6-data-storage/01-cookie/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-data-storage/01-cookie/article.md b/6-data-storage/01-cookie/article.md index c676526c21..023da02e82 100644 --- a/6-data-storage/01-cookie/article.md +++ b/6-data-storage/01-cookie/article.md @@ -246,7 +246,7 @@ document.cookie = "user=John; secure"; Но что-то более сложное, например, сетевой запрос с другого сайта или отправка формы, теряет куки. -Если это вам походит, то добавление `samesite=lax`, скорее всего, не испортит впечатление пользователей от работы с сайтом и добавит защиту. +Если это вам подходит, то добавление `samesite=lax`, скорее всего, не испортит впечатление пользователей от работы с сайтом и добавит защиту. В целом, `samesite` отличная настройка, но у неё есть важный недостаток: - `samesite` игнорируется (не поддерживается) старыми браузерами, выпущенными до 2017 года и ранее. From e0cedbe112e34c792d412c79cdaf0b5c8b1d6030 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 10 Apr 2022 15:26:41 +0600 Subject: [PATCH 0190/1128] Update article.md --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 2b9cd9a5e2..3e7d3b785b 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -63,7 +63,7 @@ JavaScript совершенно не позволяет настраивать, `"default"` : Происходит редко, когда оператор "не уверен", какой тип ожидать. - Например, бинарный плюс `+` может работать как со строками (объединяя их), так и с числами (складывая их), поэтому подойдут и строки, и числа. Таким образом, если двоичный плюс получает объект в качестве аргумента, он использует хинт `"default"` для его преобразования. + Например, бинарный плюс `+` может работать как со строками (объединяя их), так и с числами (складывая их), поэтому подойдут и строки, и числа. Таким образом, если бинарный плюс получает объект в качестве аргумента, он использует хинт `"default"` для его преобразования. Кроме того, если объект сравнивается с помощью `==` со строкой, числом или символом, также неясно, какое преобразование следует выполнить, поэтому используется хинт "default". From 340b4674b32d81bbc15b32d7b8caa948272099e3 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 10 Apr 2022 15:50:13 +0600 Subject: [PATCH 0191/1128] Update article.md --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 3e7d3b785b..17a6c6dcd2 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -95,7 +95,7 @@ JavaScript совершенно не позволяет настраивать, ## Symbol.toPrimitive -Давайте начнём с первого метода. Есть встроенный символ с именем `Symbol.toPrimitive`, который следует использовать для обозначения метода преобразования, например: +Давайте начнём с первого метода. Есть встроенный символ с именем `Symbol.toPrimitive`, который следует использовать для обозначения метода преобразования, вот так: ```js obj[Symbol.toPrimitive] = function(hint) { From 65ea852d444b81c34fc1ca74a20199bf66784dfa Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 12 Apr 2022 00:20:16 +0600 Subject: [PATCH 0192/1128] Update article.md --- 1-js/04-object-basics/09-object-toprimitive/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 17a6c6dcd2..9b6c2ef1f3 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -136,7 +136,7 @@ alert(user + 500); // hint: default -> 1500 - Для хинта "string": `toString`, а если он не существует, то `valueOf` (таким образом `toString` имеет приоритет для преобразования строк). - Для других хинтов: `valueOf`, а если он не существует, то `toString` (таким образом `valueOf` имеет приоритет для математических операций). -Методы `toString` и `valueOf` берут своё начало с древних времён. Это не символы (символов ещё тогда не было), а скорее просто "обычные" методы со строковыми именами. Они предоставляют альтернативный "старомодный" способ реализации преобразования. +Методы `toString` и `valueOf` берут своё начало с древних времён. Это не символы (символов тогда ещё не было), а скорее просто "обычные" методы со строковыми именами. Они предоставляют альтернативный "старомодный" способ реализации преобразования. Эти методы должны возвращать примитивное значение. Если `toString` или `valueOf` возвращает объект, то он игнорируется (так же, как если бы метода не было). @@ -154,7 +154,7 @@ alert(user); // [object Object] alert(user.valueOf() === user); // true ``` -Таким образом, если мы попытаемся использовать объект в качестве строки, как например в 'alert' или вроде того, то по умолчанию мы увидим `[object Object]`. +Таким образом, если мы попытаемся использовать объект в качестве строки, как например в `alert` или вроде того, то по умолчанию мы увидим `[object Object]`. Значение по умолчанию `valueOf` упоминается здесь только для полноты картины, чтобы избежать какой-либо путаницы. Как вы можете видеть, он возвращает сам объект и поэтому игнорируется. Не спрашивайте меня почему, это по историческим причинам. Так что мы можем предположить, что его не существует. From 9cf70e91b7737e2dad2220e6cff3a9e88eb114ee Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 12 Apr 2022 00:36:58 +0600 Subject: [PATCH 0193/1128] Update article.md --- 1-js/05-data-types/03-string/article.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/1-js/05-data-types/03-string/article.md b/1-js/05-data-types/03-string/article.md index b0396ab408..87671b7968 100644 --- a/1-js/05-data-types/03-string/article.md +++ b/1-js/05-data-types/03-string/article.md @@ -90,14 +90,9 @@ alert(str1 == str2); // true Примеры с Юникодом: ```js run -// © -alert( "\u00A9" ); - -// Длинные юникодные коды -// 佫, редкий китайский иероглиф -alert( "\u{20331}" ); -// 😍, лицо с улыбкой и глазами в форме сердец -alert( "\u{1F60D}" ); +alert( "\u00A9" ); // © +alert( "\u{20331}" ); // 佫, редкий китайский иероглиф (длинный юникод) +alert( "\u{1F60D}" ); // 😍, символ улыбающегося лица (еще один длинный юникод) ``` Все спецсимволы начинаются с обратного слеша, `\` — так называемого "символа экранирования". From e9142a623b6d8aec6a3d35de8dfcc3d65d3a3211 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 12 Apr 2022 00:49:44 +0600 Subject: [PATCH 0194/1128] Update article.md --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 9b6c2ef1f3..de96bc6bcd 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -238,7 +238,7 @@ let obj = { alert(obj * 2); // 4, объект был преобразован к примитиву "2", затем умножение сделало его числом ``` -1. 1. Умножение `obj * 2` сначала преобразует объект в примитив (это строка `"2"`). +1. Умножение `obj * 2` сначала преобразует объект в примитив (это строка `"2"`). 2. Затем `"2" * 2` становится `2 * 2` (строка преобразуется в число). А вот, к примеру, бинарный плюс в подобной ситуации соединил бы строки, так как он совсем не брезгует строк: From 9c948ee12504dc695f551619bf3323c41ad77880 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 12 Apr 2022 00:54:42 +0600 Subject: [PATCH 0195/1128] Update article.md --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index de96bc6bcd..0ae60b58a0 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -272,6 +272,6 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити 3. В случае, если хинт равен `"number"` или `"default"` - происходит попытка вызвать `obj.valueOf()` и `obj.toString()`, смотря что есть. -На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований строк, который должен возвращать удобочитаемое представление объекта для целей ведения логирования или отладки. +На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований к строке, который должен возвращать удобочитаемое представление объекта для целей ведения логирования или отладки. Что касается математических операций, JavaScript не предоставляет способа "переопределить" их с помощью методов, поэтому в реальных проектах они редко используются на объектах. From 499bcec117f7437a78ebe0beb3f1d24585108a56 Mon Sep 17 00:00:00 2001 From: Alexey Gubanich Date: Tue, 12 Apr 2022 12:07:18 +0300 Subject: [PATCH 0196/1128] Update article.md --- 1-js/01-getting-started/1-intro/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/01-getting-started/1-intro/article.md b/1-js/01-getting-started/1-intro/article.md index 411f2de6c0..809783d990 100644 --- a/1-js/01-getting-started/1-intro/article.md +++ b/1-js/01-getting-started/1-intro/article.md @@ -24,11 +24,11 @@ Разные движки имеют разные "кодовые имена". Например: -- [V8](https://ru.wikipedia.org/wiki/V8_(%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript)) -- в Chrome и Opera. +- [V8](https://ru.wikipedia.org/wiki/V8_(%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript)) -- в Chrome, Opera и Edge. - [SpiderMonkey](https://ru.wikipedia.org/wiki/SpiderMonkey) -- в Firefox. -- ...Ещё есть "Trident" и "Chakra" для разных версий IE, "ChakraCore" для Microsoft Edge, "Nitro" и "SquirrelFish" для Safari и т.д. +- ...Ещё есть "Chakra" для IE, "JavaScriptCore", "Nitro" и "SquirrelFish" для Safari и т.д. -Эти названия полезно знать, так как они часто используются в статьях для разработчиков. Мы тоже будем их использовать. Например, если "функциональность X поддерживается V8", тогда "Х", скорее всего, работает в Chrome и Opera. +Эти названия полезно знать, так как они часто используются в статьях для разработчиков. Мы тоже будем их использовать. Например, если "функциональность X поддерживается V8", тогда "Х", скорее всего, работает в Chrome, Opera и Edge. ```smart header="Как работают движки?" From 079185d799bc385211794150dff88856436c84a9 Mon Sep 17 00:00:00 2001 From: Roman Timashoff <83927854+timashoff@users.noreply.github.com> Date: Wed, 13 Apr 2022 10:38:06 +0600 Subject: [PATCH 0197/1128] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20mdn?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit старая ссылка в разделе побитового НЕ ведет на page not found. новая ссылка корректна, но указывает только на английский источник (перевода этой статьи на ru нет на mdn) --- 1-js/05-data-types/03-string/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/03-string/article.md b/1-js/05-data-types/03-string/article.md index b0396ab408..8a3ebf282b 100644 --- a/1-js/05-data-types/03-string/article.md +++ b/1-js/05-data-types/03-string/article.md @@ -313,7 +313,7 @@ if (str.indexOf("Widget") != -1) { ``` #### Трюк с побитовым НЕ -Существует старый трюк с использованием [побитового оператора НЕ](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#.7E_.28Bitwise_NOT.29) — `~`. Он преобразует число в 32-разрядное целое со знаком (signed 32-bit integer). Дробная часть, в случае, если она присутствует, отбрасывается. Затем все биты числа инвертируются. +Существует старый трюк с использованием [побитового оператора НЕ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT) — `~`. Он преобразует число в 32-разрядное целое со знаком (signed 32-bit integer). Дробная часть, в случае, если она присутствует, отбрасывается. Затем все биты числа инвертируются. На практике это означает простую вещь: для 32-разрядных целых чисел значение `~n` равно `-(n+1)`. From 4465ae6129cbada9d42a2c066ca68bde4b711a8a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 15 Apr 2022 00:48:24 +0600 Subject: [PATCH 0198/1128] Update article.md --- 1-js/02-first-steps/17-arrow-functions-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/17-arrow-functions-basics/article.md b/1-js/02-first-steps/17-arrow-functions-basics/article.md index 85bb940889..bab904dd52 100644 --- a/1-js/02-first-steps/17-arrow-functions-basics/article.md +++ b/1-js/02-first-steps/17-arrow-functions-basics/article.md @@ -63,7 +63,7 @@ alert( sum(1, 2) ); // 3 let age = prompt("Сколько Вам лет?", 18); let welcome = (age < 18) ? - () => alert('Привет') : + () => alert('Привет!') : () => alert("Здравствуйте!"); welcome(); From 3e0903604f432432e23e914007c8aeea5f9c8e68 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 15 Apr 2022 01:02:37 +0600 Subject: [PATCH 0199/1128] add missing line breaks --- 1-js/04-object-basics/08-symbol/article.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/1-js/04-object-basics/08-symbol/article.md b/1-js/04-object-basics/08-symbol/article.md index 9d40466541..b2f45cf237 100644 --- a/1-js/04-object-basics/08-symbol/article.md +++ b/1-js/04-object-basics/08-symbol/article.md @@ -53,6 +53,7 @@ alert(id); // TypeError: Cannot convert a Symbol value to a string Это -- языковая "защита" от путаницы, ведь строки и символы -- принципиально разные типы данных и не должны неконтролируемо преобразовываться друг в друга. Если же мы действительно хотим вывести символ с помощью `alert`, то необходимо явно преобразовать его с помощью метода `.toString()`, вот так: + ```js run let id = Symbol("id"); *!* @@ -61,6 +62,7 @@ alert(id.toString()); // Symbol(id), теперь работает ``` Или мы можем обратиться к свойству `symbol.description`, чтобы вывести только описание: + ```js run let id = Symbol("id"); *!* @@ -269,6 +271,7 @@ alert( localSymbol.description ); // name Символы имеют два основных варианта использования: 1. "Скрытые" свойства объектов. + Если мы хотим добавить свойство в объект, который "принадлежит" другому скрипту или библиотеке, мы можем создать символ и использовать его в качестве ключа. Символьное свойство не появится в `for..in`, так что оно не будет нечаянно обработано вместе с другими. Также оно не будет модифицировано прямым обращением, так как другой скрипт не знает о нашем символе. Таким образом, свойство будет защищено от случайной перезаписи или использования. Так что, используя символьные свойства, мы можем спрятать что-то нужное нам, но что другие видеть не должны. From 0c5d906b170d7886c0290e827091a716517f76f8 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 15 Apr 2022 02:13:36 +0600 Subject: [PATCH 0200/1128] add information about `at` method --- 1-js/05-data-types/04-array/article.md | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 6306a6a1ce..52041aeba8 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -91,6 +91,38 @@ let fruits = [ "Висячая запятая" упрощает процесс добавления/удаления элементов, так как все строки становятся идентичными. ```` +## Получение последних элементов при помощи "at" + +[recent browser="new"] + +Допустим, нам нужен последний элемент массива. + +Некоторые языки программирования позволяют использовать отрицательные индексы для той же цели, например `fruits[-1]`. + +Тем не менее в JavaScript это не сработает. Результат будет `undefined`. + +Мы можем явно вычислить индекс последнего элемента, а затем получить к нему доступ, используя `fruits[fruits.length - 1]`: + +```js run +let fruits = ["Apple", "Orange", "Plum"]; +alert( fruits[fruits.length-1] ); // Plum +``` + +Немного громоздко, не так ли? Нам нужно дважды написать имя переменной. + +К счастью, есть более короткий синтаксис: `fruits.at (-1)`: + +```js run +let fruits = ["Apple", "Orange", "Plum"]; +// то же самое, что и fruits[fruits.length-1] +alert( fruits.at(-1) ); // Plum +``` + +Другими словами, `arr.at(i)`: + +- это ровно то же самое, что и `arr[i]`, если `i >= 0`. +- для отрицательных значений `i`, он отступает от конца массива. + ## Методы pop/push, shift/unshift [Очередь](https://ru.wikipedia.org/wiki/Очередь_(программирование)) – один из самых распространённых вариантов применения массива. В области компьютерных наук так называется упорядоченная коллекция элементов, поддерживающая два вида операций: @@ -133,6 +165,8 @@ let fruits = [ alert( fruits ); // Яблоко, Апельсин ``` + + И `fruits.pop()` и `fruits.at(-1)` возвращают последний элемент массива, но `fruits.pop()` также изменяет массив, удаляя его. `push` : Добавляет элемент в конец массива: From 988e0401258ec07b38f39d118ccec2b8a85771b5 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Fri, 15 Apr 2022 13:46:16 +0300 Subject: [PATCH 0201/1128] minor fixes --- 1-js/05-data-types/04-array/article.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 52041aeba8..7dd5568a7c 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -2,7 +2,7 @@ Объекты позволяют хранить данные со строковыми ключами. Это замечательно. -Но довольно часто мы понимаем, что нам необходима *упорядоченная коллекция* данных, в которой присутствуют 1-й, 2-й, 3-й элементы и т.д. Например, она понадобится нам для хранения списка чего-либо: пользователей, товаров, элементов HTML и т.д. +Но довольно часто мы понимаем, что нам необходима *упорядоченная коллекция* данных, в которой присутствуют 1-й, 2-й, 3-й элементы и т.д. Например, она понадобится нам для хранения списка чего-либо: пользователей, товаров, элементов HTML и т.д. В этом случае использовать объект неудобно, так как он не предоставляет методов управления порядком элементов. Мы не можем вставить новое свойство "между" уже существующими. Объекты просто не предназначены для этих целей. @@ -97,11 +97,11 @@ let fruits = [ Допустим, нам нужен последний элемент массива. -Некоторые языки программирования позволяют использовать отрицательные индексы для той же цели, например `fruits[-1]`. +Некоторые языки программирования позволяют использовать отрицательные индексы для той же цели, как-то так: `fruits[-1]`. -Тем не менее в JavaScript это не сработает. Результат будет `undefined`. +Однако, в JavaScript такая запись не сработает. Её результатом будет `undefined`, поскольку индекс в квадратных скобках понимается буквально. -Мы можем явно вычислить индекс последнего элемента, а затем получить к нему доступ, используя `fruits[fruits.length - 1]`: +Мы можем явно вычислить индекс последнего элемента, а затем получить к нему доступ вот так: `fruits[fruits.length - 1]`. ```js run let fruits = ["Apple", "Orange", "Plum"]; @@ -165,7 +165,7 @@ alert( fruits.at(-1) ); // Plum alert( fruits ); // Яблоко, Апельсин ``` - + И `fruits.pop()` и `fruits.at(-1)` возвращают последний элемент массива, но `fruits.pop()` также изменяет массив, удаляя его. `push` @@ -205,7 +205,7 @@ alert( fruits.at(-1) ); // Plum alert( fruits ); // Яблоко, Апельсин, Груша ``` -Методы `push` и `unshift` могут добавлять сразу несколько элементов: +Методы `push` и `unshift` могут добавлять сразу несколько элементов: ```js run let fruits = ["Яблоко"]; @@ -352,7 +352,7 @@ for (let key in arr) { 2. Цикл `for..in` оптимизирован под произвольные объекты, не массивы, и поэтому в 10-100 раз медленнее. Увеличение скорости выполнения может иметь значение только при возникновении узких мест. Но мы всё же должны представлять разницу. -В общем, не следует использовать цикл `for..in` для массивов. +В общем, не следует использовать цикл `for..in` для массивов. ## Немного о "length" @@ -477,12 +477,12 @@ alert( "1,2" + 1 ); // "1,21" - Свойство `length` отражает длину массива или, если точнее, его последний цифровой индекс плюс один. Длина корректируется автоматически методами массива. - Если мы уменьшаем `length` вручную, массив укорачивается. -Мы можем использовать массив как двустороннюю очередь, используя следующие операции: +Мы можем использовать массив как двустороннюю очередь, используя следующие операции: - `push(...items)`добавляет `items` в конец массива. - `pop()` удаляет элемент в конце массива и возвращает его. - `shift()` удаляет элемент в начале массива и возвращает его. -- `unshift(...items)` добавляет `items` в начало массива. +- `unshift(...items)` добавляет `items` в начало массива. Чтобы пройтись по элементам массива: - `for (let i=0; i Date: Fri, 15 Apr 2022 13:47:24 +0300 Subject: [PATCH 0202/1128] closes #1583 --- 1-js/02-first-steps/15-function-basics/article.md | 1 + 1 file changed, 1 insertion(+) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index f17fea9e39..e9b301c5f7 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -247,6 +247,7 @@ function showMessage(from, text) { ```js function showMessage(from, text) { // Если значение text ложно, тогда присвоить параметру text значение по умолчанию + // заметим, что при этом пустая строка text === "" будет также считаться отсутствующим значением text = text || 'текст не добавлен'; ... } From 869d09499ef3ab326619c038ac671c84be7c7be3 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Fri, 15 Apr 2022 23:48:08 +0300 Subject: [PATCH 0203/1128] minor fixes --- .../09-object-toprimitive/article.md | 76 ++++++++++--------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 0ae60b58a0..c17538dd0a 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -7,11 +7,11 @@ JavaScript совершенно не позволяет настраивать, В случае таких операций, объекты автоматически преобразуются в примитивы, затем выполняется сама операция над этими примитивами, и на выходе мы получим примитивное значение. -Это важное ограничение, результатом `obj1 + obj2` не может быть другой объект! +Это важное ограничение: результатом `obj1 + obj2` (или другой математической операции) не может быть другой объект! -К примеру, мы не можем создавать объекты, представляющие векторы или матрицы (или достижения или может ещё что-то), складывать их и ожидать в качестве результата "суммированный" объект. Такие архитектурные подвиги автоматически оказываются "за бортом". +К примеру, мы не можем создавать объекты, представляющие векторы или матрицы (или достижения или может ещё что-то), складывать их и ожидать в качестве результата "суммированный" объект. Такие архитектурные ходы автоматически оказываются "за бортом". -Итак, поскольку мы здесь мало что можем сделать, в реальных проектах нет математики с объектами. Если это всё же происходит, то обычно это из-за ошибки в коде. +Итак, поскольку мы технически здесь мало что можем сделать, в реальных проектах нет математики с объектами. Если она всё же происходит, то за редким исключением, это из-за ошибок в коде. В этой главе мы рассмотрим, как объект преобразуется в примитив и как это можно настроить. @@ -22,17 +22,21 @@ JavaScript совершенно не позволяет настраивать, ## Правила преобразования -В главе мы рассмотрели правила для числовых, строковых и логических преобразований примитивов. Но мы оставили пробел для объектов. Но теперь, когда мы уже знаем о методах и символах, пришло время заполнить этот пробел. +В главе мы рассмотрели правила для числовых, строковых и логических преобразований примитивов. Но мы оставили пробел для объектов. Теперь, когда мы уже знаем о методах и символах, пришло время заполнить этот пробел. -1. Все объекты являются `true` в логическом контексте. Существуют лишь их численные и строковые преобразования. +1. Не существует преобразования к логическому значению. В логическом контексте все объекты являются `true`, всё просто. Существует лишь их числовое и строковое преобразование. 2. Числовое преобразование происходит, когда мы вычитаем объекты или применяем математические функции. Например, объекты `Date` (которые будут рассмотрены в главе ) могут быть вычтены, и результатом `date1 - date2` будет разница во времени между двумя датами. -3. Что касается преобразований к строке -- это обычно происходит, когда мы выводим на экран объект как `alert(obj)` и в подобных контекстах. +3. Что касается преобразований к строке -- оно обычно происходит, когда мы выводим на экран объект при помощи `alert(obj)` и в подобных контекстах. -Мы можем тонко настроить преобразования к строкам и числам, используя специальные объектные методы. +Мы можем реализовать свои преобразования к строкам и числам, используя специальные объектные методы. -Существует три варианта преобразования типов, которые происходят в различных ситуациях. +Теперь давайте углубимся в детали. Это единственный путь для того, чтобы разобраться в нюансах этой темы. -Они называются "хинтами", как описано в [спецификации](https://tc39.github.io/ecma262/#sec-toprimitive): +## Хинты + +Как JavaScript решает, какое преобразование применить? + +Существует три варианта преобразования типов, которые происходят в различных ситуациях. Они называются "хинтами", как описано в [спецификации](https://tc39.github.io/ecma262/#sec-toprimitive): `"string"` : Для преобразования объекта к строке, когда мы выполняем операцию над объектом, которая ожидает строку, например `alert`: @@ -60,12 +64,14 @@ JavaScript совершенно не позволяет настраивать, let greater = user1 > user2; ``` + Большинство встроенных математических функций также включают в себя такое преобразование. + `"default"` : Происходит редко, когда оператор "не уверен", какой тип ожидать. - Например, бинарный плюс `+` может работать как со строками (объединяя их), так и с числами (складывая их), поэтому подойдут и строки, и числа. Таким образом, если бинарный плюс получает объект в качестве аргумента, он использует хинт `"default"` для его преобразования. + Например, бинарный плюс `+` может работать как со строками (объединяя их в одну), так и с числами (складывая их). Поэтому, если бинарный плюс получает объект в качестве аргумента, он использует хинт `"default"` для его преобразования. - Кроме того, если объект сравнивается с помощью `==` со строкой, числом или символом, также неясно, какое преобразование следует выполнить, поэтому используется хинт "default". + Также, если объект сравнивается с помощью `==` со строкой, числом или символом, тоже неясно, какое преобразование следует выполнить, поэтому используется хинт `"default"`. ```js // бинарный плюс использует хинт "default" @@ -75,23 +81,19 @@ JavaScript совершенно не позволяет настраивать, if (user == 1) { ... }; ``` - Операторы сравнения больше/меньше, такие как `<` `>`, также могут работать как со строками, так и с числами. Тем не менее, по историческим причинам, они используют хинт `"number"`, а не `"default"`. + Операторы сравнения больше/меньше, такие как `<` `>`, также могут работать как со строками, так и с числами. Тем не менее, по историческим причинам, они используют хинт `"number"`, а не `"default"`. - Впрочем на практике, нам не нужно запоминать эти специфические детали, потому что все встроенные объекты, за исключением одного случая (объект `Date`, который мы рассмотрим позже), реализуют `"default"` преобразование тем же способом, что и `"number"`. И мы можем поступать так же. +Впрочем на практике, всё немного проще. -```smart header="Нет `\"логического\"` хинта" -Обратите внимание -- есть только три хинта. Это очень просто. +Все встроенные объекты, за исключением одного (объект `Date`, который мы рассмотрим позже), реализуют `"default"` преобразование тем же способом, что и `"number"`. И нам следует поступать так же. -Не существует хинта со значением "boolean" (все объекты являются `true` в логическом контексте) или каких-либо ещё. И если мы будем относиться к "default" и "number" одинаково, как это делают большинство встроенных объектов, то тогда будет только два преобразования. -``` +**Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих метода обёекта:** -**Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих объектных метода:** - -1. Вызов `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, -2. В случае, если хинт равен `"string"` - - пробует `obj.toString()` и `obj.valueOf()`, независимо от того, что существует. -3. В случае, если хинт равен `"number"` или `"default"` - - пробует `obj.valueOf()` и `obj.toString()`, независимо от того, что существует. +1. Вызвать `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, +2. Иначе. если хинт равен `"string"` + - попробовать вызвать `obj.toString()` или `obj.valueOf()`, смотря какой из них существует. +3. Иначе, если хинт равен `"number"` или `"default"` + - попробовать вызвать `obj.valueOf()` или `obj.toString()`, смотря какой из них существует. ## Symbol.toPrimitive @@ -107,7 +109,7 @@ obj[Symbol.toPrimitive] = function(hint) { Если метод `Symbol.toPrimitive` существует, он используется для всех хинтов, и больше никаких методов не требуется. -Например, здесь объект `user` реализует это: +Например, здесь объект `user` реализует его: ```js run let user = { @@ -126,15 +128,15 @@ alert(+user); // hint: number -> 1000 alert(user + 500); // hint: default -> 1500 ``` -Как мы можем видеть из кода, `user` становится либо самодостаточной строкой или денежной суммой в зависимости от преобразования. Один метод `user[Symbol.toPrimitive]` обрабатывает все случаи преобразования. +Как мы можем видеть из кода, `user` становится либо строкой со своим описанием, либо суммой денег в зависимости от преобразования. Единый метод `user[Symbol.toPrimitive]` обрабатывает все случаи преобразования. ## toString/valueOf Если нет `Symbol.toPrimitive`, тогда JavaScript пытается найти методы `toString` и `valueOf`: -- Для хинта "string": `toString`, а если он не существует, то `valueOf` (таким образом `toString` имеет приоритет для преобразования строк). -- Для других хинтов: `valueOf`, а если он не существует, то `toString` (таким образом `valueOf` имеет приоритет для математических операций). +- Для хинта `"string"`: вызвать метод `toString`, а если он не существует, то `valueOf` (таким образом, `toString` имеет приоритет при строковом преобразовании). +- Для других хинтов: `valueOf`, а если он не существует, то `toString` (таким образом, `valueOf` имеет приоритет для математических операций). Методы `toString` и `valueOf` берут своё начало с древних времён. Это не символы (символов тогда ещё не было), а скорее просто "обычные" методы со строковыми именами. Они предоставляют альтернативный "старомодный" способ реализации преобразования. @@ -207,23 +209,23 @@ alert(user + 500); // toString -> John500 Важная вещь, которую следует знать обо всех методах преобразования примитивов, заключается в том, что они не обязательно возвращают подсказанный хинтом примитив. -Нет никакого контроля над тем, вернёт ли `toString` именно строку, или чтобы метод `Symbol.toPrimitive` возращал число для хинта `"number"`. +Нет никакого контроля над тем, вернёт ли `toString` именно строку, или чтобы метод `Symbol.toPrimitive` возращал именно число для хинта `"number"`. Единственное обязательное условие: эти методы должны возвращать примитив, а не объект. ```smart header="Историческая справка" По историческим причинам, если `toString` или `valueOf` вернёт объект, то ошибки не будет, но такое значение будет проигнорировано (как если бы метода вообще не существовало). Это всё потому, что в древние времена в JavaScript не было хорошей концепции "ошибки". -К примеру `Symbol.toPrimitive`, напротив, *обязан* возвращать примитив, иначе будет ошибка. +А вот `Symbol.toPrimitive` уже "четче", этот метод *обязан* возвращать примитив, иначе будет ошибка. ``` ## Дальнейшие преобразования Как мы уже знаем, многие операторы и функции выполняют преобразования типов, например, умножение `*` преобразует операнды в числа. -Если мы передаём объект в качестве аргумента, то на это есть два этапа: +Если мы передаём объект в качестве аргумента, то в вычислениях будут две стадии: 1. Объект преобразуется в примитив (с использованием правил, описанных выше). -2. Если полученный примитив не имеет подходящего типа, он преобразуется. +2. Если необходимо для дальнейших вычислений, этот примитив преобразуется дальше. Например: @@ -257,12 +259,12 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити Преобразование объекта в примитив вызывается автоматически многими встроенными функциями и операторами, которые ожидают примитив в качестве значения. -Существует всего 3 типа (хинтов) для этого: +Существует всего 3 типа (хинта) для этого: - `"string"` (для `alert` и других операций, которым нужна строка) - `"number"` (для математических операций) -- `"default"` (для нескольких других операторов) +- `"default"` (для некоторых других операторов, обычно объекты реализуют его как `"number"`) -Спецификация явно описывает, какой оператор использует тот или иной хинт. И существует совсем немного операторов, которые "не знают, чего ожидать" и используют хинт `"default"`. Обычно для встроенных объектов хинт `"default"` обрабатывается так же, как `"number"`, поэтому на практике последние два часто сливаются воедино. +Спецификация явно описывает дл каждого оператора, какой ему следует использовать хинт. Алгоритм преобразования таков: @@ -272,6 +274,6 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити 3. В случае, если хинт равен `"number"` или `"default"` - происходит попытка вызвать `obj.valueOf()` и `obj.toString()`, смотря что есть. -На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований к строке, который должен возвращать удобочитаемое представление объекта для целей ведения логирования или отладки. +Все эти методы должны возвращать примитив (если определены). -Что касается математических операций, JavaScript не предоставляет способа "переопределить" их с помощью методов, поэтому в реальных проектах они редко используются на объектах. +На практике часто бывает достаточно реализовать только `obj.toString()` в качестве универсального метода для преобразований к строке, который должен возвращать удобочитаемое представление объекта для целей логирования или отладки. From 6500334fe4a1a9628b842e81d6e62e421cb0143d Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sat, 16 Apr 2022 08:43:44 +0300 Subject: [PATCH 0204/1128] minor fixes --- .../12-nullish-coalescing-operator/article.md | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md index 1b63671fa7..d87b14c37f 100644 --- a/1-js/02-first-steps/12-nullish-coalescing-operator/article.md +++ b/1-js/02-first-steps/12-nullish-coalescing-operator/article.md @@ -4,15 +4,15 @@ Оператор нулевого слияния представляет собой два вопросительных знака `??`. -Так как он рассматривает `null` и `undefined` аналогично, мы введём специальный термин. Мы будем говорить, что выражение "определено", только если оно не равняется ни `null`, ни `undefined`. +Так как он обрабатывает `null` и `undefined` одинаковым образом, то для этой статьи мы введём специальный термин. Для краткости будем говорить, что значение "определено", если оно не равняется ни `null`, ни `undefined`. Результат выражения `a ?? b` будет следующим: -- `a`, если значение `a` определено, -- `b`, если значение `a` не определено. +- если `a` определено, то `a`, +- если `a` не определено, то `b`. -То есть оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй. +Иначе говоря, оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй. -Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно "определённое". +Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно, которое "определено". Вот как можно переписать выражение `result = a ?? b`, используя уже знакомые нам операторы: @@ -20,31 +20,31 @@ result = (a !== null && a !== undefined) ? a : b; ``` -Теперь должно быть абсолютно ясно, что `??` делает. Давайте посмотрим, где это может быть полезно. +Теперь должно быть абсолютно ясно, что делает `??`. Давайте посмотрим, где это может быть полезно. -Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной. +Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально не с переменной. -Например, здесь мы отобразим `user`, если он определен, в противном случае `Аноним`: +Например, здесь мы отобразим `user`, если её значение не `null/undefined`, в противном случае `Аноним`: ```js run let user; -alert(user ?? "Аноним"); // Аноним (user не определен) +alert(user ?? "Аноним"); // Аноним (user не существует) ``` -Вот пример `user`, с присвоенным именем: +А вот пример, когда `user` присвоено значение: ```js run let user = "Иван"; -alert(user ?? "Аноним"); // Иван (user определен) +alert(user ?? "Аноним"); // Иван (user существует) ``` Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое значение из списка, которое не является `null/undefined`. -Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть не определены, если пользователь решил не вводить значение. +Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут не существовать, если пользователь решил не вводить соответствующие значение. -Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Анонимный", если все они не определены. +Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Аноним", если все они `null/undefined`. Для этого воспользуемся оператором `??`: @@ -53,7 +53,7 @@ let firstName = null; let lastName = null; let nickName = "Суперкодер"; -// показывает первое определённое значение: +// показывает первое значение, которое определено: *!* alert(firstName ?? lastName ?? nickName ?? "Аноним"); // Суперкодер */!* @@ -76,19 +76,19 @@ alert(firstName || lastName || nickName || "Аноним"); // Суперкод */!* ``` -Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала существования JavaScript, поэтому разработчики долгое время использовали его для таких целей. +Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала в JavaScript, поэтому разработчики долгое время использовали его для таких целей. -С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`. +С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` - как раз потому, что многие были недовольны оператором `||`. Важное различие между ними заключается в том, что: - `||` возвращает первое *истинное* значение. - `??` возвращает первое *определённое* значение. -Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковые, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент. +Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковы, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент. Однако на практике часто требуется использовать значение по умолчанию только тогда, когда переменная является `null/undefined`. Ведь именно тогда значение действительно неизвестно/не определено. -Например, рассмотрим следующий пример: +Рассмотрим следующий пример: ```js run let height = 0; @@ -97,12 +97,12 @@ alert(height || 100); // 100 alert(height ?? 100); // 0 ``` -- `height || 100` проверяет `height` на наличие ложного значения, оно равно `0`, так что это действительно false. +- `height || 100` проверяет `height` на ложное значение, оно равно `0`, да, ложное. - поэтому результатом `||` является второй аргумент, т.е. `100`. - `height ?? 100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так, - то результатом является сама переменная `height`, т.е. `0`. -На практике нулевая высота часто является вполне возможным значением, которое не следует заменять значением по умолчанию. Таким образом, `??` делает все правильно. +На практике нулевая высота часто является вполне нормальным значением, которое не следует заменять значением по умолчанию. Таким образом, `??` здесь как раз работает так, как нужно. ## Приоритет @@ -110,7 +110,7 @@ alert(height ?? 100); // 0 Это означает, что, как и `||`, оператор нулевого слияния `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`. -Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки: +Так что, в выражениях такого вида понадобятся скобки: ```js run let height = null; @@ -122,19 +122,19 @@ let area = (height ?? 100) * (width ?? 50); alert(area); // 5000 ``` -Иначе, если опустить скобки, то оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, а это приведёт к неправильным результатам. +Иначе, если опустить скобки, оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, и это приведёт к неправильным результатам. ```js -// без круглых скобок +// без скобок let area = height ?? 100 * width ?? 50; -// ...то же самое, что предыдущее выражение (вероятно, это не то, что нам нужно): +// ...сработает вот так (совсем не как нам нужно): let area = height ?? (100 * width) ?? 50; ``` ### Использование ?? вместе с && или || -По соображениям безопасности JavaScript запрещает использование оператора `??` вместе с `&&` и `||`, если только приоритет явно не указан в круглых скобках. +По соображениям безопасности JavaScript запрещает использование оператора `??` вместе с `&&` и `||`, если приоритет явно не указан при помощи круглых скобок. Выполнение следующего кода приведёт к синтаксической ошибке: @@ -142,9 +142,9 @@ let area = height ?? (100 * width) ?? 50; let x = 1 && 2 ?? 3; // Синтаксическая ошибка ``` -Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переключаться с `||` на `??`. +Это, безусловно спорное, ограничение было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переходить с `||` на `??`. -Используйте круглые скобки, чтобы обойти это ограничение: +Используйте скобки, чтобы обойти это ограничение: ```js run *!* @@ -166,4 +166,4 @@ alert(x); // 2 ``` - Оператор `??` имеет очень низкий приоритет, лишь немного выше, чем у `?` и `=`, поэтому при использовании его в выражении, скорее всего, потребуются скобки. -- Запрещено использовать вместе с `||` или `&&` без явно указанных круглых скобок. +- Запрещено использовать вместе с `||` или `&&` без явно указанного приоритета, то есть без скобок. From f6d3ba9e05b4b86191482f499e5c541f43b7f514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D1=91=D0=BD=D0=B0=20=D0=A6=D0=B0=D1=80=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=D1=80=D0=BE=D0=B4=D1=86=D0=B5=D0=B2=D0=B0?= <44943008+AileenKingsler@users.noreply.github.com> Date: Sun, 17 Apr 2022 12:31:13 +1000 Subject: [PATCH 0205/1128] Correct a typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit если открыты инструментов разработчика -> если открыты инструменты разработчика --- 1-js/03-code-quality/01-debugging-chrome/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/01-debugging-chrome/article.md b/1-js/03-code-quality/01-debugging-chrome/article.md index d0cd727177..82d21f49f8 100644 --- a/1-js/03-code-quality/01-debugging-chrome/article.md +++ b/1-js/03-code-quality/01-debugging-chrome/article.md @@ -155,7 +155,7 @@ function hello(name) { : Эта кнопка не влияет на выполнение кода, она лишь позволяет массово включить/отключить точки останова. – включить/отключить автоматическую паузу в случае ошибки. -: При включении, если открыты инструментов разработчика, ошибка при выполнении скрипта автоматически приостанавливает его. Затем мы можем проанализировать переменные в отладчике, чтобы понять, что пошло не так. Поэтому, если наш скрипт умирает с ошибкой, мы можем открыть отладчик, включить эту опцию и перезагрузить страницу, чтобы увидеть, где он умирает и каков контекст в этот момент. +: При включении, если открыты инструменты разработчика, ошибка при выполнении скрипта автоматически приостанавливает его. Затем мы можем проанализировать переменные в отладчике, чтобы понять, что пошло не так. Поэтому, если наш скрипт умирает с ошибкой, мы можем открыть отладчик, включить эту опцию и перезагрузить страницу, чтобы увидеть, где он умирает и каков контекст в этот момент. ```smart header="Continue to here" Щелчок правой кнопкой мыши по строке кода открывает контекстное меню с отличной опцией под названием "Continue to here" ("продолжить до этого места"). From a13bf898cbfcd048722afcc01e1c75d60cd0fd4f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 17 Apr 2022 19:20:56 +0600 Subject: [PATCH 0206/1128] fix typo --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index c17538dd0a..fb32b4edd3 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -87,7 +87,7 @@ JavaScript совершенно не позволяет настраивать, Все встроенные объекты, за исключением одного (объект `Date`, который мы рассмотрим позже), реализуют `"default"` преобразование тем же способом, что и `"number"`. И нам следует поступать так же. -**Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих метода обёекта:** +**Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих метода объекта:** 1. Вызвать `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, 2. Иначе. если хинт равен `"string"` From c7e6776bc0a2d00a5a11693e7da4a2b790c56a8d Mon Sep 17 00:00:00 2001 From: Roman Timashoff <83927854+timashoff@users.noreply.github.com> Date: Thu, 21 Apr 2022 18:18:58 +0600 Subject: [PATCH 0207/1128] =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20"=D0=B4=D0=BB=D0=AF"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit исправлена небольшая опечатка в слове "дл" из ишью [#1591](https://github.com/javascript-tutorial/ru.javascript.info/issues/1591#issue-1210103201) --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index fb32b4edd3..5a40bbf31f 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -264,7 +264,7 @@ alert(obj + 2); // 22 ("2" + 2), преобразование к примити - `"number"` (для математических операций) - `"default"` (для некоторых других операторов, обычно объекты реализуют его как `"number"`) -Спецификация явно описывает дл каждого оператора, какой ему следует использовать хинт. +Спецификация явно описывает для каждого оператора, какой ему следует использовать хинт. Алгоритм преобразования таков: From 7ca6bbf2ad10b254244f924099d7057116a57a2c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 23 Apr 2022 14:13:43 +0600 Subject: [PATCH 0208/1128] just add semicolon --- 1-js/05-data-types/04-array/3-call-array-this/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/3-call-array-this/task.md b/1-js/05-data-types/04-array/3-call-array-this/task.md index 6cba90761d..7016df653a 100644 --- a/1-js/05-data-types/04-array/3-call-array-this/task.md +++ b/1-js/05-data-types/04-array/3-call-array-this/task.md @@ -11,7 +11,7 @@ let arr = ["a", "b"]; arr.push(function() { alert( this ); -}) +}); arr[2](); // ? ``` From f1403d6b66db590f69e8e5f5135c69a80643d710 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 23 Apr 2022 16:41:47 +0600 Subject: [PATCH 0209/1128] smth --- .../4-animate-circle-callback/solution.md | 0 .../solution.view/index.html | 59 +++++++++++++++++++ .../4-animate-circle-callback/task.md | 25 ++++++++ 3 files changed, 84 insertions(+) create mode 100644 7-animation/2-css-animations/4-animate-circle-callback/solution.md create mode 100644 7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html create mode 100644 7-animation/2-css-animations/4-animate-circle-callback/task.md diff --git a/7-animation/2-css-animations/4-animate-circle-callback/solution.md b/7-animation/2-css-animations/4-animate-circle-callback/solution.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html b/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html new file mode 100644 index 0000000000..6a5cc26b30 --- /dev/null +++ b/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + diff --git a/7-animation/2-css-animations/4-animate-circle-callback/task.md b/7-animation/2-css-animations/4-animate-circle-callback/task.md new file mode 100644 index 0000000000..e59dd4a0e5 --- /dev/null +++ b/7-animation/2-css-animations/4-animate-circle-callback/task.md @@ -0,0 +1,25 @@ + +Анимированный круг с колбэком + +В задаче показывается анимированный растущий круг. + +Теперь предположим, что нам нужен не просто круг, а чтобы в нём было ещё и сообщение. Сообщение должно появиться *после* завершения анимации (круг полностью вырос), в противном случае это будет выглядеть некрасиво. + +В решении задачи функция `showCircle(cx, cy, radius)` рисует окружность, но не дает возможности отследить, когда она будет готова. + +В аргументы добавьте колбэк: `showCircle(cx, cy, radius, callback)` который будет вызываться по завершении анимации. `Колбэк` в качестве аргумента должен получить круг `
`. + +Вот пример: + +```js +showCircle(150, 150, 100, div => { + div.classList.add('message-ball'); + div.append("Hello, world!"); +}); +``` + +Демонстрация работы: + +[iframe src="solution" height=260] + +За основу возьмите решение задачи . From c9562116acd4dd6bf60f2cd4ea5cb6fd6bea0478 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 23 Apr 2022 16:45:45 +0600 Subject: [PATCH 0210/1128] =?UTF-8?q?add=20a=20"=D1=91"=20letter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 7-animation/2-css-animations/4-animate-circle-callback/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7-animation/2-css-animations/4-animate-circle-callback/task.md b/7-animation/2-css-animations/4-animate-circle-callback/task.md index e59dd4a0e5..691a76fab8 100644 --- a/7-animation/2-css-animations/4-animate-circle-callback/task.md +++ b/7-animation/2-css-animations/4-animate-circle-callback/task.md @@ -5,7 +5,7 @@ Теперь предположим, что нам нужен не просто круг, а чтобы в нём было ещё и сообщение. Сообщение должно появиться *после* завершения анимации (круг полностью вырос), в противном случае это будет выглядеть некрасиво. -В решении задачи функция `showCircle(cx, cy, radius)` рисует окружность, но не дает возможности отследить, когда она будет готова. +В решении задачи функция `showCircle(cx, cy, radius)` рисует окружность, но не даёт возможности отследить, когда она будет готова. В аргументы добавьте колбэк: `showCircle(cx, cy, radius, callback)` который будет вызываться по завершении анимации. `Колбэк` в качестве аргумента должен получить круг `
`. From 2acddcaf18def82dceed33abb5d08b7dc85d3b43 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 23 Apr 2022 16:47:12 +0600 Subject: [PATCH 0211/1128] Update index.html --- .../4-animate-circle-callback/solution.view/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html b/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html index 6a5cc26b30..f0f0ad9ee1 100644 --- a/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html +++ b/7-animation/2-css-animations/4-animate-circle-callback/solution.view/index.html @@ -22,14 +22,14 @@ - + - - - - - - - - - + + + + + + + + +
+ hh:mm:ss +
+ + + + + + + + + + + From 6c26e91eb2212f6e76e18fb58f44a6fb764cb742 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:12:32 +0600 Subject: [PATCH 0232/1128] smth --- .../3-image-gallery/solution.view/gallery.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/2-events/04-default-browser-action/3-image-gallery/solution.view/gallery.css b/2-ui/2-events/04-default-browser-action/3-image-gallery/solution.view/gallery.css index e697f7ac89..8d6472ee63 100644 --- a/2-ui/2-events/04-default-browser-action/3-image-gallery/solution.view/gallery.css +++ b/2-ui/2-events/04-default-browser-action/3-image-gallery/solution.view/gallery.css @@ -31,4 +31,4 @@ body { #thumbs { margin: 0; padding: 0; -} +} \ No newline at end of file From 9edfb5092f15dee4ecc6e8ac972872f21bfa7955 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:12:54 +0600 Subject: [PATCH 0233/1128] smth --- .../3-image-gallery/source.view/gallery.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/2-events/04-default-browser-action/3-image-gallery/source.view/gallery.css b/2-ui/2-events/04-default-browser-action/3-image-gallery/source.view/gallery.css index e697f7ac89..8d6472ee63 100644 --- a/2-ui/2-events/04-default-browser-action/3-image-gallery/source.view/gallery.css +++ b/2-ui/2-events/04-default-browser-action/3-image-gallery/source.view/gallery.css @@ -31,4 +31,4 @@ body { #thumbs { margin: 0; padding: 0; -} +} \ No newline at end of file From 70513fe0f8b77ab46582fefdaa243a77e9fc3990 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:22:47 +0600 Subject: [PATCH 0234/1128] smth --- 2-ui/1-document/07-modifying-document/5-why-aaa/solution.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2-ui/1-document/07-modifying-document/5-why-aaa/solution.md b/2-ui/1-document/07-modifying-document/5-why-aaa/solution.md index 0e90439d15..18f3f3768b 100644 --- a/2-ui/1-document/07-modifying-document/5-why-aaa/solution.md +++ b/2-ui/1-document/07-modifying-document/5-why-aaa/solution.md @@ -1,9 +1,9 @@ HTML в задаче некорректен. В этом всё дело. -Браузер исправил ошибку автоматически. Но внутри `` не может быть текста: в соответствии со спецификацией допускаются только табличные теги. Поэтому браузер добавляет `"aaa"` *до* `
`. +Браузер исправил ошибку автоматически. Но внутри `
` не может быть текста: в соответствии со спецификацией допускаются только табличные теги. Поэтому браузер показывает `"aaa"` *до* `
`. Теперь очевидно, что когда мы удаляем таблицу, текст остаётся. -На этот вопрос можно легко ответить, изучив DOM, используя инструменты браузера. Там можно увидеть `"aaa"` до элемента `
`. +На этот вопрос можно легко ответить, изучив DOM, используя инструменты браузера. Вы увидите `"aaa"` до элемента `
`. Вообще, в стандарте HTML описано, как браузеру обрабатывать некорректный HTML, так что такое действие браузера является правильным. From 8a4723c8166cac6dd534a81dac5dda78595e9519 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:26:24 +0600 Subject: [PATCH 0235/1128] smth --- 2-ui/1-document/07-modifying-document/5-why-aaa/task.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/2-ui/1-document/07-modifying-document/5-why-aaa/task.md b/2-ui/1-document/07-modifying-document/5-why-aaa/task.md index b92c81e133..494e09c802 100644 --- a/2-ui/1-document/07-modifying-document/5-why-aaa/task.md +++ b/2-ui/1-document/07-modifying-document/5-why-aaa/task.md @@ -4,7 +4,12 @@ importance: 1 # Почему остаётся "aaa"? -Запустите этот пример. Почему вызов `remove` не удалил текст `"aaa"`? +В примере ниже вызов `table.remove()` удаляет таблицу из документа. + +Но если вы запустите его, вы увидите, что текст `"aaa"` все еще виден. + +Почему так происходит? + ```html height=100 run
@@ -18,6 +23,6 @@ importance: 1 alert(table); // таблица, как и должно быть table.remove(); - // почему в документе остался текст "ааа"?? + // почему в документе остался текст "ааа"? ``` From b8158995168eee415a30e8d51fd7695fdea83c2f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:31:14 +0600 Subject: [PATCH 0236/1128] =?UTF-8?q?smth=20=F0=9F=91=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/1-document/07-modifying-document/6-create-list/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2-ui/1-document/07-modifying-document/6-create-list/task.md b/2-ui/1-document/07-modifying-document/6-create-list/task.md index 19d17f99af..4fee71695d 100644 --- a/2-ui/1-document/07-modifying-document/6-create-list/task.md +++ b/2-ui/1-document/07-modifying-document/6-create-list/task.md @@ -10,10 +10,10 @@ importance: 4 1. Запрашивайте содержимое пункта у пользователя с помощью `prompt`. 2. Создавайте элемент `
  • ` и добавляйте его к `
      `. -3. Процесс прерывается, когда пользователь нажимает `key:Esc` или вводит пустую строку. +3. Продолжайте до тех пор, пока пользователь не отменит ввод (нажатием клавиши `key:Esc` или введя пустую строку). Все элементы должны создаваться динамически. -Если пользователь вводит HTML-теги -– пусть в списке они показываются как обычный текст. +Если пользователь вводит HTML-теги, они должны обрабатываться как текст. [demo src="solution"] From a4bdcd71a54dcc1919b04b84320764494846a756 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:38:32 +0600 Subject: [PATCH 0237/1128] smth --- .../12-sort-table/task.md | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/2-ui/1-document/07-modifying-document/12-sort-table/task.md b/2-ui/1-document/07-modifying-document/12-sort-table/task.md index c731c60fc9..68b7db4ebc 100644 --- a/2-ui/1-document/07-modifying-document/12-sort-table/task.md +++ b/2-ui/1-document/07-modifying-document/12-sort-table/task.md @@ -4,36 +4,32 @@ importance: 5 # Сортировка таблицы -Таблица: +Вот таблица: +```html run
  • - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
    ИмяФамилияВозраст
    JohnSmith10
    PeteBrown15
    AnnLee5
    .........
    NameSurnameAge
    JohnSmith10
    PeteBrown15
    AnnLee5
    .........
    +``` -Может быть больше строк. +В ней может быть больше строк. Напишите код для сортировки по столбцу `"name"`. From 47fad7c5bee70f94dc0d615997ad9f8bc9f41862 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 14:47:48 +0600 Subject: [PATCH 0238/1128] smth --- 2-ui/1-document/07-modifying-document/article.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2-ui/1-document/07-modifying-document/article.md b/2-ui/1-document/07-modifying-document/article.md index fede20b805..b19c56a9f0 100644 --- a/2-ui/1-document/07-modifying-document/article.md +++ b/2-ui/1-document/07-modifying-document/article.md @@ -47,6 +47,8 @@ DOM-узел можно создать двумя методами: ```js let textNode = document.createTextNode('А вот и я'); ``` + +Большую часть времени нам нужно создавать узлы элементов, такие как `div` для сообщения. ### Создание сообщения From 30520823681da11b8a61cb710d148dd325dca83a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 19:09:09 +0600 Subject: [PATCH 0239/1128] Update task.md --- 1-js/05-data-types/04-array/2-create-array/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/2-create-array/task.md b/1-js/05-data-types/04-array/2-create-array/task.md index 413a7f4e0e..630f777a1b 100644 --- a/1-js/05-data-types/04-array/2-create-array/task.md +++ b/1-js/05-data-types/04-array/2-create-array/task.md @@ -10,7 +10,7 @@ importance: 5 2. Добавьте "Рок-н-ролл" в конец. 3. Замените значение в середине на "Классика". Ваш код для поиска значения в середине должен работать для массивов с любой длиной. 4. Удалите первый элемент массива и покажите его. -5. Вставьте "Рэп" и "Регги" в начало массива. +5. Вставьте `Рэп` и `Регги` в начало массива. Массив по ходу выполнения операций: From e29846ceb8f4d16a0dfea9443162388c5158b80a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 30 Apr 2022 21:02:58 +0600 Subject: [PATCH 0240/1128] fix typo --- 1-js/05-data-types/11-date/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 6d6f9327b5..f33c2b4eee 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -348,7 +348,7 @@ let time1 = 0; let time2 = 0; *!* -// bench(upperSlice) и bench(upperLoop) поочерёдно запускаются 10 раз +// bench(diffSubtract) и bench(diffGetTime) поочерёдно запускаются 10 раз for (let i = 0; i < 10; i++) { time1 += bench(diffSubtract); time2 += bench(diffGetTime); From ae469d5c2a42f2126231dc6620b9866d9b66dff9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 1 May 2022 18:49:51 +0600 Subject: [PATCH 0241/1128] add missing breaklines --- 8-web-components/6-shadow-dom-style/article.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/8-web-components/6-shadow-dom-style/article.md b/8-web-components/6-shadow-dom-style/article.md index 3e86ccddb9..c418eac036 100644 --- a/8-web-components/6-shadow-dom-style/article.md +++ b/8-web-components/6-shadow-dom-style/article.md @@ -49,6 +49,7 @@ customElements.define('custom-dialog', class extends HTMLElement { Если есть некоторое свойство, стилизованное как в `:host` локально, так и в документе, то стиль документа будет приоритетным. Например, если в документе из примера поставить: + ```html - - - - - - - - - - - diff --git a/1-js/11-async/01-callbacks/01-animate-circle-callback/task.md b/1-js/11-async/01-callbacks/01-animate-circle-callback/task.md deleted file mode 100644 index c50d632368..0000000000 --- a/1-js/11-async/01-callbacks/01-animate-circle-callback/task.md +++ /dev/null @@ -1,25 +0,0 @@ - -# Анимация круга с помощью колбэка - -В задаче находится код для анимации появления круга. - -Давайте представим, что теперь нам нужен не просто круг, а круг с сообщением внутри. И сообщение должно появляться *после* анимации (когда круг достигнет своих размеров), иначе это будет некрасиво. - -В том решении функция `showCircle(cx, cy, radius)` рисовала круг, но способа узнать, что всё нарисовано, не было. - -Поэтому добавим в параметры колбэк: `showCircle(cx, cy, radius, callback)`, который выполним, когда анимация будет завершена. Функция `callback` будет добавлять в наш круг `
    ` элемент с сообщением. - -Посмотрите пример: - -```js -showCircle(150, 150, 100, div => { - div.classList.add('message-ball'); - div.append("Hello, world!"); -}); -``` - -Демо: - -[iframe src="solution" height=260] - -Возьмите за основу решение задачи . diff --git a/7-animation/2-css-animations/4-animate-circle-callback/task.md b/7-animation/2-css-animations/4-animate-circle-callback/task.md index 691a76fab8..807b2b8b88 100644 --- a/7-animation/2-css-animations/4-animate-circle-callback/task.md +++ b/7-animation/2-css-animations/4-animate-circle-callback/task.md @@ -1,5 +1,5 @@ -Анимированный круг с колбэком +# Анимация круга с помощью колбэка В задаче показывается анимированный растущий круг. From 5ed981341418dcc12f0adc904d880d562fd1d9f9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 9 May 2022 12:29:09 +0600 Subject: [PATCH 0290/1128] Update article.md --- 1-js/02-first-steps/07-type-conversions/article.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/1-js/02-first-steps/07-type-conversions/article.md b/1-js/02-first-steps/07-type-conversions/article.md index 253641a024..6c9cf369a2 100644 --- a/1-js/02-first-steps/07-type-conversions/article.md +++ b/1-js/02-first-steps/07-type-conversions/article.md @@ -7,7 +7,9 @@ Есть также случаи, когда нам нужно явно преобразовать значение в ожидаемый тип. ```smart header="Пока что мы не говорим об объектах" -В этой главе мы не касаемся объектов. Сначала мы разберём преобразование примитивных значений. Мы разберём преобразование объектов позже, в главе . +В этой главе мы не касаемся объектов. Сначала мы разберём преобразование примитивных значений. + +Мы разберём преобразование объектов позже, в главе . ``` ## Строковое преобразование From 740a9bb7535d310f7353e499ff2f3ea245441b34 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 9 May 2022 12:30:50 +0600 Subject: [PATCH 0291/1128] just remove whitespace --- 1-js/02-first-steps/07-type-conversions/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/07-type-conversions/article.md b/1-js/02-first-steps/07-type-conversions/article.md index 6c9cf369a2..d77f807001 100644 --- a/1-js/02-first-steps/07-type-conversions/article.md +++ b/1-js/02-first-steps/07-type-conversions/article.md @@ -7,7 +7,7 @@ Есть также случаи, когда нам нужно явно преобразовать значение в ожидаемый тип. ```smart header="Пока что мы не говорим об объектах" -В этой главе мы не касаемся объектов. Сначала мы разберём преобразование примитивных значений. +В этой главе мы не касаемся объектов. Сначала мы разберём преобразование примитивных значений. Мы разберём преобразование объектов позже, в главе . ``` From b8d6c4f68a8f13e49cee99bb8cc7c4338588021e Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 13:49:43 +0600 Subject: [PATCH 0292/1128] =?UTF-8?q?=E2=98=84=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/09-classes/03-static-properties-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/03-static-properties-methods/article.md b/1-js/09-classes/03-static-properties-methods/article.md index 1060c7389f..422ff07f6a 100644 --- a/1-js/09-classes/03-static-properties-methods/article.md +++ b/1-js/09-classes/03-static-properties-methods/article.md @@ -112,7 +112,7 @@ Article.remove({id: 12345}); ````warn header="Статические методы недоступны для отдельных объектов" Статические методы могут вызываться для классов, но не для отдельных объектов. -E.g. such code won't work: +Например. такой код не будет работать: ```js // ... From 7035f6f38499d61aa99868f699dbb09245aad97a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 13:53:04 +0600 Subject: [PATCH 0293/1128] =?UTF-8?q?=E2=98=84=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/01-cookie/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-data-storage/01-cookie/article.md b/6-data-storage/01-cookie/article.md index ba487f6aa6..4a9e51881f 100644 --- a/6-data-storage/01-cookie/article.md +++ b/6-data-storage/01-cookie/article.md @@ -100,7 +100,7 @@ URL-префикс пути, куки будут доступны для стр Это ограничение безопасности, позволяющее нам хранить конфиденциальные данные в файлах куки, которые должны быть доступны только на одном сайте. -По умолчанию куки доступно лишь тому домену, который его установил. +По умолчанию куки доступны лишь тому домену, который его установил. Пожалуйста, обратите внимание, что по умолчанию файл куки также не передается поддомену, например `forum.site.com `. From b2bed9ce4669ee2dcbb020545c592a58c7676b36 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 13:56:50 +0600 Subject: [PATCH 0294/1128] =?UTF-8?q?=E2=9C=85=20just=20placed=20"=D1=91"?= =?UTF-8?q?=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/01-cookie/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/6-data-storage/01-cookie/article.md b/6-data-storage/01-cookie/article.md index 4a9e51881f..8587d69e4d 100644 --- a/6-data-storage/01-cookie/article.md +++ b/6-data-storage/01-cookie/article.md @@ -94,7 +94,7 @@ URL-префикс пути, куки будут доступны для стр - **`domain=site.com`** -Домен определяет, где доступен файл куки. Однако на практике существуют определенные ограничения. Мы не можем указать здесь какой угодно домен. +Домен определяет, где доступен файл куки. Однако на практике существуют определённые ограничения. Мы не можем указать здесь какой угодно домен. **Нет никакого способа разрешить доступ к файлам куки из другого домена 2-го уровня, поэтому `other.com` никогда не получит куки, установленный по адресу `site.com`.** @@ -102,7 +102,7 @@ URL-префикс пути, куки будут доступны для стр По умолчанию куки доступны лишь тому домену, который его установил. -Пожалуйста, обратите внимание, что по умолчанию файл куки также не передается поддомену, например `forum.site.com `. +Пожалуйста, обратите внимание, что по умолчанию файл куки также не передаётся поддомену, например `forum.site.com `. ```js // если мы установим файл куки на веб-сайте site.com... From 6f98ce09be56cfa11db888342aca8bc5bc4177a4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 13:59:25 +0600 Subject: [PATCH 0295/1128] =?UTF-8?q?=F0=9F=91=BE=20Made=20the=20requested?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/08-prototypes/01-prototype-inheritance/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/08-prototypes/01-prototype-inheritance/article.md b/1-js/08-prototypes/01-prototype-inheritance/article.md index 8bb2ee27a9..3d9068f2a7 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/article.md +++ b/1-js/08-prototypes/01-prototype-inheritance/article.md @@ -122,7 +122,7 @@ alert(longEar.jumps); // true (из rabbit) ![](proto-animal-rabbit-chain.svg) -Теперь, если мы прочитаем что-то из `longEar`, и оно отсутствует, JavaScript будет искать его в `rabbit`, а затем в `animal`. +Теперь, если мы прочтём что-нибудь из `longEar`, и оно будет отсутствовать, JavaScript будет искать его в `rabbit`, а затем в `animal`. Есть только два ограничения: From 7590aeadee2ad29aee98c6447921f6f29261954a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 14:00:28 +0600 Subject: [PATCH 0296/1128] =?UTF-8?q?=F0=9F=91=BE=20Made=20the=20requested?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1-class-extend-object/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/09-classes/03-static-properties-methods/1-class-extend-object/solution.md b/1-js/09-classes/03-static-properties-methods/1-class-extend-object/solution.md index cfdb0e796f..3c1a42f600 100644 --- a/1-js/09-classes/03-static-properties-methods/1-class-extend-object/solution.md +++ b/1-js/09-classes/03-static-properties-methods/1-class-extend-object/solution.md @@ -28,7 +28,7 @@ alert( rabbit.hasOwnProperty('name') ); // true 1. Между `"prototype"` функций-конструкторов (для методов) 2. Между самими функциями-конструкторами (для статических методов). -В случае для `class Rabbit extends Object` это значит: +В случае с `class Rabbit extends Object` это значит: ```js run class Rabbit extends Object {} From 38d37874a9ea383399ee159794ce314886e1e615 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 14:02:07 +0600 Subject: [PATCH 0297/1128] smth --- 1-js/04-object-basics/02-object-copy/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/02-object-copy/article.md b/1-js/04-object-basics/02-object-copy/article.md index 3b27c782f3..4d160082ac 100644 --- a/1-js/04-object-basics/02-object-copy/article.md +++ b/1-js/04-object-basics/02-object-copy/article.md @@ -92,7 +92,7 @@ alert( a == b ); // false Для сравнений типа `obj1 > obj2` или для сравнения с примитивом `obj == 5` объекты преобразуются в примитивы. Мы скоро изучим, как работают такие преобразования объектов, но, по правде говоря, сравнения такого рода необходимы очень редко и обычно являются результатом ошибки программиста. -## Клонирование и объединение объектов, Object.assign [#cloning-and-merging-object-assign] +## Клонирование и объединение объектов, Object.assign [#cloning-and-merging-object-assign] Таким образом, при копировании переменной с объектом создаётся ещё одна ссылка на тот же самый объект. From e2b1786d315919954485cacbe2b5d83de7e539c4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 14:11:19 +0600 Subject: [PATCH 0298/1128] =?UTF-8?q?=E2=9C=85=20just=20placed=20"=D1=91"?= =?UTF-8?q?=20letter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/04-array/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index b3b62167dd..3ee05009e2 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -470,7 +470,7 @@ alert( "1,2" + 1 ); // "1,21" - Если один из аргументов `==` является объектом, а другой - примитивом, то объект преобразуется в примитив, как описано в главе . - ...За исключением `null` и `undefined`, которые равны `==` друг другу и ничему больше. -Оператор строгого равенства `===` еще проще, так как он не преобразует типы. +Оператор строгого равенства `===` ещё проще, так как он не преобразует типы. Итак, если мы всё же сравниваем массивы с помощью `==`, то они никогда не будут одинаковыми, если только мы не сравним две переменные, которые ссылаются на один и тот же массив From 1cfff47db8e1d96538e6924da0773d95973ba88b Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 10 May 2022 14:28:07 +0600 Subject: [PATCH 0299/1128] Update article.md --- 1-js/04-object-basics/04-object-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/04-object-methods/article.md b/1-js/04-object-basics/04-object-methods/article.md index 0e347fe118..1dda10e823 100644 --- a/1-js/04-object-basics/04-object-methods/article.md +++ b/1-js/04-object-basics/04-object-methods/article.md @@ -49,7 +49,7 @@ let user = { }; *!* -// во-первых, объявляем +// сначала, объявляем function sayHi() { alert("Привет!"); } From 6e781c06a8d50f0ce90566b9abf406b55a4d3545 Mon Sep 17 00:00:00 2001 From: TungusSs <97480657+TungusSs@users.noreply.github.com> Date: Thu, 12 May 2022 14:14:57 +0300 Subject: [PATCH 0300/1128] =?UTF-8?q?=D0=9E=D0=BF=D0=B5=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D0=B5=20?= =?UTF-8?q?"=D0=9F=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B8=D1=82?= =?UTF-8?q?=D0=B8=D0=B2=D1=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В предложении "Иначе. если хинт равен string" исправил точку на запятую. --- 1-js/04-object-basics/09-object-toprimitive/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/09-object-toprimitive/article.md b/1-js/04-object-basics/09-object-toprimitive/article.md index 5a40bbf31f..bab8fff2af 100644 --- a/1-js/04-object-basics/09-object-toprimitive/article.md +++ b/1-js/04-object-basics/09-object-toprimitive/article.md @@ -90,7 +90,7 @@ JavaScript совершенно не позволяет настраивать, **Чтобы выполнить преобразование, JavaScript пытается найти и вызвать три следующих метода объекта:** 1. Вызвать `obj[Symbol.toPrimitive](hint)` - метод с символьным ключом `Symbol.toPrimitive` (системный символ), если такой метод существует, -2. Иначе. если хинт равен `"string"` +2. Иначе, если хинт равен `"string"` - попробовать вызвать `obj.toString()` или `obj.valueOf()`, смотря какой из них существует. 3. Иначе, если хинт равен `"number"` или `"default"` - попробовать вызвать `obj.valueOf()` или `obj.toString()`, смотря какой из них существует. From 47fd157296748fb4b6e8f2055dbecb9beb560e48 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 15:21:10 +0600 Subject: [PATCH 0301/1128] =?UTF-8?q?=F0=9F=91=BE=20Update=20summary=20sec?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/04-array/article.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 7dd5568a7c..86e363c78a 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -462,7 +462,7 @@ alert( "1,2" + 1 ); // "1,21" Массив – это особый тип объекта, предназначенный для работы с упорядоченным набором элементов. -- Объявление: +Объявление: ```js // квадратные скобки (обычно) @@ -477,6 +477,11 @@ alert( "1,2" + 1 ); // "1,21" - Свойство `length` отражает длину массива или, если точнее, его последний цифровой индекс плюс один. Длина корректируется автоматически методами массива. - Если мы уменьшаем `length` вручную, массив укорачивается. +Получение элементов: + +- мы можем получить элемент по его индексу, например `arr[0]` +- также мы можем использовать метод `at(i)` для получения элементов с отрицательным индексом, для отрицательных значений `i`, он отступает от конца массива. В остальном он работает так же, как `arr[i]`, если `i >= 0`. + Мы можем использовать массив как двустороннюю очередь, используя следующие операции: - `push(...items)`добавляет `items` в конец массива. From 4a12bbb3c5ab97e608148c7bda634b9df9c940d0 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 15:22:12 +0600 Subject: [PATCH 0302/1128] =?UTF-8?q?=E2=9C=85=20just=20add=20missed=20per?= =?UTF-8?q?iod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/04-array/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 86e363c78a..6466aa6410 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -479,7 +479,7 @@ alert( "1,2" + 1 ); // "1,21" Получение элементов: -- мы можем получить элемент по его индексу, например `arr[0]` +- мы можем получить элемент по его индексу, например `arr[0]`. - также мы можем использовать метод `at(i)` для получения элементов с отрицательным индексом, для отрицательных значений `i`, он отступает от конца массива. В остальном он работает так же, как `arr[i]`, если `i >= 0`. Мы можем использовать массив как двустороннюю очередь, используя следующие операции: From a5b3b056bfc65a439fdfdc446472005c493fa844 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 15:47:52 +0600 Subject: [PATCH 0303/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/article.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 227224cba4..45d81d91b5 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -182,9 +182,7 @@ let arrayLike = { alert( arr.concat(arrayLike) ); // 1,2,[object Object] ``` -...Но если объект имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается `concat` как массив: вместо него добавляются его числовые свойства. - -Для корректной обработки в объекте должны быть числовые свойства и `length`: +...Но если объект, подобный массиву, имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается как массив с помощью `concat`: вместо этого добавляются его элементы: ```js run let arr = [1, 2]; @@ -342,7 +340,6 @@ alert(someUsers.length); // 2 Перейдём к методам преобразования и упорядочения массива. - ### map Метод [arr.map](mdn:js/Array/map) является одним из наиболее полезных и часто используемых. @@ -392,6 +389,7 @@ alert( arr ); // *!*1, 15, 2*/!* Чтобы использовать наш собственный порядок сортировки, нам нужно предоставить функцию в качестве аргумента `arr.sort()`. Функция должна для пары значений возвращать: + ```js function compare(a, b) { if (a > b) return 1; // если первое значение больше второго From 58a7899b218af9c38815c7a7ca3efb71c4229418 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 15:50:12 +0600 Subject: [PATCH 0304/1128] =?UTF-8?q?=F0=9F=91=BE=20update=20article?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05-data-types/05-array-methods/article.md | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 45d81d91b5..860e9c41c3 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -427,11 +427,11 @@ alert(arr); // *!*1, 2, 15*/!* ```js run [1, -2, 15, 2, 0, 8].sort(function(a, b) { alert( a + " <> " + b ); + return a - b; }); ``` -В процессе работы алгоритм может сравнивать элемент с другими по нескольку раз, но он старается сделать как можно меньше сравнений. - +В процессе работы алгоритм может сравнивать элемент с другими, но он старается сделать как можно меньше сравнений. ````smart header="Функция сравнения может вернуть любое число" На самом деле от функции сравнения требуется любое положительное число, чтобы сказать "больше", и отрицательное число, чтобы сказать "меньше". @@ -457,6 +457,22 @@ arr.sort( (a, b) => a - b ); Будет работать точно так же, как и более длинная версия выше. ```` +````smart header="Используйте `localeCompare` для строк" +Помните алгоритм сравнения [строк](info:string#correct-comparisons)? По умолчанию он сравнивает буквы по их кодам. + +Для многих алфавитов лучше использовать метод `str.localeCompare` для правильной сортировки букв, таких как `Ö`. + +Например, давайте отсортируем несколько стран по-немецки: + +```js run +let countries = ['Österreich', 'Andorra', 'Vietnam']; + +alert( countries.sort( (a, b) => a > b ? 1 : -1) ); // Andorra, Vietnam, Österreich (неправильно) + +alert( countries.sort( (a, b) => a.localeCompare(b) ) ); // Andorra,Österreich,Vietnam (верно!) +``` +```` + ### reverse Метод [arr.reverse](mdn:js/Array/reverse) меняет порядок элементов в `arr` на обратный. @@ -549,6 +565,8 @@ let value = arr.reduce(function(previousValue, item, index, array) { Звучит сложновато, но всё становится проще, если думать о первом аргументе как "аккумулирующем" результат предыдущих вызовов функции. По окончании он становится результатом `reduce`. + + Этот метод проще всего понять на примере. Тут мы получим сумму всех элементов массива всего одной строкой: @@ -583,7 +601,6 @@ alert(result); // 15 |четвёртый вызов|`6`|`4`|`10`| |пятый вызов|`10`|`5`|`15`| - Здесь отчётливо видно, как результат предыдущего вызова передаётся в первый аргумент следующего. Мы также можем опустить начальное значение: @@ -613,12 +630,10 @@ let arr = []; arr.reduce((sum, current) => sum + current); ``` - Поэтому рекомендуется всегда указывать начальное значение. Метод [arr.reduceRight](mdn:js/Array/reduceRight) работает аналогично, но проходит по массиву справа налево. - ## Array.isArray Массивы не образуют отдельный тип языка. Они основаны на объектах. @@ -715,7 +730,7 @@ alert(soldiers[1].age); // 23 - `sort(func)` -- сортирует массив "на месте", а потом возвращает его. - `reverse()` -- "на месте" меняет порядок следования элементов на противоположный и возвращает изменённый массив. - `split/join` -- преобразует строку в массив и обратно. - - `reduce(func, initial)` -- вычисляет одно значение на основе всего массива, вызывая `func` для каждого элемента и передавая промежуточный результат между вызовами. + - `reduce/reduceRight(func, initial)` -- вычисляет одно значение на основе всего массива, вызывая `func` для каждого элемента и передавая промежуточный результат между вызовами. - Дополнительно: - `Array.isArray(arr)` проверяет, является ли `arr` массивом. @@ -728,10 +743,24 @@ alert(soldiers[1].age); // 23 Функция `fn` вызывается для каждого элемента массива аналогично `map`. Если какие-либо/все результаты вызовов являются `true`, то метод возвращает `true`, иначе `false`. + Эти методы ведут себя примерно как операторы `||` и `&&`: если `fn` возвращает истинное значение, `arr.some()` немедленно возвращает `true` и останавливает перебор остальных элементов; если `fn` возвращает ложное значение, `arr.every()` немедленно возвращает `false` и также прекращает перебор остальных элементов. + + Мы можем использовать `every` для сравнения массивов: + + ```js run + function arraysEqual(arr1, arr2) { + return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]); + } + + alert( arraysEqual([1, 2], [1, 2])); // true + ``` + - [arr.fill(value, start, end)](mdn:js/Array/fill) -- заполняет массив повторяющимися `value`, начиная с индекса `start` до `end`. - [arr.copyWithin(target, start, end)](mdn:js/Array/copyWithin) -- копирует свои элементы, начиная со `start` и заканчивая `end`, в *собственную* позицию `target` (перезаписывает существующие). +- [arr.flat(depth)](mdn:js/Array/flat)/[arr.flatMap(fn)](mdn:js/Array/flatMap) создайте новый плоский массив из многомерного массива. + Полный список есть в [справочнике MDN](mdn:js/Array). На первый взгляд может показаться, что существует очень много разных методов, которые довольно сложно запомнить. Но это гораздо проще, чем кажется. From d1e7e4a30f84ffc86aa877db596081d4f6f7f2a4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 15:56:46 +0600 Subject: [PATCH 0305/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../12-reduce-object/_js.view/solution.js | 7 ++++++ .../12-reduce-object/_js.view/test.js | 22 +++++++++++++++++++ .../12-reduce-object/solution.md | 0 .../05-array-methods/12-reduce-object/task.md | 0 4 files changed, 29 insertions(+) create mode 100644 1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/solution.js create mode 100644 1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/test.js create mode 100644 1-js/05-data-types/05-array-methods/12-reduce-object/solution.md create mode 100644 1-js/05-data-types/05-array-methods/12-reduce-object/task.md diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/solution.js b/1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/solution.js new file mode 100644 index 0000000000..45d92b5f00 --- /dev/null +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/solution.js @@ -0,0 +1,7 @@ +function groupById(array) { + return array.reduce((obj, value) => { + obj[value.id] = value; + return obj; + }, {}) + } + \ No newline at end of file diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/test.js b/1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/test.js new file mode 100644 index 0000000000..a353fbdfaf --- /dev/null +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/_js.view/test.js @@ -0,0 +1,22 @@ +describe("groupById", function() { + + it("creates an object grouped by id", function() { + let users = [ + {id: 'john', name: "John Smith", age: 20}, + {id: 'ann', name: "Ann Smith", age: 24}, + {id: 'pete', name: "Pete Peterson", age: 31}, + ]; + + assert.deepEqual(groupById(users), { + john: {id: 'john', name: "John Smith", age: 20}, + ann: {id: 'ann', name: "Ann Smith", age: 24}, + pete: {id: 'pete', name: "Pete Peterson", age: 31}, + }); + }); + + it("works with an empty array", function() { + users = []; + assert.deepEqual(groupById(users), {}); + }); + }); + \ No newline at end of file diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/solution.md b/1-js/05-data-types/05-array-methods/12-reduce-object/solution.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md new file mode 100644 index 0000000000..e69de29bb2 From 039c7b41e7ed95f931af77b3c0e61336c0d3c918 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 15:59:06 +0600 Subject: [PATCH 0306/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05-array-methods/12-reduce-object/solution.md | 1 + 1-js/05-data-types/05-array-methods/article.md | 6 ++---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/solution.md b/1-js/05-data-types/05-array-methods/12-reduce-object/solution.md index e69de29bb2..d3f5a12faa 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/solution.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/solution.md @@ -0,0 +1 @@ + diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 860e9c41c3..9b2986ee21 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -547,7 +547,7 @@ alert( str ); // Вася;Петя;Маша Синтаксис: ```js -let value = arr.reduce(function(previousValue, item, index, array) { +let value = arr.reduce(function(accumulator, item, index, array) { // ... }, [initial]); ``` @@ -556,7 +556,7 @@ let value = arr.reduce(function(previousValue, item, index, array) { Аргументы: -- `previousValue` -- результат предыдущего вызова этой функции, равен `initial` при первом вызове (если передан `initial`), +- `accumulator` -- результат предыдущего вызова этой функции, равен `initial` при первом вызове (если передан `initial`), - `item` -- очередной элемент массива, - `index` -- его индекс, - `array` -- сам массив. @@ -565,8 +565,6 @@ let value = arr.reduce(function(previousValue, item, index, array) { Звучит сложновато, но всё становится проще, если думать о первом аргументе как "аккумулирующем" результат предыдущих вызовов функции. По окончании он становится результатом `reduce`. - - Этот метод проще всего понять на примере. Тут мы получим сумму всех элементов массива всего одной строкой: From 79d83d7c55fef1a589a79df881e75f7cdf5c499c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 16:05:38 +0600 Subject: [PATCH 0307/1128] =?UTF-8?q?=F0=9F=91=BE=20add=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05-array-methods/12-reduce-object/task.md | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index e69de29bb2..1fa9165934 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -0,0 +1,37 @@ +importance: 4 + +--- + +# Создайте объект с ключами из массива + +Допустим, мы получили массив пользователей в виде `{id:..., name:..., age:... }`. + +Создайте функцию `groupById(arr)`, которая создает из нее объект с `id` в качестве ключа и элементами массива в качестве значений. + +Например: + +```js +let users = [ + {id: 'john', name: "John Smith", age: 20}, + {id: 'ann', name: "Ann Smith", age: 24}, + {id: 'pete', name: "Pete Peterson", age: 31}, +]; + +let usersById = groupById(users); + +/* +// после вызова у нас должно получиться: + +usersById = { + john: {id: 'john', name: "John Smith", age: 20}, + ann: {id: 'ann', name: "Ann Smith", age: 24}, + pete: {id: 'pete', name: "Pete Peterson", age: 31}, +} +*/ +``` + +Такая функция действительно удобна при работе с серверными данными. + +В этой задаче мы предполагаем, что `id` уникален. Не может быть двух элементов массива с одинаковым `id`. + +используйте метод array `.reduce` в решении. From f6759feefd5171eb318f1a7eca6684ac7ceb7453 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 16:05:58 +0600 Subject: [PATCH 0308/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index 1fa9165934..9ad421874d 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -34,4 +34,4 @@ usersById = { В этой задаче мы предполагаем, что `id` уникален. Не может быть двух элементов массива с одинаковым `id`. -используйте метод array `.reduce` в решении. +Используйте метод array `.reduce` в решении. From 9bf36118b9e566a74dcd035812c7d289c362cc19 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 16:07:42 +0600 Subject: [PATCH 0309/1128] =?UTF-8?q?=E2=9C=A8=20just=20placed=20`=D1=91`?= =?UTF-8?q?=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index 9ad421874d..fa4ab98081 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -6,7 +6,7 @@ importance: 4 Допустим, мы получили массив пользователей в виде `{id:..., name:..., age:... }`. -Создайте функцию `groupById(arr)`, которая создает из нее объект с `id` в качестве ключа и элементами массива в качестве значений. +Создайте функцию `groupById(arr)`, которая создаёт из неё объект с `id` в качестве ключа и элементами массива в качестве значений. Например: From 4617f06ff8a63d402ce5825189afd205b19e330a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 16:16:57 +0600 Subject: [PATCH 0310/1128] =?UTF-8?q?=F0=9F=8D=81=20update=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3-filter-range-in-place/_js.view/test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/05-data-types/05-array-methods/3-filter-range-in-place/_js.view/test.js b/1-js/05-data-types/05-array-methods/3-filter-range-in-place/_js.view/test.js index db32d9a115..241b74c6ed 100644 --- a/1-js/05-data-types/05-array-methods/3-filter-range-in-place/_js.view/test.js +++ b/1-js/05-data-types/05-array-methods/3-filter-range-in-place/_js.view/test.js @@ -4,13 +4,13 @@ describe("filterRangeInPlace", function() { let arr = [5, 3, 8, 1]; - filterRangeInPlace(arr, 1, 4); + filterRangeInPlace(arr, 2, 5); - assert.deepEqual(arr, [3, 1]); + assert.deepEqual(arr, [5, 3]); }); it("doesn't return anything", function() { assert.isUndefined(filterRangeInPlace([1,2,3], 1, 4)); }); -}); \ No newline at end of file +}); From 76db46ee3ea4aafb16b3204fedfcf425b47767ac Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 16:20:24 +0600 Subject: [PATCH 0311/1128] =?UTF-8?q?=F0=9F=8D=81=20update=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/2-filter-range/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/2-filter-range/task.md b/1-js/05-data-types/05-array-methods/2-filter-range/task.md index 512e786e97..a0c15a79fe 100644 --- a/1-js/05-data-types/05-array-methods/2-filter-range/task.md +++ b/1-js/05-data-types/05-array-methods/2-filter-range/task.md @@ -4,7 +4,7 @@ importance: 4 # Фильтрация по диапазону -Напишите функцию `filterRange(arr, a, b)`, которая принимает массив `arr`, ищет в нём элементы между `a` и `b` и отдаёт массив этих элементов. +Напишите функцию `filterRange(arr, a, b)`, которая принимает массив `arr`, ищет элементы со значениями выше или равными `a` и ниже или равными `b` и возвращает результат в виде массива. Функция должна возвращать новый массив и не изменять исходный. From dd01fe5747f0618debcf1f2c2fc32257812a41ea Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 14 May 2022 20:25:46 +0600 Subject: [PATCH 0312/1128] =?UTF-8?q?=F0=9F=91=BE=20add=20reference=20to?= =?UTF-8?q?=20timsort?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 9b2986ee21..b6a425f3be 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -420,7 +420,7 @@ alert(arr); // *!*1, 2, 15*/!* Давайте возьмём паузу и подумаем, что же происходит. Упомянутый ранее массив `arr` может быть массивом чего угодно, верно? Он может содержать числа, строки, объекты или что-то ещё. У нас есть набор *каких-то элементов*. Чтобы отсортировать его, нам нужна *функция, определяющая порядок*, которая знает, как сравнивать его элементы. По умолчанию элементы сортируются как строки. -Метод `arr.sort(fn)` реализует общий алгоритм сортировки. Нам не нужно заботиться о том, как он работает внутри (в большинстве случаев это оптимизированная [быстрая сортировка](https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0)). Она проходится по массиву, сравнивает его элементы с помощью предоставленной функции и переупорядочивает их. Всё, что остаётся нам, это предоставить `fn`, которая делает это сравнение. +Метод `arr.sort(fn)` реализует общий алгоритм сортировки. Нам не нужно заботиться о том, как он работает внутри (в большинстве случаев это оптимизированная [быстрая сортировка](https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0) или [Timsort](https://ru.wikipedia.org/wiki/Timsort)). Она проходится по массиву, сравнивает его элементы с помощью предоставленной функции и переупорядочивает их. Всё, что остаётся нам, это предоставить `fn`, которая делает это сравнение. Кстати, если мы когда-нибудь захотим узнать, какие элементы сравниваются -- ничто не мешает нам вывести их на экран: From 156392e26a95f457905ec29f139b0c45c535f287 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 15 May 2022 18:00:57 +0600 Subject: [PATCH 0313/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/03-indexeddb/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/6-data-storage/03-indexeddb/article.md b/6-data-storage/03-indexeddb/article.md index ee03975283..645bbb6d22 100644 --- a/6-data-storage/03-indexeddb/article.md +++ b/6-data-storage/03-indexeddb/article.md @@ -490,16 +490,16 @@ request.onerror = function(event) { // получить одну книгу books.get('js') -// получить все книги с 'css' < id < 'html' +// получить книги с 'css' <= id <= 'html' books.getAll(IDBKeyRange.bound('css', 'html')) -// получить книги с 'html' <= id -books.getAll(IDBKeyRange.lowerBound('html', true)) +// получить книги с id < 'html' +books.getAll(IDBKeyRange.upperBound('html', true)) // получить все книги books.getAll() -// получить все ключи: id >= 'js' +// получить все ключи, гдe id > 'js' books.getAllKeys(IDBKeyRange.lowerBound('js', true)) ``` From 2bf14fce8f10bc97d6ec965c3a83b0104924549c Mon Sep 17 00:00:00 2001 From: rnbsov <73550760+rnbsov@users.noreply.github.com> Date: Sun, 15 May 2022 18:36:43 +0600 Subject: [PATCH 0314/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/03-indexeddb/article.md | 75 +++++++++++++++++--------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/6-data-storage/03-indexeddb/article.md b/6-data-storage/03-indexeddb/article.md index 645bbb6d22..16908bf5b9 100644 --- a/6-data-storage/03-indexeddb/article.md +++ b/6-data-storage/03-indexeddb/article.md @@ -7,7 +7,7 @@ libs: IndexedDB - это встроенная база данных, более мощная, чем `localStorage`. -- Хранилище ключей/значений: доступны несколько типов ключей, а значения могут быть (почти) любыми. +- Хранит практически любые значения по ключам, несколько типов ключей - Поддерживает транзакции для надёжности. - Поддерживает запросы в диапазоне ключей и индексы. - Позволяет хранить больше данных, чем `localStorage`. @@ -18,6 +18,12 @@ IndexedDB - это встроенная база данных, более мощ Мы также можем использовать `async/await` с помощью обёртки, которая основана на промисах, например . Это очень удобно, но обёртка не идеальна, она не может полностью заменить события. Поэтому мы начнём с событий, а затем, когда разберёмся в IndexedDB, рассмотрим и обёртку. +```smart header="Где хранятся данные?" +Технически данные обычно хранятся в домашнем каталоге посетителя вместе с настройками браузера, расширениями и т.д. + +У разных браузеров и пользователей на уровне ОС есть свое собственное независимое хранилище. +``` + ## Открыть базу данных Для начала работы с IndexedDB нужно открыть базу данных. @@ -46,7 +52,9 @@ let openRequest = indexedDB.open(name, version); Это событие также сработает, если базы данных ещё не существует, так что в этом обработчике мы можем выполнить инициализацию. -Например, когда мы впервые публикуем наше приложение, мы открываем базу данных с версией `1` и выполняем инициализацию в обработчике `upgradeneeded`: +Допустим, мы опубликовали первую версию нашего приложения. + +Затем мы можем открыть базу данных с версией `1` и выполнить инициализацию в обработчике `upgradeneeded` вот так: ```js let openRequest = indexedDB.open("store", *!*1*/!*); @@ -66,12 +74,13 @@ openRequest.onsuccess = function() { }; ``` -Когда мы публикуем вторую версию: +Затем, позже, мы публикуем 2-ю версию. + +Мы можем открыть его с версией `2` и выполнить обновление следующим образом: ```js let openRequest = indexedDB.open("store", *!*2*/!*); -// проверить существование указанной версии базы данных, обновить по мере необходимости: openRequest.onupgradeneeded = function(event) { // версия существующей базы данных меньше 2 (или база данных не существует) let db = openRequest.result; @@ -109,9 +118,12 @@ let deleteRequest = indexedDB.deleteDatabase(name) Раз уж мы говорим про версионирование, рассмотрим связанную с этим небольшую проблему. -Допустим, посетитель открыл наш сайт во вкладке браузера, с базой версии 1. +Допустим: +1. Посетитель открыл наш сайт во вкладке браузера, с базой версии `1`. +2. Затем мы выпустили обновление, так что наш код обновился. +3. И затем тот же посетитель открыл наш сайт в другой вкладке. -Затем мы выкатили обновление, и тот же посетитель открыл наш сайт в другой вкладке. Так что есть две вкладки, на которых открыт наш сайт, но в одной открыто соединение с базой версии 1, а другая пытается обновить версию базы в обработчике `upgradeneeded`. +Так что есть две вкладки, на которых открыт наш сайт, но в одной открыто соединение с базой версии 1, а другая пытается обновить версию базы в обработчике `upgradeneeded`. Проблема заключается в том, что база данных всего одна на две вкладки, так как это один и тот же сайт, один источник. И она не может быть одновременно версии 1 и 2. Чтобы обновить на версию 2, все соединения к версии 1 должны быть закрыты. @@ -133,27 +145,31 @@ openRequest.onsuccess = function() { *!* db.onversionchange = function() { db.close(); - alert("База данных устарела, пожалуста, перезагрузите страницу.") + alert("Database is outdated, please reload the page.") }; */!* - // ...база данных доступна как объект db... + // ...база данных готова, используйте ее... }; *!* openRequest.onblocked = function() { - // есть другое соединение к той же базе - // и оно не было закрыто после срабатывания на нём db.onversionchange + // это событие не должно срабатывать, если мы правильно обрабатываем onversionchange + + // это означает, что есть еще одно открытое соединение с той же базой данных + // и он не был закрыт после того, как для него сработал db.onversionchange }; */!* ``` -Здесь мы делаем две вещи: +...Другими словами, здесь мы делаем две вещи: -1. Добавляем обработчик `db.onversionchange` после успешного открытия базы, чтобы узнать о попытке параллельного обновления. -2. Добавляем обработчик `openRequest.onblocked` для ситуаций, когда старое соединение не было закрыто. Такого не произойдёт, если мы закрываем его в `db.onversionchange`. +1. Прослушиватель `db.onversionchange` сообщает нам о попытке параллельного обновления, если текущая версия базы данных устарела. +2. Прослушиватель `OpenRequest.onblocked` сообщает нам об обратной ситуации: в другом месте есть соединение с устаревшей версией, и оно не закрывается, поэтому новое соединение установить невозможно. -Есть и другие варианты. Например, мы можем более "мягко" закрыть соединение в `db.onversionchange`, предложить пользователю сохранить данные перед этим. Новое обновляющее соединение будет заблокировано сразу после того как обработчик `db.onversionchange` завершится, не закрыв соединение, и мы можем в новой вкладке попросить посетителя закрыть старые для обновления. +Мы можем более изящно обращаться с вещами в `db.onversionchange`, например предлагать посетителю сохранить данные до закрытия соединения и так далее. + +Или альтернативным подходом было бы не закрывать базу данных в `db.onversionchange`, а вместо этого использовать обработчик `onblocked` (на новой вкладке), чтобы предупредить посетителя, что более новая версия не может быть загружена, пока они не закроют другие вкладки. Такой конфликт при обновлении происходит редко, но мы должны как-то его обрабатывать, хотя бы поставить обработчик `onblocked`, чтобы наш скрипт не "умирал" молча, удивляя посетителя. @@ -182,6 +198,7 @@ IndexedDB использует [стандартный алгоритм сери Но для начала нужно создать хранилище. Синтаксис для создания хранилища объектов: + ```js db.createObjectStore(name[, keyOptions]); ``` @@ -196,6 +213,7 @@ db.createObjectStore(name[, keyOptions]); Если при создании хранилища не указать `keyOptions`, то нам потребуется явно указать ключ позже, при сохранении объекта. Например, это хранилище объектов использует свойство `id` как ключ: + ```js db.createObjectStore('books', {keyPath: 'id'}); ``` @@ -205,6 +223,7 @@ db.createObjectStore('books', {keyPath: 'id'}); Это техническое ограничение. Вне обработчика мы сможем добавлять/удалять/обновлять данные, но хранилища объектов могут быть созданы/удалены/изменены только во время обновления версии базы данных. Для обновления версии базы есть два основных подхода: + 1. Мы можем реализовать функции обновления по версиям: с 1 на 2, с 2 на 3 и т.д. Потом в `upgradeneeded` сравнить версии (например, была 2, сейчас 4) и запустить операции обновления для каждой промежуточной версии (2 на 3, затем 3 на 4). 2. Или мы можем взять список существующих хранилищ объектов, используя `db.objectStoreNames`. Этот объект является [DOMStringList](https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#domstringlist), в нём есть метод `contains(name)`, используя который можно проверить существование хранилища. Посмотреть, какие хранилища есть и создать те, которых нет. @@ -224,7 +243,6 @@ openRequest.onupgradeneeded = function() { }; ``` - Чтобы удалить хранилище объектов: ```js @@ -238,6 +256,7 @@ db.deleteObjectStore('books') Транзакция - это группа операций, которые должны быть или все выполнены, или все не выполнены (всё или ничего). Например, когда пользователь что-то покупает, нам нужно: + 1. Вычесть деньги с его счёта. 2. Отправить ему покупку. @@ -460,10 +479,13 @@ request.onerror = function(event) { ## Поиск по ключам Есть два основных вида поиска в хранилище объектов: -1. По ключу или по диапазону ключей. То есть: по `book.id` в хранилище "books". -2. По полям объекта, например, `book.price`. -Сначала давайте разберёмся с ключами и диапазоном ключей `(1)`. +1. По значению ключа или диапазону ключей. В нашем хранилище "books" это будет значение или диапазон значений `book.id `. +2. С помощью другого поля объекта, например `book.price`. Для этого потребовалась дополнительная структура данных, получившая название "index". + +### По ключу + +Сначала давайте разберемся с первым типом поиска: по ключу. Методы поиска поддерживают либо точные ключи, либо так называемые "запросы с диапазоном" -- [IDBKeyRange](https://www.w3.org/TR/IndexedDB/#keyrange) объекты, которые задают "диапазон ключей". @@ -474,7 +496,9 @@ request.onerror = function(event) { - `IDBKeyRange.bound(lower, upper, [lowerOpen], [upperOpen])` означает: между `lower` и `upper`, включительно, если соответствующий `open` равен `true`. - `IDBKeyRange.only(key)` -- диапазон, который состоит только из одного ключа `key`, редко используется. -Все методы поиска принимают аргумент `query`, который может быть либо точным ключом, либо диапазоном ключей: +Очень скоро мы увидим практические примеры их использования. + +Для выполнения фактического поиска существуют следующие методы. Они принимают аргумент `query`, который может быть либо точным ключом, либо диапазоном ключей: - `store.get(query)` -- поиск первого значения по ключу или по диапазону. - `store.getAll([query], [count])` -- поиск всех значений, можно ограничить, передав `count`. @@ -509,7 +533,6 @@ books.getAllKeys(IDBKeyRange.lowerBound('js', true)) Поэтому запросы, которые возвращают много значений, всегда возвращают их в порядке сортировки по ключу. ``` - ## Поиск по индексированному полю Для поиска по другим полям объекта нам нужно создать дополнительную структуру данных, называемую "индекс" (index). @@ -592,6 +615,7 @@ let request = priceIndex.getAll(IDBKeyRange.upperBound(5)); - **`delete(query)`** -- производит удаление соответствующих запросу значений. Например: + ```js // удалить книгу с id='js' books.delete('js'); @@ -610,6 +634,7 @@ request.onsuccess = function() { ``` Чтобы удалить всё: + ```js books.clear(); // очищаем хранилище. ``` @@ -618,9 +643,7 @@ books.clear(); // очищаем хранилище. Такие методы как `getAll/getAllKeys` возвращают массив ключей/значений. -Но хранилище объектов может быть огромным, больше, чем доступно памяти. - -Тогда метод `getAll` вернёт ошибку при попытке получить все записи в массиве. +Но хранилище объектов может быть огромным, больше, чем доступно памяти. Тогда метод `getAll` вернёт ошибку при попытке получить все записи в массиве. Что делать? @@ -631,6 +654,7 @@ books.clear(); // очищаем хранилище. Так как хранилище объектов внутренне отсортировано по ключу, курсор проходит по хранилищу в порядке хранения ключей (по возрастанию по умолчанию). Синтаксис: + ```js // как getAll, но с использованием курсора: let request = store.openCursor([query], [direction]); @@ -728,7 +752,6 @@ try { } catch(err) { console.log('ошибка', err.message); } - ``` Теперь у нас красивый "плоский асинхронный" код и, конечно, будет работать `try..catch`. @@ -771,6 +794,7 @@ await inventory.add({ id: 'js', price: 10, created: new Date() }); // Ошибк Следующий `inventory.add` после `fetch` `(*)` не сработает, сгенерируется ошибка "inactive transaction", потому что транзакция уже завершена и закрыта к этому времени. Решение такое же, как при работе с обычным IndexedDB: либо создать новую транзакцию, либо разделить задачу на части. + 1. Подготовить данные и получить всё, что необходимо. 2. Затем сохранить в базу данных. @@ -803,8 +827,7 @@ IndexedDB можно рассматривать как "localStorage на сте 1. Подключить обёртку над промисами, например [idb](https://github.com/jakearchibald/idb). 2. Открыть базу данных: `idb.openDb(name, version, onupgradeneeded)` - - Создание хранилищ объектов и индексов происходит в обработчике `onupgradeneeded`. - - Обновление версии - либо сравнивая номера версий, либо можно проверить что существует, а что нет. + - Создайте хранилища объектов и индексы в обработчике `onupgradeneeded` или выполните обновление версии, если это необходимо 3. Для запросов: - Создать транзакцию `db.transaction('books')` (можно указать readwrite, если надо). - Получить хранилище объектов `transaction.objectStore('books')`. From 60b212286d516364312df3e84ab95a2b95449051 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 17 May 2022 20:26:51 +0600 Subject: [PATCH 0315/1128] =?UTF-8?q?=F0=9F=91=BE=20some=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/04-variables/article.md | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/1-js/02-first-steps/04-variables/article.md b/1-js/02-first-steps/04-variables/article.md index 8fdaa14925..74c763dc83 100644 --- a/1-js/02-first-steps/04-variables/article.md +++ b/1-js/02-first-steps/04-variables/article.md @@ -24,7 +24,7 @@ let message; let message; *!* -message = 'Hello'; // сохранить строку +message = 'Hello'; // сохранить строку 'Hello' в переменной с именем message */!* ``` @@ -53,8 +53,7 @@ alert(message); // Hello! let user = 'John', age = 25, message = 'Hello'; ``` -Такой способ может показаться короче, но мы не рекомендуем его. -Для лучшей читаемости объявляйте каждую переменную на новой строке. +Такой способ может показаться короче, но мы не рекомендуем его. Для лучшей читаемости объявляйте каждую переменную на новой строке. Многострочный вариант немного длиннее, но легче для чтения: @@ -65,6 +64,7 @@ let message = 'Hello'; ``` Некоторые люди также определяют несколько переменных в таком вот многострочном стиле: + ```js no-beautify let user = 'John', age = 25, @@ -81,7 +81,6 @@ let user = 'John' В принципе, все эти варианты работают одинаково. Так что это вопрос личного вкуса и эстетики. - ````smart header="`var` вместо `let`" В старых скриптах вы также можете найти другое ключевое слово: `var` вместо `let`: @@ -91,8 +90,7 @@ let user = 'John' Ключевое слово `var` - *почти* то же самое, что и `let`. Оно объявляет переменную, но немного по-другому, "устаревшим" способом. -Есть тонкие различия между `let` и `var`, но они пока не имеют для нас значения. -Мы подробно рассмотрим их в главе . +Есть тонкие различия между `let` и `var`, но они пока не имеют для нас значения. Мы подробно рассмотрим их в главе . ```` ## Аналогия из жизни @@ -106,6 +104,7 @@ let user = 'John' Мы можем положить любое значение в коробку. Мы также можем изменить его столько раз, сколько захотим: + ```js run let message; @@ -156,9 +155,7 @@ let message = "Другое"; // SyntaxError: 'message' has already been declare В таких языках однажды сохранённое "в коробку" значение остаётся там навсегда. Если нам нужно сохранить что-то другое, язык заставляет нас создать новую коробку (объявить новую переменную). Мы не можем использовать старую переменную. -Хотя на первый взгляд это может показаться немного странным, эти языки вполне подходят для серьёзной разработки. -Более того, есть такая область, как параллельные вычисления, где это ограничение даёт определённые преимущества. -Изучение такого языка (даже если вы не планируете использовать его в ближайшее время) рекомендуется для расширения кругозора. +Хотя на первый взгляд это может показаться немного странным, эти языки вполне подходят для серьёзной разработки. Более того, есть такая область, как параллельные вычисления, где это ограничение даёт определённые преимущества. Изучение такого языка (даже если вы не планируете использовать его в ближайшее время) рекомендуется для расширения кругозора. ``` ## Имена переменных [#variable-naming] @@ -175,8 +172,7 @@ let userName; let test123; ``` -Если имя содержит несколько слов, обычно используется [верблюжья нотация](https://ru.wikipedia.org/wiki/CamelCase), -то есть, слова следуют одно за другим, где каждое следующее слово начинается с заглавной буквы: `myVeryLongName`. +Если имя содержит несколько слов, обычно используется [верблюжья нотация](https://ru.wikipedia.org/wiki/CamelCase), то есть, слова следуют одно за другим, где каждое следующее слово начинается с заглавной буквы: `myVeryLongName`. Самое интересное -- знак доллара `'$'` и подчёркивание `'_'` также можно использовать в названиях. Это обычные символы, как и буквы, без какого-либо особого значения. @@ -198,7 +194,7 @@ let my-name; // дефис '-' не разрешён в имени ``` ```smart header="Регистр имеет значение" -Переменные с именами `apple` и `AppLE` -- это две разные переменные. +Переменные с именами `apple` и `APPLE` -- это две разные переменные. ``` ````smart header="Нелатинские буквы разрешены, но не рекомендуются" @@ -296,6 +292,7 @@ alert(color); // #FF7F00 Название "константа" просто означает, что значение переменной никогда не меняется. Но есть константы, которые известны до выполнения (например, шестнадцатеричное значение для красного цвета), а есть константы, которые *вычисляются* во время выполнения сценария, но не изменяются после их первоначального назначения. Например: + ```js const pageLoadTime = /* время, потраченное на загрузку веб-страницы */; ``` From d43653163881da3ec71c3f47811013d901dac7b7 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 10:58:42 +0600 Subject: [PATCH 0316/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/04-object-basics/03-garbage-collection/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 6d76a8854a..3bb1cdf605 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -149,11 +149,11 @@ family = null; ## Внутренние алгоритмы -Основной алгоритм сборки мусора называется "разметка и зачистка" (от англ. "mark-and-sweep"). +Основной алгоритм сборки мусора называется "алгоритм пометок" (от англ. "mark-and-sweep"). Согласно этому алгоритму, сборщик мусора регулярно выполняет следующие шаги: -- Сборщик мусора берет корни и "помечает" (запоминает) их. +- Сборщик мусора "помечает" (запоминает) все корневые объекты. - Затем он идёт по ним и "помечает" все ссылки из них. - Затем он идёт по отмеченным объектам и отмечает их ссылки. Все посещённые объекты запоминаются, чтобы в будущем не посещать один и тот же объект дважды. - ...И так далее, пока не будут посещены все достижимые (из корней) ссылки. From 54196f41b229b129f45ab778e47596b14f5eb7c6 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 10:59:28 +0600 Subject: [PATCH 0317/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/04-object-basics/03-garbage-collection/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 3bb1cdf605..85cf9bf10f 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -177,7 +177,7 @@ family = null; ![](garbage-collection-4.svg) -ТТеперь объекты, которые не удалось посетить в процессе, считаются недостижимыми и будут удалены: +Теперь объекты, которые не удалось посетить в процессе, считаются недостижимыми и будут удалены: ![](garbage-collection-5.svg) From e4d29f2d7d82595c01353cd409a25f6644a6494c Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 11:14:58 +0600 Subject: [PATCH 0318/1128] =?UTF-8?q?=E2=9C=85=20just=20placed=20`=D1=91`?= =?UTF-8?q?=20letters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/03-indexeddb/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/6-data-storage/03-indexeddb/article.md b/6-data-storage/03-indexeddb/article.md index 16908bf5b9..266c141451 100644 --- a/6-data-storage/03-indexeddb/article.md +++ b/6-data-storage/03-indexeddb/article.md @@ -21,7 +21,7 @@ IndexedDB - это встроенная база данных, более мощ ```smart header="Где хранятся данные?" Технически данные обычно хранятся в домашнем каталоге посетителя вместе с настройками браузера, расширениями и т.д. -У разных браузеров и пользователей на уровне ОС есть свое собственное независимое хранилище. +У разных браузеров и пользователей на уровне ОС есть своё собственное независимое хранилище. ``` ## Открыть базу данных @@ -156,7 +156,7 @@ openRequest.onsuccess = function() { openRequest.onblocked = function() { // это событие не должно срабатывать, если мы правильно обрабатываем onversionchange - // это означает, что есть еще одно открытое соединение с той же базой данных + // это означает, что есть ещё одно открытое соединение с той же базой данных // и он не был закрыт после того, как для него сработал db.onversionchange }; */!* @@ -238,7 +238,7 @@ let openRequest = indexedDB.open("db", 2); openRequest.onupgradeneeded = function() { let db = openRequest.result; if (!db.objectStoreNames.contains('books')) { // если хранилище "books" не существует - db.createObjectStore('books', {keyPath: 'id'}); // создаем хранилище + db.createObjectStore('books', {keyPath: 'id'}); // создаём хранилище } }; ``` @@ -485,7 +485,7 @@ request.onerror = function(event) { ### По ключу -Сначала давайте разберемся с первым типом поиска: по ключу. +Сначала давайте разберёмся с первым типом поиска: по ключу. Методы поиска поддерживают либо точные ключи, либо так называемые "запросы с диапазоном" -- [IDBKeyRange](https://www.w3.org/TR/IndexedDB/#keyrange) объекты, которые задают "диапазон ключей". From 5830eb66351fa9336b659b3e641aef1ea19b098d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 11:27:28 +0600 Subject: [PATCH 0319/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/01-getting-started/3-code-editors/article.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/1-js/01-getting-started/3-code-editors/article.md b/1-js/01-getting-started/3-code-editors/article.md index b5478da906..e2d4165303 100644 --- a/1-js/01-getting-started/3-code-editors/article.md +++ b/1-js/01-getting-started/3-code-editors/article.md @@ -12,11 +12,8 @@ IDE загружает проект (который может состоять Если вы ещё не выбрали себе IDE, присмотритесь к этим: - -- [Visual Studio Code](https://code.visualstudio.com/) (бесплатно). -- [WebStorm](http://www.jetbrains.com/webstorm/) (платно). - -Обе IDE -- кроссплатформенные. +- [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенный, бесплатно). +- [WebStorm](http://www.jetbrains.com/webstorm/) (кросс-платформенный, платно). Для Windows есть ещё Visual Studio (не путать с Visual Studio Code). Visual Studio - это платная мощная среда разработки, которая работает только на Windows. Она хорошо подходит для .NET платформы. У неё есть бесплатная версия, которая называется [Visual Studio Community](https://www.visualstudio.com/vs/community/). From 7a0dc51a57b7e137366f284102bdbdebe8ec1e62 Mon Sep 17 00:00:00 2001 From: Ilya Kantor Date: Sat, 21 May 2022 08:34:47 +0300 Subject: [PATCH 0320/1128] minor fixes --- .../03-garbage-collection/article.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index 85cf9bf10f..e6218c78f5 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -145,7 +145,7 @@ family = null; Объекты John и Ann всё ещё связаны, оба имеют входящие ссылки, но этого недостаточно. -Бывший объект `family` был отсоединён от корня, на него больше нет ссылки, поэтому весь "остров" становится недоступным и будет удалён. +Бывший объект `family` был отсоединён от корня, на него больше нет ссылки, поэтому весь "остров" становится недостижимым и будет удалён. ## Внутренние алгоритмы @@ -163,17 +163,17 @@ family = null; ![](garbage-collection-1.svg) -Мы ясно видим "недостижимый остров" справа. Теперь давайте посмотрим, как будет работать "разметка и зачистка" сборщика мусора. +Мы ясно видим "недостижимый остров" справа. Теперь давайте посмотрим, как будет работать "алгоритм пометок" сборщика мусора. На первом шаге помечаются корни: ![](garbage-collection-2.svg) -Затем помечаются их ссылки: +Затем помечаются объекты по их ссылкам: ![](garbage-collection-3.svg) -...И их ссылки, пока это вообще возможно: +...А затем объекты по их ссылкам и так далее, пока это возможно: ![](garbage-collection-4.svg) @@ -183,15 +183,15 @@ family = null; Мы также можем представить себе этот процесс как выливание огромного ведра краски из корней, которая течёт по всем ссылкам и отмечает все достижимые объекты. Затем непомеченные удаляются. -Это концепция того, как работает сборка мусора. Движки JavaScript применяют множество оптимизаций, чтобы он работал быстрее и не влиял на выполнение. +Это концепция того, как работает сборка мусора. Движки JavaScript применяют множество оптимизаций, чтобы она работала быстрее и не задерживала выполнение кода. Вот некоторые из оптимизаций: -- **Сборка по поколениям (Generational collection)** – объекты разделены на два набора: "новые" и "старые". Многие объекты появляются, выполняют свою работу и быстро умирают, их можно агрессивно очищать. Те, которые выживают достаточно долго, становятся "старыми" и проверяются реже. -- **Инкрементальная сборка (Incremental collection)** – если объектов много, и мы пытаемся обойти и пометить весь набор объектов сразу, это может занять некоторое время и привести к видимым задержкам в выполнения скрипта. Таким образом, движок пытается разделить сборку мусора на части. Затем части выполняются одна за другой, по отдельности. Это требует дополнительного учёта для отслеживания изменений между частями, но у нас много крошечных задержек вместо одной большой. +- **Сборка по поколениям (Generational collection)** – объекты делятся на два набора: "новые" и "старые". В типичном коде многие объекты имеют короткую жизнь: они появляются, выполняют свою работу и быстро умирают, так что имеет смысл отслеживать новые объекты и, если это так, быстро очищать от них память. Те, которые выживают достаточно долго, становятся "старыми" и проверяются реже. +- **Инкрементальная сборка (Incremental collection)** – если объектов много, и мы пытаемся обойти и пометить весь набор объектов сразу, это может занять некоторое время и привести к видимым задержкам в выполнения скрипта. Так что движок делит всё множество объектов на части, и далее очищает их одну за другой. Получается несколько небольших сборок мусора вместо одной всеобщей. Это требует дополнительного учёта для отслеживания изменений между частями, но зато получается много крошечных задержек вместо одной большой. - **Сборка в свободное время (Idle-time collection)** - чтобы уменьшить возможное влияние на производительность, сборщик мусора старается работать только во время простоя процессора. -Существуют и другие способы оптимизации и разновидности алгоритмов сборки мусора. Но как бы мне ни хотелось описать их здесь, я должен воздержаться, потому что разные движки реализуют разные хитрости и методы. И, что ещё более важно, все меняется по мере развития движков, поэтому изучать глубже "заранее", без реальной необходимости, вероятно, не стоит. Если, конечно, это не вопрос чистого интереса, то для вас будет несколько ссылок ниже. +Существуют и другие способы оптимизации и разновидности алгоритмов сборки мусора. Но как бы мне ни хотелось описать их здесь, я должен воздержаться, потому что разные движки реализуют разные хитрости и методы. И, что ещё более важно, все меняется по мере развития движков, поэтому изучать тему глубоко "заранее", без реальной необходимости, вероятно, не стоит. Если, конечно, это не вопрос чистого интереса, тогда для вас будет несколько ссылок ниже. ## Итого @@ -199,11 +199,11 @@ family = null; - Сборка мусора выполняется автоматически. Мы не можем ускорить или предотвратить её. - Объекты сохраняются в памяти, пока они достижимы. -- Наличие ссылки - это не то же самое, что быть достижимым (из корня): свора взаимосвязанных объектов может стать недоступна в целом. +- Если на объект есть ссылка - вовсе не факт, что он является достижимым (из корня): набор взаимосвязанных объектов может стать недоступен в целом, как мы видели в примере выше. -Современные движки реализуют передовые алгоритмы сборки мусора. +Современные движки реализуют разные продвинутые алгоритмы сборки мусора. -Общие сведения о некоторых из них освещены в книге "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones и др.). +О многих из них рассказано в прекрасной книге о сборке мусора "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones и др.). Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора V8 находится в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). From 2947b9a2838283ebbedfdd8c1564654fb5a50d0d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 11:52:35 +0600 Subject: [PATCH 0321/1128] =?UTF-8?q?=F0=9F=91=BE=20some=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/03-code-quality/03-comments/article.md | 2 +- 1-js/04-object-basics/08-symbol/article.md | 2 +- 1-js/05-data-types/04-array/article.md | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/1-js/03-code-quality/03-comments/article.md b/1-js/03-code-quality/03-comments/article.md index c4c2384a21..30fbca6d0b 100644 --- a/1-js/03-code-quality/03-comments/article.md +++ b/1-js/03-code-quality/03-comments/article.md @@ -143,7 +143,7 @@ function pow(x, n) { Кстати, многие редакторы, такие как [WebStorm](https://www.jetbrains.com/webstorm/), прекрасно их распознают для того, чтобы выполнить автодополнение ввода и различные автоматические проверки кода. -Также существуют инструменты, например, [JSDoc 3](https://github.com/jsdoc3/jsdoc), которые умеют генерировать HTML-документацию из комментариев. Получить больше информации о JSDoc вы можете здесь: . +Также существуют инструменты, например, [JSDoc 3](https://github.com/jsdoc3/jsdoc), которые умеют генерировать HTML-документацию из комментариев. Получить больше информации о JSDoc вы можете здесь: />. Почему задача решена именно таким способом? : Важно то, что написано. Но то, что *не* написано, может быть даже более важным, чтобы понимать происходящее. Почему задача решена именно этим способом? Код не даёт ответа. diff --git a/1-js/04-object-basics/08-symbol/article.md b/1-js/04-object-basics/08-symbol/article.md index b2f45cf237..b4e2441208 100644 --- a/1-js/04-object-basics/08-symbol/article.md +++ b/1-js/04-object-basics/08-symbol/article.md @@ -16,7 +16,7 @@ let id = Symbol(); ``` -При создании символу можно дать описание (также называемое имя), в основном использующееся для отладки кода: +При создании символам можно дать описание (также называемое имя), в основном использующееся для отладки кода: ```js run // Создаём символ id с описанием (именем) "id" diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 6466aa6410..55d6af0a44 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -464,15 +464,15 @@ alert( "1,2" + 1 ); // "1,21" Объявление: - ```js - // квадратные скобки (обычно) - let arr = [item1, item2...]; +```js +// квадратные скобки (обычно) +let arr = [item1, item2...]; - // new Array (очень редко) - let arr = new Array(item1, item2...); - ``` +// new Array (очень редко) +let arr = new Array(item1, item2...); +``` - Вызов `new Array(number)` создаёт массив с заданной длиной, но без элементов. +Вызов `new Array(number)` создаёт массив с заданной длиной, но без элементов. - Свойство `length` отражает длину массива или, если точнее, его последний цифровой индекс плюс один. Длина корректируется автоматически методами массива. - Если мы уменьшаем `length` вручную, массив укорачивается. From 7a29dd7b30799996ba15e3e865b6c3b596660790 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 11:53:40 +0600 Subject: [PATCH 0322/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/04-object-basics/08-symbol/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/08-symbol/article.md b/1-js/04-object-basics/08-symbol/article.md index b4e2441208..d2921a6053 100644 --- a/1-js/04-object-basics/08-symbol/article.md +++ b/1-js/04-object-basics/08-symbol/article.md @@ -16,7 +16,7 @@ let id = Symbol(); ``` -При создании символам можно дать описание (также называемое имя), в основном использующееся для отладки кода: +При создании символам можно дать описание (также называемые именами), в основном использующееся для отладки кода: ```js run // Создаём символ id с описанием (именем) "id" From 2e98903099a4848e901d3e6cc5daecca0c330665 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 15:36:19 +0600 Subject: [PATCH 0323/1128] Update TRANSLATION.md --- TRANSLATION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TRANSLATION.md b/TRANSLATION.md index 8114e72f34..cb399bb23b 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -86,6 +86,7 @@ document.querySelector('.hello').innerHTML = text; | Functionality | Функциональность | | Left click/right click | Левый/правый клик? Кликните? левой кнопкой мыши | | More in / Details in | Подробнее в | +| Nullish coalescing operator | Оператор нулевого слияния | | Script | Скрипт | | Statement | Инструкция | | Summary | Итого | From 77884b8ee0ef8ba6b9351c3aca34030387758cc4 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 18:55:25 +0600 Subject: [PATCH 0324/1128] =?UTF-8?q?=E2=9C=85=20just=20make=20first=20let?= =?UTF-8?q?ters=20uppercase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/04-array/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 6466aa6410..4cee21e266 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -479,8 +479,8 @@ alert( "1,2" + 1 ); // "1,21" Получение элементов: -- мы можем получить элемент по его индексу, например `arr[0]`. -- также мы можем использовать метод `at(i)` для получения элементов с отрицательным индексом, для отрицательных значений `i`, он отступает от конца массива. В остальном он работает так же, как `arr[i]`, если `i >= 0`. +- Мы можем получить элемент по его индексу, например `arr[0]`. +- Также мы можем использовать метод `at(i)` для получения элементов с отрицательным индексом, для отрицательных значений `i`, он отступает от конца массива. В остальном он работает так же, как `arr[i]`, если `i >= 0`. Мы можем использовать массив как двустороннюю очередь, используя следующие операции: From f54f28b68ecd43b41bbbeca41ffac212239143a9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sat, 21 May 2022 18:59:59 +0600 Subject: [PATCH 0325/1128] =?UTF-8?q?=F0=9F=91=BE=20add=20some=20informati?= =?UTF-8?q?on=20to=20data=20object=20article?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/11-date/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index f33c2b4eee..523e715c1a 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -57,7 +57,7 @@ `new Date(year, month, date, hours, minutes, seconds, ms)` : Создать объект `Date` с заданными компонентами в местном часовом поясе. Обязательны только первые два аргумента. - - `year` должен состоять из четырёх цифр: значение `2013` корректно, `98` -- нет. + - `year` должен состоять из четырёх цифр. Для совместимости также принимаются 2 цифры и рассматриваются `19xx`, к примеру, `98` здесь это тоже самое что и `1998`, но настоятельно рекомендуется всегда использовать 4 цифры. - `month` начинается с `0` (январь) по `11` (декабрь). - Параметр `date` здесь представляет собой день месяца. Если параметр не задан, то принимается значение `1`. - Если параметры `hours/minutes/seconds/ms` отсутствуют, их значением становится `0`. From a117261614f9cb5b57f56003143e83b88704cfc0 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 22 May 2022 13:14:01 +0600 Subject: [PATCH 0326/1128] =?UTF-8?q?=F0=9F=91=BE=20made=20the=20requested?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/11-date/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 523e715c1a..1e68c26944 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -57,7 +57,7 @@ `new Date(year, month, date, hours, minutes, seconds, ms)` : Создать объект `Date` с заданными компонентами в местном часовом поясе. Обязательны только первые два аргумента. - - `year` должен состоять из четырёх цифр. Для совместимости также принимаются 2 цифры и рассматриваются `19xx`, к примеру, `98` здесь это тоже самое что и `1998`, но настоятельно рекомендуется всегда использовать 4 цифры. + - `year` должен состоять из четырёх цифр. Для совместимости также принимаются 2 цифры и рассматриваются как `19xx`, к примеру, `98` здесь это тоже самое, что и `1998`, но настоятельно рекомендуется всегда использовать 4 цифры. - `month` начинается с `0` (январь) по `11` (декабрь). - Параметр `date` здесь представляет собой день месяца. Если параметр не задан, то принимается значение `1`. - Если параметры `hours/minutes/seconds/ms` отсутствуют, их значением становится `0`. From 2394bd15174601e14fabd06b0a172a71b4c339ff Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 22 May 2022 13:17:29 +0600 Subject: [PATCH 0327/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/03-code-quality/03-comments/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/03-code-quality/03-comments/article.md b/1-js/03-code-quality/03-comments/article.md index 30fbca6d0b..235b287d6c 100644 --- a/1-js/03-code-quality/03-comments/article.md +++ b/1-js/03-code-quality/03-comments/article.md @@ -143,7 +143,7 @@ function pow(x, n) { Кстати, многие редакторы, такие как [WebStorm](https://www.jetbrains.com/webstorm/), прекрасно их распознают для того, чтобы выполнить автодополнение ввода и различные автоматические проверки кода. -Также существуют инструменты, например, [JSDoc 3](https://github.com/jsdoc3/jsdoc), которые умеют генерировать HTML-документацию из комментариев. Получить больше информации о JSDoc вы можете здесь: />. +Также существуют инструменты, например, [JSDoc 3](https://github.com/jsdoc/jsdoc), которые умеют генерировать HTML-документацию из комментариев. Получить больше информации о JSDoc вы можете здесь: />. Почему задача решена именно таким способом? : Важно то, что написано. Но то, что *не* написано, может быть даже более важным, чтобы понимать происходящее. Почему задача решена именно этим способом? Код не даёт ответа. From a8f8b052b453f70cebc0e82ce5433b2e98d094fc Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 22 May 2022 13:18:04 +0600 Subject: [PATCH 0328/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/04-object-basics/08-symbol/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/08-symbol/article.md b/1-js/04-object-basics/08-symbol/article.md index d2921a6053..6edf9869ce 100644 --- a/1-js/04-object-basics/08-symbol/article.md +++ b/1-js/04-object-basics/08-symbol/article.md @@ -16,7 +16,7 @@ let id = Symbol(); ``` -При создании символам можно дать описание (также называемые именами), в основном использующееся для отладки кода: +При создании, символу можно дать описание (также называемое имя), в основном использующееся для отладки кода: ```js run // Создаём символ id с описанием (именем) "id" From 7f5c74bda3731a16cd209135513bc6702fc7f4ed Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Sun, 22 May 2022 13:20:43 +0600 Subject: [PATCH 0329/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/01-getting-started/3-code-editors/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/01-getting-started/3-code-editors/article.md b/1-js/01-getting-started/3-code-editors/article.md index e2d4165303..a49042780b 100644 --- a/1-js/01-getting-started/3-code-editors/article.md +++ b/1-js/01-getting-started/3-code-editors/article.md @@ -12,8 +12,8 @@ IDE загружает проект (который может состоять Если вы ещё не выбрали себе IDE, присмотритесь к этим: -- [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенный, бесплатно). -- [WebStorm](http://www.jetbrains.com/webstorm/) (кросс-платформенный, платно). +- [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенная, бесплатная). +- [WebStorm](http://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). Для Windows есть ещё Visual Studio (не путать с Visual Studio Code). Visual Studio - это платная мощная среда разработки, которая работает только на Windows. Она хорошо подходит для .NET платформы. У неё есть бесплатная версия, которая называется [Visual Studio Community](https://www.visualstudio.com/vs/community/). From fd126fd57b54110ff792721fe693426e5160ba70 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 24 May 2022 00:18:13 +0600 Subject: [PATCH 0330/1128] =?UTF-8?q?=F0=9F=91=BE=20made=20the=20requested?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/08-prototypes/01-prototype-inheritance/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/08-prototypes/01-prototype-inheritance/article.md b/1-js/08-prototypes/01-prototype-inheritance/article.md index 3d9068f2a7..4f42eaccf9 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/article.md +++ b/1-js/08-prototypes/01-prototype-inheritance/article.md @@ -136,7 +136,7 @@ alert(longEar.jumps); // true (из rabbit) Обратите внимание, что `__proto__` — *не то же самое*, что внутреннее свойство `[[Prototype]]`. Это геттер/сеттер для `[[Prototype]]`. Позже мы увидим ситуации, когда это имеет значение, а пока давайте просто будем иметь это в виду, поскольку мы строим наше понимание языка JavaScript. -Свойство `__proto__` немного устарело. Он существует по историческим причинам, современный JavaScript предполагает, что мы должны использовать функции `Object.getPrototypeOf/Object.setPrototypeOf` вместо того, чтобы получать/устанавливать прототип. Мы также рассмотрим эти функции позже. +Свойство `__proto__` немного устарело, оно существует по историческим причинам. Современный JavaScript предполагает, что мы должны использовать функции `Object.getPrototypeOf/Object.setPrototypeOf` вместо того, чтобы получать/устанавливать прототип. Мы также рассмотрим эти функции позже. По спецификации `__proto__` должен поддерживаться только браузерами, но по факту все среды, включая серверную, поддерживают его. Так что мы вполне безопасно его используем. From cecdc9a02eb70c6da4b851914777fc399a47f26d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 24 May 2022 00:42:00 +0600 Subject: [PATCH 0331/1128] =?UTF-8?q?=F0=9F=91=BE=20fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 227224cba4..ea79e0af38 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -169,7 +169,7 @@ alert( arr.concat([3, 4], [5, 6]) ); // 1,2,3,4,5,6 alert( arr.concat([3, 4], 5, 6) ); // 1,2,3,4,5,6 ``` -Обычно он просто копирует элементы из массивов. Другие объекты, даже если они выглядят как массивы, добавляются как есть: +Обычно он копирует только элементы из массивов. Другие объекты, даже если они выглядят как массивы, добавляются как есть: ```js run let arr = [1, 2]; From 47404ac1c1a880b91f272c63c1b40fff7267a0c2 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 24 May 2022 01:01:23 +0600 Subject: [PATCH 0332/1128] =?UTF-8?q?=F0=9F=91=BE=20another=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index ea79e0af38..401427ab47 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -182,7 +182,7 @@ let arrayLike = { alert( arr.concat(arrayLike) ); // 1,2,[object Object] ``` -...Но если объект имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается `concat` как массив: вместо него добавляются его числовые свойства. +...Но если объект имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается `concat` как массив: вместо него добавляются его элементы. Для корректной обработки в объекте должны быть числовые свойства и `length`: From 6015a283ffe7f8360e94255f4f633333c9de77a7 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 20:02:45 +0600 Subject: [PATCH 0333/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/13-while-for/article.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index aae5803645..7e03d64691 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -322,6 +322,7 @@ alert('Готово!'); Обычный `break` после `input` лишь прервёт внутренний цикл, но этого недостаточно. Достичь желаемого поведения можно с помощью меток. *Метка* имеет вид идентификатора с двоеточием перед циклом: + ```js labelName: for (...) { ... @@ -362,6 +363,7 @@ for (let i = 0; i < 3; i++) { ... } Метки не дают возможности передавать управление в произвольное место кода. Например, нет возможности сделать следующее: + ```js break label; // не прыгает к метке ниже @@ -369,6 +371,7 @@ label: for (...) ``` Директива `break` должна находиться внутри блока кода. Технически, подойдет любой маркированный блок кода, например: + ```js label: { // ... From 5bdea0f0dba6ed7377567aa710da7de94e540b0e Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 20:09:42 +0600 Subject: [PATCH 0334/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/13-while-for/article.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index 7e03d64691..a9a94290ed 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -162,10 +162,8 @@ for (i = 0; i < 3; i++) { // используем существующую пе alert(i); // 3, переменная доступна, т.к. была объявлена снаружи цикла ``` - ```` - ### Пропуск частей "for" Любая часть `for` может быть пропущена. From ada446725ec926d3de764f78389eabd090f25290 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 20:23:25 +0600 Subject: [PATCH 0335/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/13-while-for/article.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index a9a94290ed..07dd7f15ac 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -114,14 +114,14 @@ for (let i = 0; i < 3; i++) { // выведет 0, затем 1, затем 2 В целом, алгоритм работы цикла выглядит следующим образом: ``` -Выполнить *начало* -→ (Если *условие* == true → Выполнить *тело*, Выполнить *шаг*) -→ (Если *условие* == true → Выполнить *тело*, Выполнить *шаг*) -→ (Если *условие* == true → Выполнить *тело*, Выполнить *шаг*) +Выполнить начало +→ (Если условие == true → Выполнить тело, Выполнить шаг) +→ (Если условие == true → Выполнить тело, Выполнить шаг) +→ (Если условие == true → Выполнить тело, Выполнить шаг) → ... ``` -То есть, *начало* выполняется один раз, а затем каждая итерация заключается в проверке *условия*, после которой выполняется *тело* и *шаг*. +То есть, `начало` выполняется один раз, а затем каждая итерация заключается в проверке `условия`, после которой выполняется `тело` и `шаг`. Если тема циклов для вас нова, может быть полезным вернуться к примеру выше и воспроизвести его работу на листе бумаги, шаг за шагом. @@ -284,7 +284,6 @@ if (i > 5) { ...и перепишем его, используя вопросительный знак: - ```js no-beautify (i > 5) ? alert(i) : *!*continue*/!*; // continue здесь приведёт к ошибке ``` @@ -308,7 +307,6 @@ for (let i = 0; i < 3; i++) { let input = prompt(`Значение на координатах (${i},${j})`, ''); // Что если мы захотим перейти к Готово (ниже) прямо отсюда? - } } @@ -346,7 +344,9 @@ labelName: for (...) { alert('Готово!'); ``` -В примере выше это означает, что вызовом `break outer` будет разорван внешний цикл до метки с именем `outer`, и управление перейдёт со строки, помеченной `(*)`, к `alert('Готово!')`. +В примере выше это означает, что вызовом `break outer` будет разорван внешний цикл до метки с именем `outer` + +Таким образом управление перейдёт со строки, помеченной `(*)`, к `alert('Готово!')`. Можно размещать метку на отдельной строке: From 7b7d0dcc84a37c64bf4ffe45c6462fc9ae5d23b2 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 20:24:53 +0600 Subject: [PATCH 0336/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/13-while-for/article.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/1-js/02-first-steps/13-while-for/article.md b/1-js/02-first-steps/13-while-for/article.md index 07dd7f15ac..e04bfe6786 100644 --- a/1-js/02-first-steps/13-while-for/article.md +++ b/1-js/02-first-steps/13-while-for/article.md @@ -344,7 +344,7 @@ labelName: for (...) { alert('Готово!'); ``` -В примере выше это означает, что вызовом `break outer` будет разорван внешний цикл до метки с именем `outer` +В примере выше это означает, что вызовом `break outer` будет разорван внешний цикл до метки с именем `outer`. Таким образом управление перейдёт со строки, помеченной `(*)`, к `alert('Готово!')`. @@ -396,5 +396,3 @@ label: { Если на данной итерации цикла делать больше ничего не надо, но полностью прекращать цикл не следует – используют директиву `continue`. Обе этих директивы поддерживают *метки*, которые ставятся перед циклом. Метки – единственный способ для `break/continue` выйти за пределы текущего цикла, повлиять на выполнение внешнего. - -Заметим, что метки не позволяют прыгнуть в произвольное место кода, в JavaScript нет такой возможности. From e0cac07e48e5559e0696d391e23a538c02ac6c41 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 20:30:01 +0600 Subject: [PATCH 0337/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/12-json/article.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index 314f058402..a9d73e5a31 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -104,7 +104,7 @@ JSON является независимой от языка специфика А именно: - Свойства-функции (методы). -- Символьные свойства. +- Символьные ключи и значения. - Свойства, содержащие `undefined`. ```js run @@ -275,6 +275,7 @@ name: John name: Alice place: [object Object] number: 23 +occupiedBy: [object Object] */ ``` @@ -327,7 +328,9 @@ alert(JSON.stringify(user, null, 2)); */ ``` -Параметр `space` применяется для логирования и красивого вывода. +Третьим аргументом также может быть строка. В этом случае строка будет использоваться для отступа вместо ряда пробелов. + +Параметр `space` применяется исключительно для логирования и красивого вывода. ## Пользовательский "toJSON" From b20b9c6804b4680f6d3d042e2d0073c9c9bd6891 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 20:30:34 +0600 Subject: [PATCH 0338/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/12-json/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index a9d73e5a31..beaa78470c 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -27,7 +27,7 @@ alert(user); // {name: "John", age: 30} ## JSON.stringify -[JSON](https://ru.wikipedia.org/wiki/JSON) (JavaScript Object Notation) - это общий формат для представления значений и объектов. Его описание задокументировано в стандарте [RFC 4627](http://tools.ietf.org/html/rfc4627). Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java или любом другом языке. +[JSON](https://ru.wikipedia.org/wiki/JSON) (JavaScript Object Notation) - это общий формат для представления значений и объектов. Его описание задокументировано в стандарте [RFC 4627](https://tools.ietf.org/html/rfc4627). Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java или любом другом языке. JavaScript предоставляет методы: From 6af64f8104ddd75d0a4263854aec04085dc7307b Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 27 May 2022 21:05:36 +0600 Subject: [PATCH 0339/1128] =?UTF-8?q?=F0=9F=91=BE=20svgs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/01-getting-started/1-intro/article.md | 6 +- .../1-intro/limitations.svg | 2 +- .../2-manuals-specifications/article.md | 4 +- .../3-code-editors/article.md | 4 +- 1-js/02-first-steps/04-variables/article.md | 2 +- .../04-variables/variable-change.svg | 2 +- 1-js/02-first-steps/04-variables/variable.svg | 2 +- .../2-check-standard/ifelse_task2.svg | 2 +- .../9-check-login/ifelse_task.svg | 2 +- .../chrome-open-sources.svg | 2 +- .../chrome-sources-breakpoint.svg | 2 +- .../chrome-sources-console.svg | 2 +- .../chrome-sources-debugger-pause.svg | 2 +- .../chrome-sources-debugger-trace-1.svg | 2 +- .../01-debugging-chrome/chrome-tabs.svg | 2 +- .../01-debugging-chrome/largeIcons.svg | 4 +- .../02-coding-style/code-style.svg | 2 +- .../01-object/object-user-delete.svg | 2 +- .../01-object/object-user-empty.svg | 2 +- .../01-object/object-user-isadmin.svg | 2 +- .../01-object/object-user-props.svg | 2 +- .../01-object/object-user.svg | 2 +- 1-js/04-object-basics/01-object/object.svg | 2 +- .../variable-contains-reference.svg | 2 +- .../variable-copy-reference.svg | 2 +- .../02-object-copy/variable-copy-value.svg | 2 +- .../family-delete-refs.svg | 2 +- .../family-no-family.svg | 2 +- .../family-no-father-2.svg | 2 +- .../family-no-father.svg | 2 +- .../03-garbage-collection/family.svg | 2 +- .../garbage-collection-1.svg | 2 +- .../garbage-collection-2.svg | 2 +- .../garbage-collection-3.svg | 2 +- .../garbage-collection-4.svg | 2 +- .../garbage-collection-5.svg | 2 +- .../memory-user-john-admin.svg | 2 +- .../memory-user-john-lost.svg | 2 +- .../memory-user-john.svg | 2 +- 1-js/05-data-types/04-array/array-pop.svg | 2 +- 1-js/05-data-types/04-array/array-shift.svg | 2 +- 1-js/05-data-types/04-array/array-speed.svg | 2 +- 1-js/05-data-types/04-array/queue.svg | 2 +- 1-js/05-data-types/04-array/stack.svg | 2 +- .../05-data-types/05-array-methods/reduce.svg | 2 +- .../destructuring-complex.svg | 2 +- 1-js/05-data-types/12-json/json-meetup.svg | 2 +- .../fibonacci-recursion-tree.svg | 2 +- .../01-recursion/linked-list-0.svg | 2 +- .../01-recursion/linked-list-remove-1.svg | 2 +- .../01-recursion/linked-list-split.svg | 2 +- .../01-recursion/linked-list.svg | 2 +- .../01-recursion/recursion-pow.svg | 2 +- .../01-recursion/recursive-salaries.svg | 2 +- .../8-make-army/lexenv-makearmy.svg | 2 +- .../03-closure/lexenv-if.svg | 2 +- .../lexenv-nested-makecounter-1.svg | 2 +- .../lexenv-nested-makecounter-2.svg | 2 +- .../lexenv-nested-makecounter-3.svg | 2 +- .../lexenv-nested-makecounter-4.svg | 2 +- .../lexenv-nested-makecounter-5.svg | 2 +- .../lexenv-nested-makecounter-6.svg | 2 +- .../03-closure/lexenv-nested-work.svg | 2 +- .../lexical-environment-global-2.svg | 2 +- .../lexical-environment-global-3.svg | 2 +- .../03-closure/lexical-environment-global.svg | 2 +- .../lexical-environment-simple-lookup.svg | 2 +- .../03-closure/lexical-environment-simple.svg | 2 +- .../03-closure/lexical-search-order.svg | 2 +- .../setinterval-interval.svg | 2 +- .../settimeout-interval.svg | 2 +- .../decorator-makecaching-wrapper.svg | 2 +- .../object-prototype-empty.svg | 2 +- .../proto-animal-rabbit-chain.svg | 2 +- .../proto-animal-rabbit-walk-2.svg | 2 +- .../proto-animal-rabbit-walk-3.svg | 2 +- .../proto-animal-rabbit-walk.svg | 2 +- .../proto-animal-rabbit.svg | 2 +- .../proto-user-admin.svg | 2 +- .../rabbit-animal-object.svg | 2 +- .../function-prototype-constructor.svg | 2 +- .../proto-constructor-animal-rabbit.svg | 2 +- .../rabbit-prototype-constructor.svg | 2 +- .../function-prototype-constructor.svg | 2 +- .../native-prototypes-array-tostring.svg | 2 +- .../native-prototypes-classes.svg | 2 +- .../object-prototype-1.svg | 2 +- .../object-prototype-null.svg | 2 +- .../03-native-prototypes/object-prototype.svg | 2 +- .../proto-constructor-animal-rabbit.svg | 2 +- .../rabbit-prototype-constructor.svg | 2 +- .../object-prototype-2.svg | 2 +- .../object-prototype-null.svg | 2 +- 1-js/09-classes/01-class/class-user.svg | 2 +- .../animal-rabbit-extends.svg | 2 +- .../class-inheritance-array-object.svg | 2 +- .../class-inheritance-rabbit-animal-2.svg | 2 +- .../class-inheritance-rabbit-animal.svg | 2 +- .../rabbit-animal-independent-animal.svg | 2 +- .../rabbit-animal-independent-rabbit.svg | 2 +- .../super-homeobject-wrong.svg | 2 +- .../02-class-inheritance/this-super-loop.svg | 2 +- .../rabbit-extends-object.svg | 2 +- .../animal-rabbit-static.svg | 2 +- .../object-date-inheritance.svg | 2 +- 1-js/09-classes/06-instanceof/instanceof.svg | 2 +- .../07-mixins/mixin-inheritance.svg | 2 +- .../1-try-catch/try-catch-flow.svg | 2 +- 1-js/11-async/01-callbacks/callback-hell.svg | 2 +- .../02-promise-basics/promise-reject-1.svg | 2 +- .../02-promise-basics/promise-resolve-1.svg | 2 +- .../promise-resolve-reject.svg | 2 +- .../promise-handler-variants.svg | 2 +- .../promise-then-chain.svg | 2 +- .../03-promise-chaining/promise-then-many.svg | 2 +- .../promise-then-chain.svg | 2 +- .../promise-then-many.svg | 2 +- .../07-microtask-queue/promiseQueue.svg | 2 +- .../1-generators/genYield2-2.svg | 2 +- .../1-generators/genYield2.svg | 2 +- .../1-generators/generateSequence-1.svg | 2 +- .../1-generators/generateSequence-2.svg | 2 +- .../1-generators/generateSequence-3.svg | 2 +- .../1-generators/generateSequence-4.svg | 2 +- .../01-proxy/proxy-inherit-admin.svg | 2 +- 1-js/99-js-misc/01-proxy/proxy-inherit.svg | 2 +- 1-js/99-js-misc/01-proxy/proxy.svg | 2 +- .../01-browser-environment/windowObjects.svg | 2 +- .../02-dom-nodes/toolbarButtonGlyphs.svg | 4 +- .../03-dom-navigation/dom-links-elements.svg | 2 +- .../03-dom-navigation/dom-links.svg | 2 +- .../dom-class-hierarchy.svg | 2 +- .../before-prepend-append-after.svg | 2 +- .../07-modifying-document/insert-adjacent.svg | 2 +- .../4-put-ball-in-center/field.svg | 2 +- .../09-size-and-scroll/metric-all.svg | 2 +- .../metric-client-left-top-rtl.svg | 2 +- .../metric-client-left-top.svg | 2 +- .../metric-client-width-height.svg | 2 +- .../metric-client-width-nopadding.svg | 2 +- .../09-size-and-scroll/metric-css.svg | 2 +- .../metric-offset-parent.svg | 2 +- .../metric-offset-width-height.svg | 2 +- .../09-size-and-scroll/metric-scroll-top.svg | 2 +- .../metric-scroll-width-height.svg | 2 +- .../document-client-width-height.svg | 2 +- .../11-coordinates/coordinates-negative.svg | 2 +- .../1-document/11-coordinates/coordinates.svg | 2 +- ...cument-and-window-coordinates-scrolled.svg | 2 +- .../04-move-ball-field/move-ball-coords.svg | 2 +- .../07-carousel/carousel1.svg | 2 +- .../07-carousel/carousel2.svg | 2 +- .../event-order-bubbling.svg | 2 +- .../02-bubbling-and-capturing/eventflow.svg | 2 +- .../03-event-delegation/bagua-bubble.svg | 2 +- .../mouseover-bubble-nested.svg | 2 +- .../mouseover-mouseout-from-outside.svg | 2 +- .../mouseover-mouseout-over-elems.svg | 2 +- .../mouseover-mouseout.svg | 2 +- .../mouseover-to-child.svg | 2 +- .../2-drag-heroes/solution.view/field.svg | 2 +- .../4-mouse-drag-and-drop/ball_shift.svg | 2 +- .../5-keyboard-events/german-layout.svg | 2 +- .../5-keyboard-events/us-layout.svg | 2 +- .../solution.view/placeholder.svg | 2 +- .../source.view/placeholder.svg | 2 +- .../1-form-elements/form-navigation.svg | 2 +- .../range-example-p-0-1.svg | 2 +- .../range-example-p-1-3.svg | 2 +- .../range-example-p-2-b-3-range.svg | 2 +- .../range-example-p-2-b-3.svg | 2 +- .../selection-direction-backward.svg | 2 +- .../selection-direction-forward.svg | 2 +- .../02-selection-range/selection-firefox.svg | 2 +- .../03-event-loop/eventLoop-full.svg | 2 +- 2-ui/99-ui-misc/03-event-loop/eventLoop.svg | 2 +- 20-css-for-js/10-box-sizing/border-box.svg | 2 +- .../8bit-integer-256.svg | 2 +- .../8bit-integer-257.svg | 2 +- .../arraybuffer-view-buffersource.svg | 2 +- .../arraybuffer-views.svg | 2 +- 4-binary/03-blob/blob.svg | 2 +- 5-network/01-fetch/logo-fetch.svg | 2 +- 5-network/03-fetch-progress/logo-fetch.svg | 2 +- .../cors-gmail-messages.svg | 2 +- .../xhr-another-domain.svg | 2 +- .../05-fetch-crossorigin/xhr-preflight.svg | 2 +- 5-network/06-fetch-api/logo-fetch.svg | 2 +- 5-network/07-url/url-object.svg | 2 +- 5-network/10-long-polling/long-polling.svg | 2 +- .../11-websocket/websocket-handshake.svg | 2 +- .../01-cookie/cookie-third-party-2.svg | 2 +- .../01-cookie/cookie-third-party-3.svg | 2 +- .../01-cookie/cookie-third-party.svg | 2 +- 6-data-storage/01-cookie/cookie-xsrf.svg | 2 +- .../03-indexeddb/indexeddb-cursor.svg | 2 +- .../03-indexeddb/indexeddb-index.svg | 2 +- .../03-indexeddb/indexeddb-structure.svg | 2 +- 7-animation/1-bezier-curve/bezier-car.svg | 2 +- 7-animation/1-bezier-curve/bezier-letter.svg | 2 +- 7-animation/1-bezier-curve/bezier-vase.svg | 2 +- 7-animation/1-bezier-curve/bezier2.svg | 2 +- 7-animation/1-bezier-curve/bezier3-draw1.svg | 2 +- 7-animation/1-bezier-curve/bezier3-draw2.svg | 2 +- 7-animation/1-bezier-curve/bezier3-e.svg | 2 +- 7-animation/1-bezier-curve/bezier3.svg | 2 +- 7-animation/1-bezier-curve/bezier4-e.svg | 2 +- 7-animation/1-bezier-curve/bezier4.svg | 2 +- 7-animation/1-bezier-curve/demo.svg | 4 +- .../2-animate-logo-bezier-css/bezier-up.svg | 2 +- .../2-css-animations/bezier-linear.svg | 2 +- .../2-css-animations/bezier-train-over.svg | 2 +- 7-animation/2-css-animations/ease-in-out.svg | 2 +- 7-animation/2-css-animations/ease-in.svg | 2 +- 7-animation/2-css-animations/ease-out.svg | 2 +- 7-animation/2-css-animations/ease.svg | 2 +- 7-animation/2-css-animations/train-curve.svg | 2 +- 7-animation/3-js-animation/back.svg | 2 +- 7-animation/3-js-animation/bezier-linear.svg | 2 +- 7-animation/3-js-animation/bounce-inout.svg | 2 +- 7-animation/3-js-animation/circ-ease.svg | 2 +- 7-animation/3-js-animation/circ.svg | 2 +- 7-animation/3-js-animation/elastic.svg | 2 +- 7-animation/3-js-animation/linear.svg | 2 +- 7-animation/3-js-animation/quad.svg | 2 +- 7-animation/3-js-animation/quint.svg | 2 +- .../web-components-twitter.svg | 2 +- .../shadow-dom-user-card.svg | 2 +- .../love-html5-classes.svg | 2 +- .../hello-java-boundaries.svg | 2 +- .../witch_greedy1.svg | 2 +- .../witch_greedy2.svg | 2 +- .../witch_greedy3.svg | 2 +- .../witch_greedy4.svg | 2 +- .../witch_greedy5.svg | 2 +- .../witch_greedy6.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy3.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy4.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy5.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy6.svg | 2 +- .../regexp-nested-groups-matches.svg | 2 +- .../regexp-nested-groups-pattern.svg | 2 +- 99-archive/064-bezier/demo.svg | 279 +++++++++++++++++- 99-archive/122-minification/my.svg | 2 +- README.md | 2 +- 245 files changed, 529 insertions(+), 252 deletions(-) diff --git a/1-js/01-getting-started/1-intro/article.md b/1-js/01-getting-started/1-intro/article.md index 809783d990..00c4d8761c 100644 --- a/1-js/01-getting-started/1-intro/article.md +++ b/1-js/01-getting-started/1-intro/article.md @@ -15,7 +15,7 @@ ```smart header="Почему JavaScript?" Когда JavaScript создавался, у него было другое имя - "LiveScript". Однако, язык Java был очень популярен в то время, и было решено, что позиционирование JavaScript как "младшего брата" Java будет полезно. -Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся [ECMAScript](http://ru.wikipedia.org/wiki/ECMAScript), и сейчас не имеет никакого отношения к Java. +Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся [ECMAScript](https://ru.wikipedia.org/wiki/ECMAScript), и сейчас не имеет никакого отношения к Java. ``` Сегодня JavaScript может выполняться не только в браузере, но и на сервере или на любом другом устройстве, которое имеет специальную программу, называющуюся ["движком" JavaScript](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript). @@ -107,8 +107,8 @@ JavaScript - это единственная браузерная техноло Примеры таких языков: - [CoffeeScript](http://coffeescript.org/) добавляет "синтаксический сахар" для JavaScript. Он вводит более короткий синтаксис, который позволяет писать чистый и лаконичный код. Обычно такое нравится Ruby-программистам. -- [TypeScript](http://www.typescriptlang.org/) концентрируется на добавлении "строгой типизации" для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft. -- [Flow](http://flow.org/) тоже добавляет типизацию, но иначе. Разработан Facebook. +- [TypeScript](https://www.typescriptlang.org//) концентрируется на добавлении "строгой типизации" для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft. +- [Flow](https://flow.org/) тоже добавляет типизацию, но иначе. Разработан Facebook. - [Dart](https://www.dartlang.org/) стоит особняком, потому что имеет собственный движок, работающий вне браузера (например, в мобильных приложениях). Первоначально был предложен Google, как замена JavaScript, но на данный момент необходима его транспиляция для запуска так же, как для вышеперечисленных языков. - [Brython](https://brython.info/) транспилирует Python в JavaScript, что позволяет писать приложения на чистом Python без JavaScript. diff --git a/1-js/01-getting-started/1-intro/limitations.svg b/1-js/01-getting-started/1-intro/limitations.svg index 76ea43fd7a..6dcdcf9b0d 100644 --- a/1-js/01-getting-started/1-intro/limitations.svg +++ b/1-js/01-getting-started/1-intro/limitations.svg @@ -1 +1 @@ -https://javascript.info<script> ... </script>https://gmail.comhttps://javascript.info \ No newline at end of file +https://javascript.info<script> ... </script>https://gmail.comhttps://javascript.info \ No newline at end of file diff --git a/1-js/01-getting-started/2-manuals-specifications/article.md b/1-js/01-getting-started/2-manuals-specifications/article.md index bc00e6fa23..e2c6e20226 100644 --- a/1-js/01-getting-started/2-manuals-specifications/article.md +++ b/1-js/01-getting-started/2-manuals-specifications/article.md @@ -24,7 +24,7 @@ Хотя зачастую вместо их сайта удобнее использовать какой-нибудь интернет-поисковик, вводя там запрос "MDN [что вы хотите найти]", например для поиска информации о функции `parseInt`. -- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . +- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . Так же, как и в предыдущем случае, можно использовать интернет-поиск, набирая фразы типа "RegExp MSDN" или "RegExp MSDN jscript". @@ -34,7 +34,7 @@ JavaScript -- это развивающийся язык, в который по Посмотреть, какие возможности поддерживаются в разных браузерах и других движках, можно в следующих источниках: -- - таблицы с информацией о поддержке по каждой возможности языка. Например, чтобы узнать, какие движки поддерживают современные криптографические функции, посетите: . +- - таблицы с информацией о поддержке по каждой возможности языка. Например, чтобы узнать, какие движки поддерживают современные криптографические функции, посетите: . - - таблица с возможностями языка и движками, которые их поддерживают и не поддерживают. Все эти ресурсы полезны в ежедневной работе программиста, так как они содержат ценную информацию о возможностях использования языка, их поддержке и так далее. diff --git a/1-js/01-getting-started/3-code-editors/article.md b/1-js/01-getting-started/3-code-editors/article.md index a49042780b..748c0427c5 100644 --- a/1-js/01-getting-started/3-code-editors/article.md +++ b/1-js/01-getting-started/3-code-editors/article.md @@ -13,7 +13,7 @@ IDE загружает проект (который может состоять Если вы ещё не выбрали себе IDE, присмотритесь к этим: - [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенная, бесплатная). -- [WebStorm](http://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). +- [WebStorm](https://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). Для Windows есть ещё Visual Studio (не путать с Visual Studio Code). Visual Studio - это платная мощная среда разработки, которая работает только на Windows. Она хорошо подходит для .NET платформы. У неё есть бесплатная версия, которая называется [Visual Studio Community](https://www.visualstudio.com/vs/community/). @@ -34,7 +34,7 @@ IDE загружает проект (который может состоять - [Atom](https://atom.io/) (кроссплатформенный, бесплатный). - [Sublime Text](http://www.sublimetext.com) (кроссплатформенный, условно-бесплатный). - [Notepad++](https://notepad-plus-plus.org/) (Windows, бесплатный). -- [Vim](http://www.vim.org/) и [Emacs](https://www.gnu.org/software/emacs/) тоже хороши, если знать, как ими пользоваться. +- [Vim](https://www.vim.org/) и [Emacs](https://www.gnu.org/software/emacs/) тоже хороши, если знать, как ими пользоваться. ## Не будем ссориться diff --git a/1-js/02-first-steps/04-variables/article.md b/1-js/02-first-steps/04-variables/article.md index 74c763dc83..3bb55e145c 100644 --- a/1-js/02-first-steps/04-variables/article.md +++ b/1-js/02-first-steps/04-variables/article.md @@ -151,7 +151,7 @@ let message = "Другое"; // SyntaxError: 'message' has already been declare ```` ```smart header="Функциональные языки программирования" -Примечательно, что существуют [функциональные](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) языки программирования, такие как [Scala](http://www.scala-lang.org/) или [Erlang](http://www.erlang.org/), которые запрещают изменять значение переменной. +Примечательно, что существуют [функциональные](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) языки программирования, такие как [Scala](https://www.scala-lang.org/) или [Erlang](https://www.erlang.org/), которые запрещают изменять значение переменной. В таких языках однажды сохранённое "в коробку" значение остаётся там навсегда. Если нам нужно сохранить что-то другое, язык заставляет нас создать новую коробку (объявить новую переменную). Мы не можем использовать старую переменную. diff --git a/1-js/02-first-steps/04-variables/variable-change.svg b/1-js/02-first-steps/04-variables/variable-change.svg index 1b26792380..ce16696252 100644 --- a/1-js/02-first-steps/04-variables/variable-change.svg +++ b/1-js/02-first-steps/04-variables/variable-change.svg @@ -1 +1 @@ -"World!""Hello!"message \ No newline at end of file +"World!""Hello!"message \ No newline at end of file diff --git a/1-js/02-first-steps/04-variables/variable.svg b/1-js/02-first-steps/04-variables/variable.svg index 1c3d8b0cbe..0010177d54 100644 --- a/1-js/02-first-steps/04-variables/variable.svg +++ b/1-js/02-first-steps/04-variables/variable.svg @@ -1 +1 @@ -"Hello!"message \ No newline at end of file +"Hello!"message \ No newline at end of file diff --git a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg index 2ef4442c7b..fcb6a93bd5 100644 --- a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg +++ b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg @@ -1 +1 @@ -НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное" название JavaScript?ДругоеECMAScript \ No newline at end of file +НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное" название JavaScript?ДругоеECMAScript \ No newline at end of file diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg b/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg index 319fa9ea1b..6c037c068f 100644 --- a/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg +++ b/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg @@ -1 +1 @@ -НачалоОтмененоОтмененоЗдравствуйте!Я вас не знаюНеверный парольКто там?Пароль?ОтменаОтменаАдминЯ ГлавныйДругоеДругое \ No newline at end of file +НачалоОтмененоОтмененоЗдравствуйте!Я вас не знаюНеверный парольКто там?Пароль?ОтменаОтменаАдминЯ ГлавныйДругоеДругое \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg index a850a00603..b5b7b91d74 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg @@ -1 +1 @@ -открыть исходные файлы \ No newline at end of file +открыть исходные файлы \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg index bef78e166d..1c0ccc4566 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg @@ -1 +1 @@ -вот списокточки останова \ No newline at end of file +вот списокточки останова \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg index d5d2a0b934..32adcd9515 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg index c5d92a7564..9231912f1c 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg @@ -1 +1 @@ -213посмотреть детали внешнего вызовасмотреть за выражениямитекущие переменные \ No newline at end of file +213посмотреть детали внешнего вызовасмотреть за выражениямитекущие переменные \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg index e9bccf2df7..28efad7e49 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg @@ -1 +1 @@ -вложенные вызовы \ No newline at end of file +вложенные вызовы \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg index 41a3d8784b..1d95bc8ac3 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg @@ -1 +1 @@ -213 \ No newline at end of file +213 \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg b/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg index 83303365bd..1fec9d526c 100644 --- a/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg +++ b/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg @@ -3,8 +3,8 @@ xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" + xmlns:svg="https://www.w3.org/2000/svg" + xmlns="https://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" diff --git a/1-js/03-code-quality/02-coding-style/code-style.svg b/1-js/03-code-quality/02-coding-style/code-style.svg index 23eff7f6b4..cc70607ea7 100644 --- a/1-js/03-code-quality/02-coding-style/code-style.svg +++ b/1-js/03-code-quality/02-coding-style/code-style.svg @@ -1 +1 @@ -2Без пробелов между именем функции и скобками между скобками и параметрамиОтступ 2 пробелаПробел после for/if/while…} else { без перевода строкиПробелы вокруг вложенного вызоваПустая строка Между логическими блокамиСтроки не очень длинныеТочка с запятой ; обязательнаПробелы вокруг операторовФигурная скобка { на той же строке, после пробелаПробел между аргументамиПробел между параметрами \ No newline at end of file +2Без пробелов между именем функции и скобками между скобками и параметрамиОтступ 2 пробелаПробел после for/if/while…} else { без перевода строкиПробелы вокруг вложенного вызоваПустая строка Между логическими блокамиСтроки не очень длинныеТочка с запятой ; обязательнаПробелы вокруг операторовФигурная скобка { на той же строке, после пробелаПробел между аргументамиПробел между параметрами \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-delete.svg b/1-js/04-object-basics/01-object/object-user-delete.svg index c5af7e7afc..6b336fa3f5 100644 --- a/1-js/04-object-basics/01-object/object-user-delete.svg +++ b/1-js/04-object-basics/01-object/object-user-delete.svg @@ -1 +1 @@ -nameisAdminuser \ No newline at end of file +nameisAdminuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-empty.svg b/1-js/04-object-basics/01-object/object-user-empty.svg index edde844cf5..f34e222ba1 100644 --- a/1-js/04-object-basics/01-object/object-user-empty.svg +++ b/1-js/04-object-basics/01-object/object-user-empty.svg @@ -1 +1 @@ -пустоuser \ No newline at end of file +пустоuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-isadmin.svg b/1-js/04-object-basics/01-object/object-user-isadmin.svg index e2cc0eaf15..aa2c703fe0 100644 --- a/1-js/04-object-basics/01-object/object-user-isadmin.svg +++ b/1-js/04-object-basics/01-object/object-user-isadmin.svg @@ -1 +1 @@ -nameageisAdminuser \ No newline at end of file +nameageisAdminuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-props.svg b/1-js/04-object-basics/01-object/object-user-props.svg index b3d5c9b71b..e6cc46f598 100644 --- a/1-js/04-object-basics/01-object/object-user-props.svg +++ b/1-js/04-object-basics/01-object/object-user-props.svg @@ -1 +1 @@ -nameagelikes birdsuser \ No newline at end of file +nameagelikes birdsuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user.svg b/1-js/04-object-basics/01-object/object-user.svg index f499fbc10f..f45ce98b53 100644 --- a/1-js/04-object-basics/01-object/object-user.svg +++ b/1-js/04-object-basics/01-object/object-user.svg @@ -1 +1 @@ -nameageuser \ No newline at end of file +nameageuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object.svg b/1-js/04-object-basics/01-object/object.svg index 47431a6e1f..8a1b7e63c8 100644 --- a/1-js/04-object-basics/01-object/object.svg +++ b/1-js/04-object-basics/01-object/object.svg @@ -1 +1 @@ -key1key2key3 \ No newline at end of file +key1key2key3 \ No newline at end of file diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 267f045785..971a679234 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -username \ No newline at end of file +username \ No newline at end of file diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index a847fb200e..b2ca57e06d 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -useradminname \ No newline at end of file +useradminname \ No newline at end of file diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index f12e7fc4c8..e24646b8d0 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Привет!"message"Привет!"phrase \ No newline at end of file +"Привет!"message"Привет!"phrase \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg b/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg index a582ca64b7..14bf46fc16 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg @@ -1 +1 @@ -<global variable>ObjectObjectwifefamilyname: "John"name: "Ann"motherObjectfatherhusband \ No newline at end of file +<global variable>ObjectObjectwifefamilyname: "John"name: "Ann"motherObjectfatherhusband \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-no-family.svg b/1-js/04-object-basics/03-garbage-collection/family-no-family.svg index c73dd6a48f..119958721a 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-no-family.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-no-family.svg @@ -1 +1 @@ -<global>ObjectObjectfatherwifename: "John"name: "Ann"motherObjecthusbandfamily: null \ No newline at end of file +<global>ObjectObjectfatherwifename: "John"name: "Ann"motherObjecthusbandfamily: null \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg b/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg index 6bd13c0e80..272387450b 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg @@ -1 +1 @@ -Objectfamilyname: "Ann"motherObject<global> \ No newline at end of file +Objectfamilyname: "Ann"motherObject<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-no-father.svg b/1-js/04-object-basics/03-garbage-collection/family-no-father.svg index fd1f206073..cf7f32e866 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-no-father.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-no-father.svg @@ -1 +1 @@ -ObjectObjectwifefamilyname: "John"name: "Ann"motherObject<global> \ No newline at end of file +ObjectObjectwifefamilyname: "John"name: "Ann"motherObject<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family.svg b/1-js/04-object-basics/03-garbage-collection/family.svg index fd05348740..4787a3c0ba 100644 --- a/1-js/04-object-basics/03-garbage-collection/family.svg +++ b/1-js/04-object-basics/03-garbage-collection/family.svg @@ -1 +1 @@ -ObjectObjectfatherwifefamilyname: "John"name: "Ann"motherObjecthusband<global variable> \ No newline at end of file +ObjectObjectfatherwifefamilyname: "John"name: "Ann"motherObjecthusband<global variable> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg index 5cac52e9a9..343674c6ff 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg index 7dd3a693a8..61c1fa4b36 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg index 1060577874..e654b8f364 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg index bd485adeeb..179a5b4a9f 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg index 6de756f7cf..bf5dcaeb14 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg @@ -1 +1 @@ -<global>недостижимые \ No newline at end of file +<global>недостижимые \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg b/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg index 1913243548..f58bc593fc 100644 --- a/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg +++ b/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg @@ -1 +1 @@ -username: "John"Objectadmin<global> \ No newline at end of file +username: "John"Objectadmin<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg b/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg index 07914a9ca0..69e74a8905 100644 --- a/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg +++ b/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg @@ -1 +1 @@ -name: "John"Objectuser: null<global> \ No newline at end of file +name: "John"Objectuser: null<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg b/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg index 15bd51afb1..e308ffce7b 100644 --- a/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg +++ b/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg @@ -1 +1 @@ -username: "John"Object<global> \ No newline at end of file +username: "John"Object<global> \ No newline at end of file diff --git a/1-js/05-data-types/04-array/array-pop.svg b/1-js/05-data-types/04-array/array-pop.svg index b97b0c5c97..a73a0582e7 100644 --- a/1-js/05-data-types/04-array/array-pop.svg +++ b/1-js/05-data-types/04-array/array-pop.svg @@ -1 +1 @@ -0123"Apple""Orange""Pear""Lemon"length = 4очистить012"Apple""Orange""Pear"length = 3 \ No newline at end of file +0123"Apple""Orange""Pear""Lemon"length = 4очистить012"Apple""Orange""Pear"length = 3 \ No newline at end of file diff --git a/1-js/05-data-types/04-array/array-shift.svg b/1-js/05-data-types/04-array/array-shift.svg index 5319324c5b..6cc86540d8 100644 --- a/1-js/05-data-types/04-array/array-shift.svg +++ b/1-js/05-data-types/04-array/array-shift.svg @@ -1 +1 @@ -123"Orange""Pear""Lemon"length = 423"Orange""Pear""Lemon"length = 3очиститьпередвинуть элементы влево0"Apple"012"Orange""Pear""Lemon"11 \ No newline at end of file +123"Orange""Pear""Lemon"length = 423"Orange""Pear""Lemon"length = 3очиститьпередвинуть элементы влево0"Apple"012"Orange""Pear""Lemon"11 \ No newline at end of file diff --git a/1-js/05-data-types/04-array/array-speed.svg b/1-js/05-data-types/04-array/array-speed.svg index 41f7d998b4..05813cda9b 100644 --- a/1-js/05-data-types/04-array/array-speed.svg +++ b/1-js/05-data-types/04-array/array-speed.svg @@ -1 +1 @@ -0123popunshiftpushshift \ No newline at end of file +0123popunshiftpushshift \ No newline at end of file diff --git a/1-js/05-data-types/04-array/queue.svg b/1-js/05-data-types/04-array/queue.svg index e89a3dcd2d..862b869083 100644 --- a/1-js/05-data-types/04-array/queue.svg +++ b/1-js/05-data-types/04-array/queue.svg @@ -1 +1 @@ -pushshift \ No newline at end of file +pushshift \ No newline at end of file diff --git a/1-js/05-data-types/04-array/stack.svg b/1-js/05-data-types/04-array/stack.svg index ae0c474d0f..851b1ad5b3 100644 --- a/1-js/05-data-types/04-array/stack.svg +++ b/1-js/05-data-types/04-array/stack.svg @@ -1 +1 @@ -pushpop \ No newline at end of file +pushpop \ No newline at end of file diff --git a/1-js/05-data-types/05-array-methods/reduce.svg b/1-js/05-data-types/05-array-methods/reduce.svg index 180941dc29..f61f23663c 100644 --- a/1-js/05-data-types/05-array-methods/reduce.svg +++ b/1-js/05-data-types/05-array-methods/reduce.svg @@ -1 +1 @@ -1sum 0 current 12sum 0+1 current 23sum 0+1+2 current 34sum 0+1+2+3 current 45sum 0+1+2+3+4 current 50+1+2+3+4+5 = 15 \ No newline at end of file +1sum 0 current 12sum 0+1 current 23sum 0+1+2 current 34sum 0+1+2+3 current 45sum 0+1+2+3+4 current 50+1+2+3+4+5 = 15 \ No newline at end of file diff --git a/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg b/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg index 8a1ff1a934..512258c592 100644 --- a/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg +++ b/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/05-data-types/12-json/json-meetup.svg b/1-js/05-data-types/12-json/json-meetup.svg index 3fa32a261c..e7c4644f66 100644 --- a/1-js/05-data-types/12-json/json-meetup.svg +++ b/1-js/05-data-types/12-json/json-meetup.svg @@ -1 +1 @@ -number: 23title: "Conference"...placeoccupiedByparticipants \ No newline at end of file +number: 23title: "Conference"...placeoccupiedByparticipants \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg b/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg index 1313837f30..317dd8d335 100644 --- a/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg +++ b/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg @@ -1 +1 @@ -fib ( 5 )fib(4)fib(3)fib(3)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1) \ No newline at end of file +fib ( 5 )fib(4)fib(3)fib(3)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1) \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list-0.svg b/1-js/06-advanced-functions/01-recursion/linked-list-0.svg index 5d23c7a4c6..596636722e 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list-0.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list-0.svg @@ -1 +1 @@ -value1nextvalue"new item"nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file +value1nextvalue"new item"nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg b/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg index 2f37449c47..9a44ca1e85 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg @@ -1 +1 @@ -value"new item"nextvalue1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file +value"new item"nextvalue1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list-split.svg b/1-js/06-advanced-functions/01-recursion/linked-list-split.svg index 6c30721307..70fc7deef5 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list-split.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list-split.svg @@ -1 +1 @@ -value1nextvalue2nextvalue3nextvalue4nextnullnullsecondListlist \ No newline at end of file +value1nextvalue2nextvalue3nextvalue4nextnullnullsecondListlist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list.svg b/1-js/06-advanced-functions/01-recursion/linked-list.svg index c02744f390..fc47b0fc33 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list.svg @@ -1 +1 @@ -value1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file +value1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/recursion-pow.svg b/1-js/06-advanced-functions/01-recursion/recursion-pow.svg index 0901f76364..fc7abf5611 100644 --- a/1-js/06-advanced-functions/01-recursion/recursion-pow.svg +++ b/1-js/06-advanced-functions/01-recursion/recursion-pow.svg @@ -1 +1 @@ -pow(x,n)xx * pow(x, n-1)n == 1 ?ДаНетрекурсивный вызов до n==1 \ No newline at end of file +pow(x,n)xx * pow(x, n-1)n == 1 ?ДаНетрекурсивный вызов до n==1 \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg b/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg index bd874c5ba6..5d2aef0fee 100644 --- a/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg +++ b/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg b/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg index c488da0c2b..af0160ce46 100644 --- a/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg +++ b/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg @@ -1 +1 @@ -outeri: 0i: 1i: 2i: 10...makeArmy() LexicalEnvironmentблочный LexicalEnvironment \ No newline at end of file +outeri: 0i: 1i: 2i: 10...makeArmy() LexicalEnvironmentблочный LexicalEnvironment \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-if.svg b/1-js/06-advanced-functions/03-closure/lexenv-if.svg index 3d4d6d7ccf..e8a1596a41 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-if.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-if.svg @@ -1 +1 @@ -phrase: "Hello"outerouternulluser: "John" \ No newline at end of file +phrase: "Hello"outerouternulluser: "John" \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg index f15e77a888..5d693059fd 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg @@ -1 +1 @@ -makeCounter: function[[Environment]]outernull \ No newline at end of file +makeCounter: function[[Environment]]outernull \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg index 3cd8162cc1..ae0df652a2 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg @@ -1 +1 @@ -makeCounter: functioncounter: undefinedcount: 0outerouternullглобальное LexicalEnvironmentLexicalEnvironment вызова makeCounter() \ No newline at end of file +makeCounter: functioncounter: undefinedcount: 0outerouternullглобальное LexicalEnvironmentLexicalEnvironment вызова makeCounter() \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg index 54f1d97ba5..e443a7b61d 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg @@ -1 +1 @@ -makeCounter: functioncounter: undefinedcount: 0outerouternull[[Environment]] \ No newline at end of file +makeCounter: functioncounter: undefinedcount: 0outerouternull[[Environment]] \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg index fb60a785fa..1b1503655c 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg @@ -1 +1 @@ -makeCounter: functioncounter: functioncount: 0outerouternull[[Environment]] \ No newline at end of file +makeCounter: functioncounter: functioncount: 0outerouternull[[Environment]] \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg index 79c440da7a..24fcdb96bf 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg @@ -1 +1 @@ -makeCounter: functioncounter: functioncount: 0<empty>outerouterouternull[[Environment]] \ No newline at end of file +makeCounter: functioncounter: functioncount: 0<empty>outerouterouternull[[Environment]] \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg index f5a73aa0cb..6b4810ce32 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg @@ -1 +1 @@ -makeCounter: functioncounter: functioncount: 1outerouternull[[Environment]]изменено здесь \ No newline at end of file +makeCounter: functioncounter: functioncount: 1outerouternull[[Environment]]изменено здесь \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg index e5b7f83e78..81c9a5d62a 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg @@ -1 +1 @@ -makeWorker: function name: "John"<empty>outerouterouternullname: "Pete" \ No newline at end of file +makeWorker: function name: "John"<empty>outerouterouternullname: "Pete" \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg index 72d8f77f6b..5c4e265c2a 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg @@ -1 +1 @@ -phrase: "Bye"phrase: "Hello"phrase: undefined<empty>outernullначало выполнения \ No newline at end of file +phrase: "Bye"phrase: "Hello"phrase: undefined<empty>outernullначало выполнения \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg index e33d72adad..61d0afb475 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg @@ -1 +1 @@ -say: function phrase: "Hello"say: functionouternullначало выполнения \ No newline at end of file +say: function phrase: "Hello"say: functionouternullначало выполнения \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg index 9b032bc88b..514377b11a 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg @@ -1 +1 @@ -phrase: "Hello"outernullЛексическое Окружение \ No newline at end of file +phrase: "Hello"outernullЛексическое Окружение \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg index 79501a5b0c..5338e9da72 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg @@ -1 +1 @@ -say: function phrase: "Hello"name: "John"outerouternull \ No newline at end of file +say: function phrase: "Hello"name: "John"outerouternull \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg index 2778c0919a..c0e1d23400 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg @@ -1 +1 @@ -say: function phrase: "Hello"name: "John"outerouternullЛексическое Окружение вызова \ No newline at end of file +say: function phrase: "Hello"name: "John"outerouternullЛексическое Окружение вызова \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-search-order.svg b/1-js/06-advanced-functions/03-closure/lexical-search-order.svg index d9884ec4f1..2721484866 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-search-order.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-search-order.svg @@ -1 +1 @@ -123 \ No newline at end of file +123 \ No newline at end of file diff --git a/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg b/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg index bce7d6a843..e11136fe59 100644 --- a/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg +++ b/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg @@ -1 +1 @@ -func(1)func(2)func(3)100200300 \ No newline at end of file +func(1)func(2)func(3)100200300 \ No newline at end of file diff --git a/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg b/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg index d6d233b2ba..de8ca2616e 100644 --- a/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg +++ b/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg @@ -1 +1 @@ -func(1)func(2)func(3)100100 \ No newline at end of file +func(1)func(2)func(3)100100 \ No newline at end of file diff --git a/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg b/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg index 3d8428b273..f73b9f5924 100644 --- a/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg +++ b/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg @@ -1 +1 @@ -обёрткавокруг функции \ No newline at end of file +обёрткавокруг функции \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg b/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg index 982f2e4c17..d1db859bd6 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg @@ -1 +1 @@ -прототип objectobject[[Prototype]] \ No newline at end of file +прототип objectobject[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg index 4bf580ae77..c920cd0811 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg @@ -1 +1 @@ -eats: true walk: functionanimaljumps: truerabbit[[Prototype]]earLength: 10longEar[[Prototype]] \ No newline at end of file +eats: true walk: functionanimaljumps: truerabbit[[Prototype]]earLength: 10longEar[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg index 838c78395b..b895dbfc37 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg @@ -1 +1 @@ -eats: true walk: functionanimalwalk: functionrabbit[[Prototype]] \ No newline at end of file +eats: true walk: functionanimalwalk: functionrabbit[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg index e994331dab..ca51a037fd 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg @@ -1 +1 @@ -walk: function sleep: functionanimalrabbit[[Prototype]]name: "Белый кролик" isSleeping: true \ No newline at end of file +walk: function sleep: functionanimalrabbit[[Prototype]]name: "Белый кролик" isSleeping: true \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg index b324710286..8881694318 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg @@ -1 +1 @@ -eats: true walk: functionanimaljumps: truerabbit[[Prototype]] \ No newline at end of file +eats: true walk: functionanimaljumps: truerabbit[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg index 4f3c1bc0ec..26f7b9a00d 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg @@ -1 +1 @@ -eats: trueanimaljumps: truerabbit[[Prototype]] \ No newline at end of file +eats: trueanimaljumps: truerabbit[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg index bf0baf013a..a6fb69dd02 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg @@ -1 +1 @@ -name: "John" surname: "Smith" set fullName: functionisAdmin: true name: "Alice" surname: "Cooper"useradmin[[Prototype]] \ No newline at end of file +name: "John" surname: "Smith" set fullName: functionisAdmin: true name: "Alice" surname: "Cooper"useradmin[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg b/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg index 32a9858f83..b0dc7fc61c 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg @@ -1 +1 @@ -toString: function hasOwnProperty: function ...Object.prototypeanimal[[Prototype]][[Prototype]][[Prototype]]nulleats: truerabbitjumps: true \ No newline at end of file +toString: function hasOwnProperty: function ...Object.prototypeanimal[[Prototype]][[Prototype]][[Prototype]]nulleats: truerabbitjumps: true \ No newline at end of file diff --git a/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg b/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg index 1fced82b39..63678b02d5 100644 --- a/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg +++ b/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg @@ -1 +1 @@ -Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file +Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file diff --git a/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg b/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg index ede4e1227e..4e0188bd8a 100644 --- a/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg +++ b/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg @@ -1 +1 @@ -eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file +eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg b/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg index 2424ea648d..4ec43091b7 100644 --- a/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg +++ b/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg @@ -1 +1 @@ -"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file +"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg b/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg index 1fced82b39..63678b02d5 100644 --- a/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg +++ b/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg @@ -1 +1 @@ -Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file +Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg b/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg index ebb4f32051..c026f7a728 100644 --- a/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg +++ b/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg @@ -1 +1 @@ -toString: function ...Array.prototypetoString: function ...Object.prototype[[Prototype]][[Prototype]][1, 2, 3] \ No newline at end of file +toString: function ...Array.prototypetoString: function ...Object.prototype[[Prototype]][[Prototype]][1, 2, 3] \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg b/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg index 4d6129e0a0..d6fad88876 100644 --- a/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg +++ b/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg @@ -1 +1 @@ -toString: function other object methodsObject.prototypenullslice: function other array methods[[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]]Array.prototypecall: function other function methodsFunction.prototypetoFixed: function other number methodsNumber.prototype[1, 2, 3]function f(args) { ... }5 \ No newline at end of file +toString: function other object methodsObject.prototypenullslice: function other array methods[[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]]Array.prototypecall: function other function methodsFunction.prototypetoFixed: function other number methodsNumber.prototype[1, 2, 3]function f(args) { ... }5 \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg b/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg index 9630e68e27..f6ac8d8209 100644 --- a/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg +++ b/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg @@ -1 +1 @@ -constructor: Object toString: function ...Object.prototypeObjectobj = new Object()[[Prototype]]prototype \ No newline at end of file +constructor: Object toString: function ...Object.prototypeObjectobj = new Object()[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg b/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg index 9ccb342299..d4551c126a 100644 --- a/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg +++ b/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg @@ -1 +1 @@ -obj[[Prototype]]null \ No newline at end of file +obj[[Prototype]]null \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/object-prototype.svg b/1-js/08-prototypes/03-native-prototypes/object-prototype.svg index 024dd30213..c6e6774c5c 100644 --- a/1-js/08-prototypes/03-native-prototypes/object-prototype.svg +++ b/1-js/08-prototypes/03-native-prototypes/object-prototype.svg @@ -1 +1 @@ -constructor: Object toString: function ...Object.prototypeObjectprototype \ No newline at end of file +constructor: Object toString: function ...Object.prototypeObjectprototype \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg b/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg index ede4e1227e..4e0188bd8a 100644 --- a/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg +++ b/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg @@ -1 +1 @@ -eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file +eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg b/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg index 2424ea648d..4ec43091b7 100644 --- a/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg +++ b/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg @@ -1 +1 @@ -"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file +"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file diff --git a/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg b/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg index cf4d3023f8..b8e9e818b8 100644 --- a/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg +++ b/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg @@ -1 +1 @@ -... get __proto__: function set __proto__: functionObject.prototypeObjectobj[[Prototype]]prototype \ No newline at end of file +... get __proto__: function set __proto__: functionObject.prototypeObjectobj[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg b/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg index 9ccb342299..d4551c126a 100644 --- a/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg +++ b/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg @@ -1 +1 @@ -obj[[Prototype]]null \ No newline at end of file +obj[[Prototype]]null \ No newline at end of file diff --git a/1-js/09-classes/01-class/class-user.svg b/1-js/09-classes/01-class/class-user.svg index 418d71d187..977077a50b 100644 --- a/1-js/09-classes/01-class/class-user.svg +++ b/1-js/09-classes/01-class/class-user.svg @@ -1 +1 @@ -sayHi: functionUserUser.prototypeprototypeconstructor: User \ No newline at end of file +sayHi: functionUserUser.prototypeprototypeconstructor: User \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg b/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg index 203c59447a..c93c047712 100644 --- a/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg +++ b/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg @@ -1 +1 @@ -constructor: Animal run: function stop: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitnew Rabbit[[Prototype]][[Prototype]]prototypeprototypename: "Белый кролик"constructorconstructorextends \ No newline at end of file +constructor: Animal run: function stop: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitnew Rabbit[[Prototype]][[Prototype]]prototypeprototypename: "Белый кролик"constructorconstructorextends \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg b/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg index 5ea9bf29ea..4dd5b0dc02 100644 --- a/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg +++ b/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg @@ -1 +1 @@ -slice: function ...Array.prototypearrhasOwnProperty: function ...Object.prototype[1, 2, 3][[Prototype]][[Prototype]] \ No newline at end of file +slice: function ...Array.prototypearrhasOwnProperty: function ...Object.prototype[1, 2, 3][[Prototype]][[Prototype]] \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg index 2172088e64..14a81b6bcf 100644 --- a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg +++ b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg @@ -1 +1 @@ -jump: functionRabbit.prototyperabbiteat: functionAnimal.prototypename: "Белый кролик"[[Prototype]][[Prototype]]Rabbit.prototype.__proto__ = Animal.prototype sets thistoString: function hasOwnProperty: function ...Object.prototype[[Prototype]][[Prototype]]null \ No newline at end of file +jump: functionRabbit.prototyperabbiteat: functionAnimal.prototypename: "Белый кролик"[[Prototype]][[Prototype]]Rabbit.prototype.__proto__ = Animal.prototype sets thistoString: function hasOwnProperty: function ...Object.prototype[[Prototype]][[Prototype]]null \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg index 1b21dd81b5..5b00a1fb96 100644 --- a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg +++ b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg @@ -1 +1 @@ -методы RabbitRabbit.prototyperabbitметоды AnimalAnimal.prototype[[Prototype]][[Prototype]]свойства rabbit \ No newline at end of file +методы RabbitRabbit.prototyperabbitметоды AnimalAnimal.prototype[[Prototype]][[Prototype]]свойства rabbit \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg index 62b876d3ac..71d070e05c 100644 --- a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg +++ b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg @@ -1 +1 @@ - constructor: Animal run: function stop: functionAnimal.prototypeAnimalnew Animal[[Prototype]]prototypename: "Мой питомец" \ No newline at end of file + constructor: Animal run: function stop: functionAnimal.prototypeAnimalnew Animal[[Prototype]]prototypename: "Мой питомец" \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg index ff669d3d84..f42387effa 100644 --- a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg +++ b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg @@ -1 +1 @@ - constructor: Rabbit hide: functionRabbit.prototypeRabbitnew Rabbit[[Prototype]]prototypename: "Мой кролик" \ No newline at end of file + constructor: Rabbit hide: functionRabbit.prototypeRabbitnew Rabbit[[Prototype]]prototypename: "Мой кролик" \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg b/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg index f6450ddc49..fa747bd124 100644 --- a/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg +++ b/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg @@ -1 +1 @@ -sayHiplantsayHitreesayHianimalrabbit[[HomeObject]]sayHi \ No newline at end of file +sayHiplantsayHitreesayHianimalrabbit[[HomeObject]]sayHi \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/this-super-loop.svg b/1-js/09-classes/02-class-inheritance/this-super-loop.svg index 4f5f45034a..8f43d5967a 100644 --- a/1-js/09-classes/02-class-inheritance/this-super-loop.svg +++ b/1-js/09-classes/02-class-inheritance/this-super-loop.svg @@ -1 +1 @@ -rabbitlongEarrabbitlongEar \ No newline at end of file +rabbitlongEarrabbitlongEar \ No newline at end of file diff --git a/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg b/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg index 34d783b4de..a27a34800a 100644 --- a/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg +++ b/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg @@ -1 +1 @@ -call: function bind: function ...Function.prototypeconstructorObjectRabbit[[Prototype]][[Prototype]]constructorcall: function bind: function ...Function.prototypeRabbit[[Prototype]]constructorclass Rabbitclass Rabbit extends Object \ No newline at end of file +call: function bind: function ...Function.prototypeconstructorObjectRabbit[[Prototype]][[Prototype]]constructorcall: function bind: function ...Function.prototypeRabbit[[Prototype]]constructorclass Rabbitclass Rabbit extends Object \ No newline at end of file diff --git a/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg b/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg index ee1fc54748..95fdad628e 100644 --- a/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg +++ b/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg @@ -1 +1 @@ -constructor: Animal run: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitrabbit[[Prototype]][[Prototype]][[Prototype]]prototypeprototypecomparename: "Белый кролик" \ No newline at end of file +constructor: Animal run: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitrabbit[[Prototype]][[Prototype]][[Prototype]]prototypeprototypecomparename: "Белый кролик" \ No newline at end of file diff --git a/1-js/09-classes/05-extend-natives/object-date-inheritance.svg b/1-js/09-classes/05-extend-natives/object-date-inheritance.svg index be47d7fd96..3f2adcc8ec 100644 --- a/1-js/09-classes/05-extend-natives/object-date-inheritance.svg +++ b/1-js/09-classes/05-extend-natives/object-date-inheritance.svg @@ -1 +1 @@ -constructor: Object toString: function hasOwnProperty: function ...Object.prototypeconstructor: Date toString: function getDate: function ...Date.prototypeObjectDatenew Date()[[Prototype]][[Prototype]]prototypeprototypedefineProperty keys ...now parse ...1 Jan 2019 \ No newline at end of file +constructor: Object toString: function hasOwnProperty: function ...Object.prototypeconstructor: Date toString: function getDate: function ...Date.prototypeObjectDatenew Date()[[Prototype]][[Prototype]]prototypeprototypedefineProperty keys ...now parse ...1 Jan 2019 \ No newline at end of file diff --git a/1-js/09-classes/06-instanceof/instanceof.svg b/1-js/09-classes/06-instanceof/instanceof.svg index d63b03a8a2..61985bd68d 100644 --- a/1-js/09-classes/06-instanceof/instanceof.svg +++ b/1-js/09-classes/06-instanceof/instanceof.svg @@ -1 +1 @@ -Animal.prototypeObject.prototypeRabbit.prototype[[Prototype]]rabbit[[Prototype]][[Prototype]]null[[Prototype]]= Animal.prototype? \ No newline at end of file +Animal.prototypeObject.prototypeRabbit.prototype[[Prototype]]rabbit[[Prototype]][[Prototype]]null[[Prototype]]= Animal.prototype? \ No newline at end of file diff --git a/1-js/09-classes/07-mixins/mixin-inheritance.svg b/1-js/09-classes/07-mixins/mixin-inheritance.svg index 1fdc223936..cfe84ef577 100644 --- a/1-js/09-classes/07-mixins/mixin-inheritance.svg +++ b/1-js/09-classes/07-mixins/mixin-inheritance.svg @@ -1 +1 @@ -sayHi: function sayBye: functionsayHiMixinsay: functionsayMixin[[Prototype]]constructor: User sayHi: function sayBye: functionUser.prototype[[Prototype]]name: ...user[[HomeObject] \ No newline at end of file +sayHi: function sayBye: functionsayHiMixinsay: functionsayMixin[[Prototype]]constructor: User sayHi: function sayBye: functionUser.prototype[[Prototype]]name: ...user[[HomeObject] \ No newline at end of file diff --git a/1-js/10-error-handling/1-try-catch/try-catch-flow.svg b/1-js/10-error-handling/1-try-catch/try-catch-flow.svg index 8e6ca4d79c..f9c6e31d1d 100644 --- a/1-js/10-error-handling/1-try-catch/try-catch-flow.svg +++ b/1-js/10-error-handling/1-try-catch/try-catch-flow.svg @@ -1 +1 @@ -НачалоНет ошибокВ коде произошла ошибкаИгнорировать блок catchИгнорировать остаток tryВыполнить блок catchtry { }// код... \ No newline at end of file +НачалоНет ошибокВ коде произошла ошибкаИгнорировать блок catchИгнорировать остаток tryВыполнить блок catchtry { }// код... \ No newline at end of file diff --git a/1-js/11-async/01-callbacks/callback-hell.svg b/1-js/11-async/01-callbacks/callback-hell.svg index bd53e44322..6ce6eec906 100644 --- a/1-js/11-async/01-callbacks/callback-hell.svg +++ b/1-js/11-async/01-callbacks/callback-hell.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-reject-1.svg b/1-js/11-async/02-promise-basics/promise-reject-1.svg index 777e477394..a16ff536e7 100644 --- a/1-js/11-async/02-promise-basics/promise-reject-1.svg +++ b/1-js/11-async/02-promise-basics/promise-reject-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-1.svg b/1-js/11-async/02-promise-basics/promise-resolve-1.svg index f1f34eaee1..bf086402e2 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-1.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg index 80593a3a4b..13e7dc95f4 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file diff --git a/1-js/11-async/03-promise-chaining/promise-handler-variants.svg b/1-js/11-async/03-promise-chaining/promise-handler-variants.svg index cf5a2c7a69..9c327d8c6a 100644 --- a/1-js/11-async/03-promise-chaining/promise-handler-variants.svg +++ b/1-js/11-async/03-promise-chaining/promise-handler-variants.svg @@ -1 +1 @@ -возвратом значениявозвратом промисаошибкойstate: "fulfilled" result: valuestate: "rejected" result: error...с результатом нового промиса...state: "pending" result: undefinedвызов .then(handler) всегда возвращает промис:если handler заканчивается…этот промис завершается с: \ No newline at end of file +возвратом значениявозвратом промисаошибкойstate: "fulfilled" result: valuestate: "rejected" result: error...с результатом нового промиса...state: "pending" result: undefinedвызов .then(handler) всегда возвращает промис:если handler заканчивается…этот промис завершается с: \ No newline at end of file diff --git a/1-js/11-async/03-promise-chaining/promise-then-chain.svg b/1-js/11-async/03-promise-chaining/promise-then-chain.svg index fb60142fbd..5dcb55a4be 100644 --- a/1-js/11-async/03-promise-chaining/promise-then-chain.svg +++ b/1-js/11-async/03-promise-chaining/promise-then-chain.svg @@ -1 +1 @@ -.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file +.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file diff --git a/1-js/11-async/03-promise-chaining/promise-then-many.svg b/1-js/11-async/03-promise-chaining/promise-then-many.svg index 8fea7beaaf..cf2a813e75 100644 --- a/1-js/11-async/03-promise-chaining/promise-then-many.svg +++ b/1-js/11-async/03-promise-chaining/promise-then-many.svg @@ -1 +1 @@ -.thennew Promiseresolve(1).then.then \ No newline at end of file +.thennew Promiseresolve(1).then.then \ No newline at end of file diff --git a/1-js/11-async/04-promise-error-handling/promise-then-chain.svg b/1-js/11-async/04-promise-error-handling/promise-then-chain.svg index fb60142fbd..5dcb55a4be 100644 --- a/1-js/11-async/04-promise-error-handling/promise-then-chain.svg +++ b/1-js/11-async/04-promise-error-handling/promise-then-chain.svg @@ -1 +1 @@ -.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file +.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file diff --git a/1-js/11-async/04-promise-error-handling/promise-then-many.svg b/1-js/11-async/04-promise-error-handling/promise-then-many.svg index 8fea7beaaf..cf2a813e75 100644 --- a/1-js/11-async/04-promise-error-handling/promise-then-many.svg +++ b/1-js/11-async/04-promise-error-handling/promise-then-many.svg @@ -1 +1 @@ -.thennew Promiseresolve(1).then.then \ No newline at end of file +.thennew Promiseresolve(1).then.then \ No newline at end of file diff --git a/1-js/11-async/07-microtask-queue/promiseQueue.svg b/1-js/11-async/07-microtask-queue/promiseQueue.svg index d9df04d704..380671b91c 100644 --- a/1-js/11-async/07-microtask-queue/promiseQueue.svg +++ b/1-js/11-async/07-microtask-queue/promiseQueue.svg @@ -1 +1 @@ -promise . then ( handler ); ... alert ( "код завершён" );handler в очередизапускается handler из очередивыполнение скрипта завершено \ No newline at end of file +promise . then ( handler ); ... alert ( "код завершён" );handler в очередизапускается handler из очередивыполнение скрипта завершено \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/genYield2-2.svg b/1-js/12-generators-iterators/1-generators/genYield2-2.svg index e100650905..5103c1dded 100644 --- a/1-js/12-generators-iterators/1-generators/genYield2-2.svg +++ b/1-js/12-generators-iterators/1-generators/genYield2-2.svg @@ -1 +1 @@ -"2 + 2 = ?""3 * 3 = ?". next ( 4 ). next ( 9 )ГенераторВызывающий код \ No newline at end of file +"2 + 2 = ?""3 * 3 = ?". next ( 4 ). next ( 9 )ГенераторВызывающий код \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/genYield2.svg b/1-js/12-generators-iterators/1-generators/genYield2.svg index 9776156cd2..5570c39dd1 100644 --- a/1-js/12-generators-iterators/1-generators/genYield2.svg +++ b/1-js/12-generators-iterators/1-generators/genYield2.svg @@ -1 +1 @@ -question = "2 + 2 = ?"ГенераторВызывающий код.next(4) \ No newline at end of file +question = "2 + 2 = ?"ГенераторВызывающий код.next(4) \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-1.svg b/1-js/12-generators-iterators/1-generators/generateSequence-1.svg index 138df324cc..acf4ccc220 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-1.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-2.svg b/1-js/12-generators-iterators/1-generators/generateSequence-2.svg index 7478543a4b..c1dbcb84f1 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-2.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-2.svg @@ -1 +1 @@ -{value: 1, done: false} \ No newline at end of file +{value: 1, done: false} \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-3.svg b/1-js/12-generators-iterators/1-generators/generateSequence-3.svg index d32b114f98..04f9afe015 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-3.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-3.svg @@ -1 +1 @@ -{value: 2, done: false} \ No newline at end of file +{value: 2, done: false} \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-4.svg b/1-js/12-generators-iterators/1-generators/generateSequence-4.svg index 23049fcd21..d2fd93c9d9 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-4.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-4.svg @@ -1 +1 @@ -{value: 3, done: true} \ No newline at end of file +{value: 3, done: true} \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg b/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg index 8f75484e9c..1def75c6ba 100644 --- a/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg +++ b/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg @@ -1 +1 @@ -_name: "Guest" name: getter_name: "Admin"user (прокси)исходный useradmin[[Prototype]] \ No newline at end of file +_name: "Guest" name: getter_name: "Admin"user (прокси)исходный useradmin[[Prototype]] \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy-inherit.svg b/1-js/99-js-misc/01-proxy/proxy-inherit.svg index 9a5706c55e..ed773bfb81 100644 --- a/1-js/99-js-misc/01-proxy/proxy-inherit.svg +++ b/1-js/99-js-misc/01-proxy/proxy-inherit.svg @@ -1 +1 @@ -_name: "Guest" name: getteruser (прокси)исходный user \ No newline at end of file +_name: "Guest" name: getteruser (прокси)исходный user \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy.svg b/1-js/99-js-misc/01-proxy/proxy.svg index 157e350f44..86c9563321 100644 --- a/1-js/99-js-misc/01-proxy/proxy.svg +++ b/1-js/99-js-misc/01-proxy/proxy.svg @@ -1 +1 @@ -test: 5proxytargetget proxy.test5 \ No newline at end of file +test: 5proxytargetget proxy.test5 \ No newline at end of file diff --git a/2-ui/1-document/01-browser-environment/windowObjects.svg b/2-ui/1-document/01-browser-environment/windowObjects.svg index b7e18bb347..3dc3346753 100644 --- a/2-ui/1-document/01-browser-environment/windowObjects.svg +++ b/2-ui/1-document/01-browser-environment/windowObjects.svg @@ -1 +1 @@ -windowdocumentObjectnavigatorscreenlocationframeshistoryArrayFunctionXMLHttpRequestBOMJavaScriptDOM \ No newline at end of file +windowdocumentObjectnavigatorscreenlocationframeshistoryArrayFunctionXMLHttpRequestBOMJavaScriptDOM \ No newline at end of file diff --git a/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg b/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg index 5bdf20a83a..002e8fc830 100644 --- a/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg +++ b/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg @@ -4,8 +4,8 @@ xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" + xmlns:svg="https://www.w3.org/2000/svg" + xmlns="https://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" diff --git a/2-ui/1-document/03-dom-navigation/dom-links-elements.svg b/2-ui/1-document/03-dom-navigation/dom-links-elements.svg index fd0b2826a4..2a75ea447c 100644 --- a/2-ui/1-document/03-dom-navigation/dom-links-elements.svg +++ b/2-ui/1-document/03-dom-navigation/dom-links-elements.svg @@ -1 +1 @@ -document.documentElement <HTML>document.body (if inside body)parent Element<DIV>next Element Siblingprevious Element Siblingchildrenfirst Element Child last Element Child \ No newline at end of file +document.documentElement <HTML>document.body (if inside body)parent Element<DIV>next Element Siblingprevious Element Siblingchildrenfirst Element Child last Element Child \ No newline at end of file diff --git a/2-ui/1-document/03-dom-navigation/dom-links.svg b/2-ui/1-document/03-dom-navigation/dom-links.svg index 6c34bca4a4..24a9e0e689 100644 --- a/2-ui/1-document/03-dom-navigation/dom-links.svg +++ b/2-ui/1-document/03-dom-navigation/dom-links.svg @@ -1 +1 @@ -documentdocument.documentElement <HTML>document.body (if inside body)parentNode<DIV>nextSiblingpreviousSiblingchildNodesfirstChild lastChild \ No newline at end of file +documentdocument.documentElement <HTML>document.body (if inside body)parentNode<DIV>nextSiblingpreviousSiblingchildNodesfirstChild lastChild \ No newline at end of file diff --git a/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg b/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg index 39f7d8f8c3..2b63967dfa 100644 --- a/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg +++ b/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg @@ -1 +1 @@ -EventTargetNode Element HTMLElement HTMLBodyElement HTMLInputElement HTMLAnchorElement Text Comment SVGElement <div> Text </div><input type="…"><body><a href="…">< div > Text </ div ><!--comment--> \ No newline at end of file +EventTargetNode Element HTMLElement HTMLBodyElement HTMLInputElement HTMLAnchorElement Text Comment SVGElement <div> Text </div><input type="…"><body><a href="…">< div > Text </ div ><!--comment--> \ No newline at end of file diff --git a/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg b/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg index 0843713cec..f651c20e95 100644 --- a/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg +++ b/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg @@ -1 +1 @@ -ol.afterol.appendol.prependol.before(…nodes or strings) \ No newline at end of file +ol.afterol.appendol.prependol.before(…nodes or strings) \ No newline at end of file diff --git a/2-ui/1-document/07-modifying-document/insert-adjacent.svg b/2-ui/1-document/07-modifying-document/insert-adjacent.svg index e26fd023a1..fa8ad82845 100644 --- a/2-ui/1-document/07-modifying-document/insert-adjacent.svg +++ b/2-ui/1-document/07-modifying-document/insert-adjacent.svg @@ -1 +1 @@ -ol.insertAdjacentHTML(*, html)afterendbeforeendafterbeginbeforebegin \ No newline at end of file +ol.insertAdjacentHTML(*, html)afterendbeforeendafterbeginbeforebegin \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg b/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg index 4ae90b1c71..e263be16a5 100644 --- a/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg +++ b/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg @@ -1 +1 @@ -(0,0)clientWidth \ No newline at end of file +(0,0)clientWidth \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-all.svg b/2-ui/1-document/09-size-and-scroll/metric-all.svg index a5dadb47f0..e1078df769 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-all.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-all.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeightoffsetHeightscrollTopclientHeightoffsetTopclientLeftclientWidthclientTopoffsetLeftoffsetWidth \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeightoffsetHeightscrollTopclientHeightoffsetTopclientLeftclientWidthclientTopoffsetLeftoffsetWidth \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg b/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg index e8dd3d60a0..34d54ee9e3 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg @@ -1 +1 @@ -clientTop: 25px = borderclientLeft: 41px \ No newline at end of file +clientTop: 25px = borderclientLeft: 41px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg b/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg index 8097afa78f..cef29a882d 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.clientTop: 25px = borderclientLeft: 25px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.clientTop: 25px = borderclientLeft: 25px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg b/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg index 83864b4c57..d346616742 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg @@ -1 +1 @@ -border 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxclientWidth = 20+284+20 = 324pxclientHeight: 240pxheight: 200pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file +border 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxclientWidth = 20+284+20 = 324pxclientHeight: 240pxheight: 200pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg b/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg index 330d2a7c04..7b92735b0b 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg @@ -1 +1 @@ -clientWidth: 284px = content widthCSS width: 300pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with padding: 0; width: 300px; \ No newline at end of file +clientWidth: 284px = content widthCSS width: 300pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with padding: 0; width: 300px; \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-css.svg b/2-ui/1-document/09-size-and-scroll/metric-css.svg index 13aa62afd0..59861ff245 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-css.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-css.svg @@ -1 +1 @@ -padding: 20pxheight: 200pxpadding: 20pxborder 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file +padding: 20pxheight: 200pxpadding: 20pxborder 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg b/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg index 9e247639be..a0bdcef42b 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg @@ -1 +1 @@ -offsetTop: 180pxoffsetLeft: 180pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoftposition: absolute; left: 180px; top: 180px;offsetParent <MAIN> <DIV> \ No newline at end of file +offsetTop: 180pxoffsetLeft: 180pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoftposition: absolute; left: 180px; top: 180px;offsetParent <MAIN> <DIV> \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg b/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg index 49bdccda78..5af4b3980f 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg @@ -1 +1 @@ -border 25pxpadding 20pxcontent width: 284pxheight: 200pxborder 25pxpadding 20pxscrollbar 16pxoffsetWidth = 25+20+284+20+16+25 = 390pxoffsetHeight: 290pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file +border 25pxpadding 20pxcontent width: 284pxheight: 200pxborder 25pxpadding 20pxscrollbar 16pxoffsetWidth = 25+20+284+20+16+25 = 390pxoffsetHeight: 290pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg b/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg index c6d14d0f38..687b0cda55 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollTopscrollHeight: 723px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollTopscrollHeight: 723px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg b/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg index 0c3d299528..0fbb7d42a1 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeight: 723pxscrollWidth = 324px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeight: 723pxscrollWidth = 324px \ No newline at end of file diff --git a/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg b/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg index 829d27ee85..58a370d5b5 100644 --- a/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg +++ b/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg @@ -1 +1 @@ -documentElement.clientHeightdocumentElement.clientWidth \ No newline at end of file +documentElement.clientHeightdocumentElement.clientWidth \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/coordinates-negative.svg b/2-ui/1-document/11-coordinates/coordinates-negative.svg index 4f2e78687c..56c7a99571 100644 --- a/2-ui/1-document/11-coordinates/coordinates-negative.svg +++ b/2-ui/1-document/11-coordinates/coordinates-negative.svg @@ -1 +1 @@ -bottom(x,y)(x,y)leftrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top(width,height) \ No newline at end of file +bottom(x,y)(x,y)leftrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top(width,height) \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/coordinates.svg b/2-ui/1-document/11-coordinates/coordinates.svg index 261ff66966..ebebbec346 100644 --- a/2-ui/1-document/11-coordinates/coordinates.svg +++ b/2-ui/1-document/11-coordinates/coordinates.svg @@ -1 +1 @@ -heightbottomxleftywidthrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top \ No newline at end of file +heightbottomxleftywidthrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg b/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg index f03317f0c3..34ac00c7e7 100644 --- a/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg +++ b/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.😍pageYclientYpageXclientXIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.pageYclientYpageXclientX😍 \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.😍pageYclientYpageXclientXIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.pageYclientYpageXclientX😍 \ No newline at end of file diff --git a/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg b/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg index fc26b023c5..b6d24d9f69 100644 --- a/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg +++ b/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg @@ -1 +1 @@ -ball.style.left?fieldCoords.leftevent.clientX \ No newline at end of file +ball.style.left?fieldCoords.leftevent.clientX \ No newline at end of file diff --git a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg index 5bb161f6cb..11689456de 100644 --- a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg +++ b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg @@ -1 +1 @@ -div (container)130x130ul (width: 9999px) \ No newline at end of file +div (container)130x130ul (width: 9999px) \ No newline at end of file diff --git a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg index 81aea5b89e..8006cb3876 100644 --- a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg +++ b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg @@ -1 +1 @@ -div (container)130x130ul (margin-left: -350px) \ No newline at end of file +div (container)130x130ul (margin-left: -350px) \ No newline at end of file diff --git a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg index fd2a13f7bc..d9d5f96c06 100644 --- a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg +++ b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg @@ -1 +1 @@ -123Самый глубоко вложенный элемент \ No newline at end of file +123Самый глубоко вложенный элемент \ No newline at end of file diff --git a/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg b/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg index 566064cd6b..fd25c06bda 100644 --- a/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg +++ b/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg @@ -1 +1 @@ -WindowDocument<html><body><table><tbody><tr><tr><td>Shady Grove<td>Aeolian<td>Over the River,Charlie<td>DorianTargetPhase(2)CapturePhase(1)BubblingPhase(3) \ No newline at end of file +WindowDocument<html><body><table><tbody><tr><tr><td>Shady Grove<td>Aeolian<td>Over the River,Charlie<td>DorianTargetPhase(2)CapturePhase(1)BubblingPhase(3) \ No newline at end of file diff --git a/2-ui/2-events/03-event-delegation/bagua-bubble.svg b/2-ui/2-events/03-event-delegation/bagua-bubble.svg index 4ae67102dd..b6780147fc 100644 --- a/2-ui/2-events/03-event-delegation/bagua-bubble.svg +++ b/2-ui/2-events/03-event-delegation/bagua-bubble.svg @@ -1 +1 @@ -<table><td><strong>event.target \ No newline at end of file +<table><td><strong>event.target \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg index 6044eff17d..0509b7572a 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg @@ -1 +1 @@ -mouseoutmouseover#parent#child \ No newline at end of file +mouseoutmouseover#parent#child \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg index 22335b52e1..c3d5288efb 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg @@ -1 +1 @@ -#TOtargetrelatedTarget = null \ No newline at end of file +#TOtargetrelatedTarget = null \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg index 437f03b102..4b76476991 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg @@ -1 +1 @@ -#TO#FROM<DIV><DIV><DIV>mouseovermouseout \ No newline at end of file +#TO#FROM<DIV><DIV><DIV>mouseovermouseout \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg index 1277ddff55..0c32a8eeba 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg @@ -1 +1 @@ -<DIV>mouseovermouseout \ No newline at end of file +<DIV>mouseovermouseout \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg index 78210845b4..eff4f74fdd 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg @@ -1 +1 @@ -mouseoutmouseover#parent#child \ No newline at end of file +mouseoutmouseover#parent#child \ No newline at end of file diff --git a/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg b/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg index 4ae90b1c71..e263be16a5 100644 --- a/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg +++ b/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg @@ -1 +1 @@ -(0,0)clientWidth \ No newline at end of file +(0,0)clientWidth \ No newline at end of file diff --git a/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg b/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg index 29fdb31ef0..af7c1b4bdb 100644 --- a/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg +++ b/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg @@ -1 +1 @@ -shiftXshiftY \ No newline at end of file +shiftXshiftY \ No newline at end of file diff --git a/2-ui/3-event-details/5-keyboard-events/german-layout.svg b/2-ui/3-event-details/5-keyboard-events/german-layout.svg index 8a880e8e03..b75ac951a4 100644 --- a/2-ui/3-event-details/5-keyboard-events/german-layout.svg +++ b/2-ui/3-event-details/5-keyboard-events/german-layout.svg @@ -1 +1 @@ -StrgStrgAl tAlt GrWinWinMenu \ No newline at end of file +StrgStrgAl tAlt GrWinWinMenu \ No newline at end of file diff --git a/2-ui/3-event-details/5-keyboard-events/us-layout.svg b/2-ui/3-event-details/5-keyboard-events/us-layout.svg index 699277e02d..c488d00af8 100644 --- a/2-ui/3-event-details/5-keyboard-events/us-layout.svg +++ b/2-ui/3-event-details/5-keyboard-events/us-layout.svg @@ -1 +1 @@ -Caps LockShiftShift \ No newline at end of file +Caps LockShiftShift \ No newline at end of file diff --git a/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg b/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg index 7535dd311c..86aed1ddff 100644 --- a/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg +++ b/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg b/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg index 7535dd311c..86aed1ddff 100644 --- a/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg +++ b/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/2-ui/4-forms-controls/1-form-elements/form-navigation.svg b/2-ui/4-forms-controls/1-form-elements/form-navigation.svg index 2c9080703d..02eb3e5b5c 100644 --- a/2-ui/4-forms-controls/1-form-elements/form-navigation.svg +++ b/2-ui/4-forms-controls/1-form-elements/form-navigation.svg @@ -1 +1 @@ -formelements[0]elements[1]elements[n]...formform \ No newline at end of file +formelements[0]elements[1]elements[n]...formform \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg index 9ebcffaac4..bd8ba4cc3f 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg @@ -1 +1 @@ -0123 \ No newline at end of file +0123 \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg index 088c71c208..4085655255 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg @@ -1 +1 @@ -0123 \ No newline at end of file +0123 \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg index f13c6d74a7..e704d5b2f5 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg @@ -1 +1 @@ -startContainer (<p>.firstChild)startOffset (=2)commonAncestorContainer (<p>)endContainer (<b>.firstChild)endOffset (=3) \ No newline at end of file +startContainer (<p>.firstChild)startOffset (=2)commonAncestorContainer (<p>)endContainer (<b>.firstChild)endOffset (=3) \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg index 4bf5b00b00..7b7d71be23 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg @@ -1 +1 @@ -0123 \ No newline at end of file +0123 \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg b/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg index b5b2c0dd5b..7beae79665 100644 --- a/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg +++ b/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg @@ -1 +1 @@ -фокусякорьmouse move direction \ No newline at end of file +фокусякорьmouse move direction \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg b/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg index d97c1503b9..6ec81daf42 100644 --- a/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg +++ b/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg @@ -1 +1 @@ -якорьфокусmouse move direction \ No newline at end of file +якорьфокусmouse move direction \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg b/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg index 537c837fa0..dcee5504f4 100644 --- a/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg +++ b/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg @@ -1 +1 @@ -выделение \ No newline at end of file +выделение \ No newline at end of file diff --git a/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg b/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg index f5660fff9a..d0907bb9a6 100644 --- a/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg +++ b/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg @@ -1 +1 @@ -...mousemoveсобытийный циклрендерингмикрозадачирендерингмикрозадачискриптsetTimeout \ No newline at end of file +...mousemoveсобытийный циклрендерингмикрозадачирендерингмикрозадачискриптsetTimeout \ No newline at end of file diff --git a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg index eb4eecf1a9..50104579e1 100644 --- a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg +++ b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg @@ -1 +1 @@ -...mousemoveскриптсобытийный циклочередь макрозадачsetTimeout \ No newline at end of file +...mousemoveскриптсобытийный циклочередь макрозадачsetTimeout \ No newline at end of file diff --git a/20-css-for-js/10-box-sizing/border-box.svg b/20-css-for-js/10-box-sizing/border-box.svg index 90f792a67f..7b531e5cac 100644 --- a/20-css-for-js/10-box-sizing/border-box.svg +++ b/20-css-for-js/10-box-sizing/border-box.svg @@ -1 +1 @@ -ContentContentborder-boxcontent-boxborder: 5px; padding: 20px; \ No newline at end of file +ContentContentborder-boxcontent-boxborder: 5px; padding: 20px; \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg index b697d63043..b24e373dd8 100644 --- a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg +++ b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg @@ -1 +1 @@ -8-bit integer256 \ No newline at end of file +8-bit integer256 \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg index 8e3074fdf3..308ca4abf0 100644 --- a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg +++ b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg @@ -1 +1 @@ -8-bit integer257 \ No newline at end of file +8-bit integer257 \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg index b9de47de1e..64874459d7 100644 --- a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg +++ b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg @@ -1 +1 @@ -02134567012301new ArrayBuffer(16)ArrayBufferViewUint16Array Int16ArrayUint8Array Int8Array Uint8ClampedArrayUint32Array Int32Array Float32ArrayFloat64ArrayDataViewget/setUint8(offset) get/setFloat32(offset)...BufferSource1023456789101112131415 \ No newline at end of file +02134567012301new ArrayBuffer(16)ArrayBufferViewUint16Array Int16ArrayUint8Array Int8Array Uint8ClampedArrayUint32Array Int32Array Float32ArrayFloat64ArrayDataViewget/setUint8(offset) get/setFloat32(offset)...BufferSource1023456789101112131415 \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg index b022796ad2..657d0f6c32 100644 --- a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg +++ b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg @@ -1 +1 @@ -100213234567891011121314154567012301new ArrayBuffer(16)Uint16ArrayUint8ArrayUint32ArrayFloat64Array \ No newline at end of file +100213234567891011121314154567012301new ArrayBuffer(16)Uint16ArrayUint8ArrayUint32ArrayFloat64Array \ No newline at end of file diff --git a/4-binary/03-blob/blob.svg b/4-binary/03-blob/blob.svg index 8f42454516..5416b087f3 100644 --- a/4-binary/03-blob/blob.svg +++ b/4-binary/03-blob/blob.svg @@ -1 +1 @@ -image/pngblob1blob2strbuffer...typeBlobblobParts+= \ No newline at end of file +image/pngblob1blob2strbuffer...typeBlobblobParts+= \ No newline at end of file diff --git a/5-network/01-fetch/logo-fetch.svg b/5-network/01-fetch/logo-fetch.svg index 5a58b209b5..4a38150313 100644 --- a/5-network/01-fetch/logo-fetch.svg +++ b/5-network/01-fetch/logo-fetch.svg @@ -1,4 +1,4 @@ - + diff --git a/5-network/03-fetch-progress/logo-fetch.svg b/5-network/03-fetch-progress/logo-fetch.svg index 5a58b209b5..4a38150313 100644 --- a/5-network/03-fetch-progress/logo-fetch.svg +++ b/5-network/03-fetch-progress/logo-fetch.svg @@ -1,4 +1,4 @@ - + diff --git a/5-network/05-fetch-crossorigin/cors-gmail-messages.svg b/5-network/05-fetch-crossorigin/cors-gmail-messages.svg index 737aaddef1..51b978ab8e 100644 --- a/5-network/05-fetch-crossorigin/cors-gmail-messages.svg +++ b/5-network/05-fetch-crossorigin/cors-gmail-messages.svg @@ -1 +1 @@ -evil.comесть куки? ок!gmail.comGET /messagescookie: user=John{"messages": [...]} \ No newline at end of file +evil.comесть куки? ок!gmail.comGET /messagescookie: user=John{"messages": [...]} \ No newline at end of file diff --git a/5-network/05-fetch-crossorigin/xhr-another-domain.svg b/5-network/05-fetch-crossorigin/xhr-another-domain.svg index 35e93a46aa..0e43428e19 100644 --- a/5-network/05-fetch-crossorigin/xhr-another-domain.svg +++ b/5-network/05-fetch-crossorigin/xhr-another-domain.svg @@ -1 +1 @@ -JavaScriptБраузерСерверOrigin: https://javascript.infoHTTP-запросfetch()HTTP-ответAccess-Control-Allow-Origin: * (or https://javascript.info)если заголовок разрешает, то успехиначе ошибка \ No newline at end of file +JavaScriptБраузерСерверOrigin: https://javascript.infoHTTP-запросfetch()HTTP-ответAccess-Control-Allow-Origin: * (or https://javascript.info)если заголовок разрешает, то успехиначе ошибка \ No newline at end of file diff --git a/5-network/05-fetch-crossorigin/xhr-preflight.svg b/5-network/05-fetch-crossorigin/xhr-preflight.svg index 25d0b92840..f4683afb59 100644 --- a/5-network/05-fetch-crossorigin/xhr-preflight.svg +++ b/5-network/05-fetch-crossorigin/xhr-preflight.svg @@ -1 +1 @@ -JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file +JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file diff --git a/5-network/06-fetch-api/logo-fetch.svg b/5-network/06-fetch-api/logo-fetch.svg index 5a58b209b5..4a38150313 100644 --- a/5-network/06-fetch-api/logo-fetch.svg +++ b/5-network/06-fetch-api/logo-fetch.svg @@ -1,4 +1,4 @@ - + diff --git a/5-network/07-url/url-object.svg b/5-network/07-url/url-object.svg index 628ccc13be..2d50041af4 100644 --- a/5-network/07-url/url-object.svg +++ b/5-network/07-url/url-object.svg @@ -1 +1 @@ -hreforiginhostprotocolhostnameportpathnamesearchhash \ No newline at end of file +hreforiginhostprotocolhostnameportpathnamesearchhash \ No newline at end of file diff --git a/5-network/10-long-polling/long-polling.svg b/5-network/10-long-polling/long-polling.svg index da29d5f016..df48863fc2 100644 --- a/5-network/10-long-polling/long-polling.svg +++ b/5-network/10-long-polling/long-polling.svg @@ -1 +1 @@ -БраузерСерверзапроссоединение виситсоединение разорвано конец запросаданныезапроссоединение виситзапросданныесоединение разорвано конец запроса \ No newline at end of file +БраузерСерверзапроссоединение виситсоединение разорвано конец запросаданныезапроссоединение виситзапросданныесоединение разорвано конец запроса \ No newline at end of file diff --git a/5-network/11-websocket/websocket-handshake.svg b/5-network/11-websocket/websocket-handshake.svg index d3013be159..17c3ef3b1f 100644 --- a/5-network/11-websocket/websocket-handshake.svg +++ b/5-network/11-websocket/websocket-handshake.svg @@ -1 +1 @@ -БраузерСерверHTTP-запрос"Сервер, давай поговорим на WebSocket?"HTTP-ответ Давай!Протокол WebSocket \ No newline at end of file +БраузерСерверHTTP-запрос"Сервер, давай поговорим на WebSocket?"HTTP-ответ Давай!Протокол WebSocket \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-third-party-2.svg b/6-data-storage/01-cookie/cookie-third-party-2.svg index 8912e4a68f..16de333a95 100644 --- a/6-data-storage/01-cookie/cookie-third-party-2.svg +++ b/6-data-storage/01-cookie/cookie-third-party-2.svg @@ -1 +1 @@ -<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file +<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-third-party-3.svg b/6-data-storage/01-cookie/cookie-third-party-3.svg index ab38ea27fc..4bc2d1b65b 100644 --- a/6-data-storage/01-cookie/cookie-third-party-3.svg +++ b/6-data-storage/01-cookie/cookie-third-party-3.svg @@ -1 +1 @@ -<img src="https://ads.com/banner.png">other.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file +<img src="https://ads.com/banner.png">other.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-third-party.svg b/6-data-storage/01-cookie/cookie-third-party.svg index 21c7cf94d0..65fdd2321a 100644 --- a/6-data-storage/01-cookie/cookie-third-party.svg +++ b/6-data-storage/01-cookie/cookie-third-party.svg @@ -1 +1 @@ -<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngSet-Cookie: id=123 \ No newline at end of file +<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngSet-Cookie: id=123 \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-xsrf.svg b/6-data-storage/01-cookie/cookie-xsrf.svg index fa8cf1c95d..cb365f0c01 100644 --- a/6-data-storage/01-cookie/cookie-xsrf.svg +++ b/6-data-storage/01-cookie/cookie-xsrf.svg @@ -1 +1 @@ -<form action="https://bank.com/pay"> .... </form>evil.comесть куки? отлично!bank.comPOST /paycookie: user=John \ No newline at end of file +<form action="https://bank.com/pay"> .... </form>evil.comесть куки? отлично!bank.comPOST /paycookie: user=John \ No newline at end of file diff --git a/6-data-storage/03-indexeddb/indexeddb-cursor.svg b/6-data-storage/03-indexeddb/indexeddb-cursor.svg index c41ac75d91..25f234ce0f 100644 --- a/6-data-storage/03-indexeddb/indexeddb-cursor.svg +++ b/6-data-storage/03-indexeddb/indexeddb-cursor.svg @@ -1,5 +1,5 @@ - + indexeddb-cursor.svg Created with sketchtool. diff --git a/6-data-storage/03-indexeddb/indexeddb-index.svg b/6-data-storage/03-indexeddb/indexeddb-index.svg index b7f34cadd3..cfb8e92bfc 100644 --- a/6-data-storage/03-indexeddb/indexeddb-index.svg +++ b/6-data-storage/03-indexeddb/indexeddb-index.svg @@ -1 +1 @@ -id: 'html' price: 3id: 'css' price: 53: ['html'] 5: ['css'] 10: ['js','nodejs']id: 'js' price: 10id: 'nodejs' price: 10booksindex \ No newline at end of file +id: 'html' price: 3id: 'css' price: 53: ['html'] 5: ['css'] 10: ['js','nodejs']id: 'js' price: 10id: 'nodejs' price: 10booksindex \ No newline at end of file diff --git a/6-data-storage/03-indexeddb/indexeddb-structure.svg b/6-data-storage/03-indexeddb/indexeddb-structure.svg index a13e16918d..091533d423 100644 --- a/6-data-storage/03-indexeddb/indexeddb-structure.svg +++ b/6-data-storage/03-indexeddb/indexeddb-structure.svg @@ -1 +1 @@ -key1: value1DatabaseobjectStoreobjectStorekey3: value3key2: value2key4: value4key5: value5objectStorekey1: value1key3: value3key2: value2key4: value4key5: value5key1: value1key3: value3key2: value2key4: value4key5: value5 \ No newline at end of file +key1: value1DatabaseobjectStoreobjectStorekey3: value3key2: value2key4: value4key5: value5objectStorekey1: value1key3: value3key2: value2key4: value4key5: value5key1: value1key3: value3key2: value2key4: value4key5: value5 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier-car.svg b/7-animation/1-bezier-curve/bezier-car.svg index 9f3f31f27d..a76d8a2daa 100644 --- a/7-animation/1-bezier-curve/bezier-car.svg +++ b/7-animation/1-bezier-curve/bezier-car.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier-letter.svg b/7-animation/1-bezier-curve/bezier-letter.svg index d384cc7acf..aee4b23f98 100644 --- a/7-animation/1-bezier-curve/bezier-letter.svg +++ b/7-animation/1-bezier-curve/bezier-letter.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier-vase.svg b/7-animation/1-bezier-curve/bezier-vase.svg index ccc09690a9..47fd63ce9b 100644 --- a/7-animation/1-bezier-curve/bezier-vase.svg +++ b/7-animation/1-bezier-curve/bezier-vase.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier2.svg b/7-animation/1-bezier-curve/bezier2.svg index b8dfe8f26d..d3bed1d15d 100644 --- a/7-animation/1-bezier-curve/bezier2.svg +++ b/7-animation/1-bezier-curve/bezier2.svg @@ -1 +1 @@ -12 \ No newline at end of file +12 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-draw1.svg b/7-animation/1-bezier-curve/bezier3-draw1.svg index fd3ca092fd..6415633c58 100644 --- a/7-animation/1-bezier-curve/bezier3-draw1.svg +++ b/7-animation/1-bezier-curve/bezier3-draw1.svg @@ -1 +1 @@ -1320.25t = 0.250.25 \ No newline at end of file +1320.25t = 0.250.25 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-draw2.svg b/7-animation/1-bezier-curve/bezier3-draw2.svg index 4afe044541..baff934bdf 100644 --- a/7-animation/1-bezier-curve/bezier3-draw2.svg +++ b/7-animation/1-bezier-curve/bezier3-draw2.svg @@ -1 +1 @@ -1320.5t = 0.50.5 \ No newline at end of file +1320.5t = 0.50.5 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-e.svg b/7-animation/1-bezier-curve/bezier3-e.svg index a892258c4a..cc11700b20 100644 --- a/7-animation/1-bezier-curve/bezier3-e.svg +++ b/7-animation/1-bezier-curve/bezier3-e.svg @@ -1 +1 @@ -132 \ No newline at end of file +132 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3.svg b/7-animation/1-bezier-curve/bezier3.svg index ff95f88777..e34fb54df0 100644 --- a/7-animation/1-bezier-curve/bezier3.svg +++ b/7-animation/1-bezier-curve/bezier3.svg @@ -1 +1 @@ -132 \ No newline at end of file +132 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier4-e.svg b/7-animation/1-bezier-curve/bezier4-e.svg index 2e2bed1bac..a0a760d8b3 100644 --- a/7-animation/1-bezier-curve/bezier4-e.svg +++ b/7-animation/1-bezier-curve/bezier4-e.svg @@ -1 +1 @@ -1234 \ No newline at end of file +1234 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier4.svg b/7-animation/1-bezier-curve/bezier4.svg index 551184d1b9..0baed69c0a 100644 --- a/7-animation/1-bezier-curve/bezier4.svg +++ b/7-animation/1-bezier-curve/bezier4.svg @@ -1 +1 @@ -1234 \ No newline at end of file +1234 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/demo.svg b/7-animation/1-bezier-curve/demo.svg index 5240697ee5..251324a2fa 100644 --- a/7-animation/1-bezier-curve/demo.svg +++ b/7-animation/1-bezier-curve/demo.svg @@ -1,6 +1,6 @@ - + 1 t:1 +https://www.w3.org/2000/svghttps://www.w3.org/2000/svg + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + +t:1 + + + + + + diff --git a/99-archive/122-minification/my.svg b/99-archive/122-minification/my.svg index b8d93362fb..f52c37c40d 100755 --- a/99-archive/122-minification/my.svg +++ b/99-archive/122-minification/my.svg @@ -1 +1 @@ -ASTnode0BLOCKnode1SCRIPTnode0->node1node0->node1UNCONDRETURNRETURNnode0->RETURNSYN_BLOCKnode2FUNCTIONфункцияnode1->node2node1->RETURNUNCONDnode3NAMEимяnode2->node3node4PARAM_LISTсписок параметровnode2->node4node6BLOCKтело функцииnode2->node6UNCONDnode2->node6node5NAMEимяnode4->node5node7EXPR_RESULTвыражениеnode6->node7UNCONDnode6->node7node8ASSIGNприсвоитьnode7->node8node7->RETURNUNCONDnode9GETPROPполучить свойствоnode8->node9node12FUNCTIONфункцияnode8->node12node10THISnode9->node10node11STRINGстрока-константаnode9->node11node13NAMEnode12->node13node14PARAM_LISTnode12->node14node15BLOCKnode12->node15node16EXPR_RESULTnode15->node16node17CALLвызов функцииnode16->node17node18NAMEимя(функции)node17->node18node19NAMEимя(параметр)node17->node19 +ASTnode0BLOCKnode1SCRIPTnode0->node1node0->node1UNCONDRETURNRETURNnode0->RETURNSYN_BLOCKnode2FUNCTIONфункцияnode1->node2node1->RETURNUNCONDnode3NAMEимяnode2->node3node4PARAM_LISTсписок параметровnode2->node4node6BLOCKтело функцииnode2->node6UNCONDnode2->node6node5NAMEимяnode4->node5node7EXPR_RESULTвыражениеnode6->node7UNCONDnode6->node7node8ASSIGNприсвоитьnode7->node8node7->RETURNUNCONDnode9GETPROPполучить свойствоnode8->node9node12FUNCTIONфункцияnode8->node12node10THISnode9->node10node11STRINGстрока-константаnode9->node11node13NAMEnode12->node13node14PARAM_LISTnode12->node14node15BLOCKnode12->node15node16EXPR_RESULTnode15->node16node17CALLвызов функцииnode16->node17node18NAMEимя(функции)node17->node18node19NAMEимя(параметр)node17->node19 diff --git a/README.md b/README.md index 223a97ac85..8843571328 100755 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Недавно он был почти полностью переписан, основываясь на английской редакции, если что не так - пожалуйста, пришлите исправляющий Pull Request 👏 -**Нужна помощь с [разделом по CSS](http://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** +**Нужна помощь с [разделом по CSS](https://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** # Структура From 497229c46f9fd6e12221e63467dd87ebe3ced573 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 17:28:13 +0600 Subject: [PATCH 0340/1128] =?UTF-8?q?=F0=9F=91=BE=20fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/3-event-details/1-mouse-events-basics/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/3-event-details/1-mouse-events-basics/article.md b/2-ui/3-event-details/1-mouse-events-basics/article.md index 889bc633c4..927bb1464a 100644 --- a/2-ui/3-event-details/1-mouse-events-basics/article.md +++ b/2-ui/3-event-details/1-mouse-events-basics/article.md @@ -68,7 +68,7 @@ Также есть свойство `event.buttons`, в котором все нажатые в данный момент кнопки представлены в виде целого числа, по одному биту на кнопку. На практике это свойство используется очень редко, вы можете найти подробную информацию по адресу [MDN](mdn:/api/MouseEvent/buttons), если вам это когда-нибудь понадобится. -```warn header="Устревшее свойство `event.which`" +```warn header="Устаревшее свойство `event.which`" В старом коде вы можете встретить `event.which` свойство - это старый нестандартный способ получения кнопки с возможными значениями: - `event.which == 1` – левая кнопка, From 41959c386f58b486aa60c18904e8735d26ada143 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 17:29:58 +0600 Subject: [PATCH 0341/1128] =?UTF-8?q?=F0=9F=91=BE=20made=20the=20requested?= =?UTF-8?q?=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/01-cookie/article.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/6-data-storage/01-cookie/article.md b/6-data-storage/01-cookie/article.md index 8587d69e4d..3557e69543 100644 --- a/6-data-storage/01-cookie/article.md +++ b/6-data-storage/01-cookie/article.md @@ -112,7 +112,8 @@ document.cookie = "user=John" alert(document.cookie); // нет user ``` -...Но это можно изменить. Если мы хотим разрешить такие поддомены, как `forum.site.com` чтобы получить набор файлов куки в `site.com `, это возможно. +...Но это можно изменить. Если мы хотим разрешить поддоменам типа `forum.site.com` получать куки, установленные на +`site.com`, это возможно. Чтобы это произошло, при установке файла куки в `site.com `, мы должны явно установить параметр `domain` для корневого домена: `domain=site.com `. После этого все поддомены увидят такой файл cookie. From f5bf20c462cdbdfa26c85f2f6193353f1bbb23ae Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 17:31:39 +0600 Subject: [PATCH 0342/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/01-cookie/article.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/6-data-storage/01-cookie/article.md b/6-data-storage/01-cookie/article.md index 3557e69543..148486f940 100644 --- a/6-data-storage/01-cookie/article.md +++ b/6-data-storage/01-cookie/article.md @@ -112,8 +112,7 @@ document.cookie = "user=John" alert(document.cookie); // нет user ``` -...Но это можно изменить. Если мы хотим разрешить поддоменам типа `forum.site.com` получать куки, установленные на -`site.com`, это возможно. +...Но это можно изменить. Если мы хотим разрешить поддоменам типа `forum.site.com` получать куки, установленные на `site.com`, это возможно. Чтобы это произошло, при установке файла куки в `site.com `, мы должны явно установить параметр `domain` для корневого домена: `domain=site.com `. После этого все поддомены увидят такой файл cookie. From 41146b4a3bd9e89e2833659ef0560c91ce8fc1ba Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 17:35:17 +0600 Subject: [PATCH 0343/1128] =?UTF-8?q?=F0=9F=91=BE=20Smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index b6a425f3be..d36b53e417 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -431,7 +431,7 @@ alert(arr); // *!*1, 2, 15*/!* }); ``` -В процессе работы алгоритм может сравнивать элемент с другими, но он старается сделать как можно меньше сравнений. +В процессе работы алгоритм может сравнивать элемент со множеством других, но он старается сделать как можно меньше сравнений. ````smart header="Функция сравнения может вернуть любое число" На самом деле от функции сравнения требуется любое положительное число, чтобы сказать "больше", и отрицательное число, чтобы сказать "меньше". From 8fbf2694d241cb2d9186bf79bf2310b5175ca9ee Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 17:39:00 +0600 Subject: [PATCH 0344/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/03-indexeddb/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/6-data-storage/03-indexeddb/article.md b/6-data-storage/03-indexeddb/article.md index 266c141451..4bbb8488d4 100644 --- a/6-data-storage/03-indexeddb/article.md +++ b/6-data-storage/03-indexeddb/article.md @@ -145,7 +145,7 @@ openRequest.onsuccess = function() { *!* db.onversionchange = function() { db.close(); - alert("Database is outdated, please reload the page.") + alert("База данных устарела, пожалуста, перезагрузите страницу.") }; */!* @@ -164,8 +164,8 @@ openRequest.onblocked = function() { ...Другими словами, здесь мы делаем две вещи: -1. Прослушиватель `db.onversionchange` сообщает нам о попытке параллельного обновления, если текущая версия базы данных устарела. -2. Прослушиватель `OpenRequest.onblocked` сообщает нам об обратной ситуации: в другом месте есть соединение с устаревшей версией, и оно не закрывается, поэтому новое соединение установить невозможно. +1. Обработчик `db.onversionchange` сообщает нам о попытке параллельного обновления, если текущая версия базы данных устарела. +2. Обработчик `OpenRequest.onblocked` сообщает нам об обратной ситуации: в другом месте есть соединение с устаревшей версией, и оно не закрывается, поэтому новое соединение установить невозможно. Мы можем более изящно обращаться с вещами в `db.onversionchange`, например предлагать посетителю сохранить данные до закрытия соединения и так далее. From f838621e38c16b3e79801f72046c12b33f7119c8 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 23:46:03 +0600 Subject: [PATCH 0345/1128] =?UTF-8?q?=F0=9F=91=BE=20fix=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9-regular-expressions/17-regexp-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/17-regexp-methods/article.md b/9-regular-expressions/17-regexp-methods/article.md index df2c238b03..7b22c7e554 100644 --- a/9-regular-expressions/17-regexp-methods/article.md +++ b/9-regular-expressions/17-regexp-methods/article.md @@ -250,7 +250,7 @@ alert(result); // Smith, John Таким образом, повторные вызовы возвращают одно за другим все совпадения, используя свойство `regexp.lastIndex` для отслеживания текущей позиции поиска. -В прошлом, до появления метода `str.matchAll` в JavaScript, вызов `regexp.exec` в цикле использовали для получения всех совпадений с их позициями и группами скобок в цикле: +В прошлом, до появления метода `str.matchAll` в JavaScript, вызов `regexp.exec` использовали для получения всех совпадений с их позициями и группами скобок в цикле: ```js run let str = 'Больше о JavaScript на https://javascript.info'; From 27a5c6f1cfc066e3dc364440786295ab9de292e9 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 23:47:54 +0600 Subject: [PATCH 0346/1128] =?UTF-8?q?=F0=9F=91=BE=20fix=20another=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9-regular-expressions/17-regexp-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/17-regexp-methods/article.md b/9-regular-expressions/17-regexp-methods/article.md index 7b22c7e554..c1fe3e789d 100644 --- a/9-regular-expressions/17-regexp-methods/article.md +++ b/9-regular-expressions/17-regexp-methods/article.md @@ -304,7 +304,7 @@ alert( regexp.exec(str) ); // null ```js run let str = "Я люблю JavaScript"; -// эти два теста делают одно и же +// эти два теста делают одно и то же alert( *!*/люблю/i*/!*.test(str) ); // true alert( str.search(*!*/люблю/i*/!*) != -1 ); // true ``` From 875221d78374eb26e987a6e5551f4d69b59fd759 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Mon, 6 Jun 2022 23:52:34 +0600 Subject: [PATCH 0347/1128] =?UTF-8?q?=F0=9F=91=BE=20add=20missed=20parenth?= =?UTF-8?q?esis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9-regular-expressions/17-regexp-methods/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/9-regular-expressions/17-regexp-methods/article.md b/9-regular-expressions/17-regexp-methods/article.md index c1fe3e789d..2f4e6bef80 100644 --- a/9-regular-expressions/17-regexp-methods/article.md +++ b/9-regular-expressions/17-regexp-methods/article.md @@ -155,8 +155,8 @@ alert( '12-34-56'.replace( *!*/-/g*/!*, ":" )) // 12:34:56 |`$&`|вставляет всё найденное совпадение| |$`|вставляет часть строки до совпадения| |`$'`|вставляет часть строки после совпадения| -|`$n`|если `n` это 1-2 значное число, то вставляет содержимое n-й скобки (см. главу [](info:regexp-groups)| -|`$`|вставляет содержимое скобки с указанным `name` (см. главу [](info:regexp-groups)| +|`$n`|если `n` это 1-2 значное число, то вставляет содержимое n-й скобки (см. главу [](info:regexp-groups))| +|`$`|вставляет содержимое скобки с указанным `name` (см. главу [](info:regexp-groups))| |`$$`|вставляет `"$"` | Например: From 581a75c7cc5a959bf493b77994d3e3354e1ec0cc Mon Sep 17 00:00:00 2001 From: rnbsov <73550760+rnbsov@users.noreply.github.com> Date: Tue, 7 Jun 2022 00:13:18 +0600 Subject: [PATCH 0348/1128] =?UTF-8?q?Revert=20"=F0=9F=91=BE=20svgs"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6af64f8104ddd75d0a4263854aec04085dc7307b. --- 1-js/01-getting-started/1-intro/article.md | 6 +- .../1-intro/limitations.svg | 2 +- .../2-manuals-specifications/article.md | 4 +- .../3-code-editors/article.md | 4 +- 1-js/02-first-steps/04-variables/article.md | 2 +- .../04-variables/variable-change.svg | 2 +- 1-js/02-first-steps/04-variables/variable.svg | 2 +- .../2-check-standard/ifelse_task2.svg | 2 +- .../9-check-login/ifelse_task.svg | 2 +- .../chrome-open-sources.svg | 2 +- .../chrome-sources-breakpoint.svg | 2 +- .../chrome-sources-console.svg | 2 +- .../chrome-sources-debugger-pause.svg | 2 +- .../chrome-sources-debugger-trace-1.svg | 2 +- .../01-debugging-chrome/chrome-tabs.svg | 2 +- .../01-debugging-chrome/largeIcons.svg | 4 +- .../02-coding-style/code-style.svg | 2 +- .../01-object/object-user-delete.svg | 2 +- .../01-object/object-user-empty.svg | 2 +- .../01-object/object-user-isadmin.svg | 2 +- .../01-object/object-user-props.svg | 2 +- .../01-object/object-user.svg | 2 +- 1-js/04-object-basics/01-object/object.svg | 2 +- .../variable-contains-reference.svg | 2 +- .../variable-copy-reference.svg | 2 +- .../02-object-copy/variable-copy-value.svg | 2 +- .../family-delete-refs.svg | 2 +- .../family-no-family.svg | 2 +- .../family-no-father-2.svg | 2 +- .../family-no-father.svg | 2 +- .../03-garbage-collection/family.svg | 2 +- .../garbage-collection-1.svg | 2 +- .../garbage-collection-2.svg | 2 +- .../garbage-collection-3.svg | 2 +- .../garbage-collection-4.svg | 2 +- .../garbage-collection-5.svg | 2 +- .../memory-user-john-admin.svg | 2 +- .../memory-user-john-lost.svg | 2 +- .../memory-user-john.svg | 2 +- 1-js/05-data-types/04-array/array-pop.svg | 2 +- 1-js/05-data-types/04-array/array-shift.svg | 2 +- 1-js/05-data-types/04-array/array-speed.svg | 2 +- 1-js/05-data-types/04-array/queue.svg | 2 +- 1-js/05-data-types/04-array/stack.svg | 2 +- .../05-data-types/05-array-methods/reduce.svg | 2 +- .../destructuring-complex.svg | 2 +- 1-js/05-data-types/12-json/json-meetup.svg | 2 +- .../fibonacci-recursion-tree.svg | 2 +- .../01-recursion/linked-list-0.svg | 2 +- .../01-recursion/linked-list-remove-1.svg | 2 +- .../01-recursion/linked-list-split.svg | 2 +- .../01-recursion/linked-list.svg | 2 +- .../01-recursion/recursion-pow.svg | 2 +- .../01-recursion/recursive-salaries.svg | 2 +- .../8-make-army/lexenv-makearmy.svg | 2 +- .../03-closure/lexenv-if.svg | 2 +- .../lexenv-nested-makecounter-1.svg | 2 +- .../lexenv-nested-makecounter-2.svg | 2 +- .../lexenv-nested-makecounter-3.svg | 2 +- .../lexenv-nested-makecounter-4.svg | 2 +- .../lexenv-nested-makecounter-5.svg | 2 +- .../lexenv-nested-makecounter-6.svg | 2 +- .../03-closure/lexenv-nested-work.svg | 2 +- .../lexical-environment-global-2.svg | 2 +- .../lexical-environment-global-3.svg | 2 +- .../03-closure/lexical-environment-global.svg | 2 +- .../lexical-environment-simple-lookup.svg | 2 +- .../03-closure/lexical-environment-simple.svg | 2 +- .../03-closure/lexical-search-order.svg | 2 +- .../setinterval-interval.svg | 2 +- .../settimeout-interval.svg | 2 +- .../decorator-makecaching-wrapper.svg | 2 +- .../object-prototype-empty.svg | 2 +- .../proto-animal-rabbit-chain.svg | 2 +- .../proto-animal-rabbit-walk-2.svg | 2 +- .../proto-animal-rabbit-walk-3.svg | 2 +- .../proto-animal-rabbit-walk.svg | 2 +- .../proto-animal-rabbit.svg | 2 +- .../proto-user-admin.svg | 2 +- .../rabbit-animal-object.svg | 2 +- .../function-prototype-constructor.svg | 2 +- .../proto-constructor-animal-rabbit.svg | 2 +- .../rabbit-prototype-constructor.svg | 2 +- .../function-prototype-constructor.svg | 2 +- .../native-prototypes-array-tostring.svg | 2 +- .../native-prototypes-classes.svg | 2 +- .../object-prototype-1.svg | 2 +- .../object-prototype-null.svg | 2 +- .../03-native-prototypes/object-prototype.svg | 2 +- .../proto-constructor-animal-rabbit.svg | 2 +- .../rabbit-prototype-constructor.svg | 2 +- .../object-prototype-2.svg | 2 +- .../object-prototype-null.svg | 2 +- 1-js/09-classes/01-class/class-user.svg | 2 +- .../animal-rabbit-extends.svg | 2 +- .../class-inheritance-array-object.svg | 2 +- .../class-inheritance-rabbit-animal-2.svg | 2 +- .../class-inheritance-rabbit-animal.svg | 2 +- .../rabbit-animal-independent-animal.svg | 2 +- .../rabbit-animal-independent-rabbit.svg | 2 +- .../super-homeobject-wrong.svg | 2 +- .../02-class-inheritance/this-super-loop.svg | 2 +- .../rabbit-extends-object.svg | 2 +- .../animal-rabbit-static.svg | 2 +- .../object-date-inheritance.svg | 2 +- 1-js/09-classes/06-instanceof/instanceof.svg | 2 +- .../07-mixins/mixin-inheritance.svg | 2 +- .../1-try-catch/try-catch-flow.svg | 2 +- 1-js/11-async/01-callbacks/callback-hell.svg | 2 +- .../02-promise-basics/promise-reject-1.svg | 2 +- .../02-promise-basics/promise-resolve-1.svg | 2 +- .../promise-resolve-reject.svg | 2 +- .../promise-handler-variants.svg | 2 +- .../promise-then-chain.svg | 2 +- .../03-promise-chaining/promise-then-many.svg | 2 +- .../promise-then-chain.svg | 2 +- .../promise-then-many.svg | 2 +- .../07-microtask-queue/promiseQueue.svg | 2 +- .../1-generators/genYield2-2.svg | 2 +- .../1-generators/genYield2.svg | 2 +- .../1-generators/generateSequence-1.svg | 2 +- .../1-generators/generateSequence-2.svg | 2 +- .../1-generators/generateSequence-3.svg | 2 +- .../1-generators/generateSequence-4.svg | 2 +- .../01-proxy/proxy-inherit-admin.svg | 2 +- 1-js/99-js-misc/01-proxy/proxy-inherit.svg | 2 +- 1-js/99-js-misc/01-proxy/proxy.svg | 2 +- .../01-browser-environment/windowObjects.svg | 2 +- .../02-dom-nodes/toolbarButtonGlyphs.svg | 4 +- .../03-dom-navigation/dom-links-elements.svg | 2 +- .../03-dom-navigation/dom-links.svg | 2 +- .../dom-class-hierarchy.svg | 2 +- .../before-prepend-append-after.svg | 2 +- .../07-modifying-document/insert-adjacent.svg | 2 +- .../4-put-ball-in-center/field.svg | 2 +- .../09-size-and-scroll/metric-all.svg | 2 +- .../metric-client-left-top-rtl.svg | 2 +- .../metric-client-left-top.svg | 2 +- .../metric-client-width-height.svg | 2 +- .../metric-client-width-nopadding.svg | 2 +- .../09-size-and-scroll/metric-css.svg | 2 +- .../metric-offset-parent.svg | 2 +- .../metric-offset-width-height.svg | 2 +- .../09-size-and-scroll/metric-scroll-top.svg | 2 +- .../metric-scroll-width-height.svg | 2 +- .../document-client-width-height.svg | 2 +- .../11-coordinates/coordinates-negative.svg | 2 +- .../1-document/11-coordinates/coordinates.svg | 2 +- ...cument-and-window-coordinates-scrolled.svg | 2 +- .../04-move-ball-field/move-ball-coords.svg | 2 +- .../07-carousel/carousel1.svg | 2 +- .../07-carousel/carousel2.svg | 2 +- .../event-order-bubbling.svg | 2 +- .../02-bubbling-and-capturing/eventflow.svg | 2 +- .../03-event-delegation/bagua-bubble.svg | 2 +- .../mouseover-bubble-nested.svg | 2 +- .../mouseover-mouseout-from-outside.svg | 2 +- .../mouseover-mouseout-over-elems.svg | 2 +- .../mouseover-mouseout.svg | 2 +- .../mouseover-to-child.svg | 2 +- .../2-drag-heroes/solution.view/field.svg | 2 +- .../4-mouse-drag-and-drop/ball_shift.svg | 2 +- .../5-keyboard-events/german-layout.svg | 2 +- .../5-keyboard-events/us-layout.svg | 2 +- .../solution.view/placeholder.svg | 2 +- .../source.view/placeholder.svg | 2 +- .../1-form-elements/form-navigation.svg | 2 +- .../range-example-p-0-1.svg | 2 +- .../range-example-p-1-3.svg | 2 +- .../range-example-p-2-b-3-range.svg | 2 +- .../range-example-p-2-b-3.svg | 2 +- .../selection-direction-backward.svg | 2 +- .../selection-direction-forward.svg | 2 +- .../02-selection-range/selection-firefox.svg | 2 +- .../03-event-loop/eventLoop-full.svg | 2 +- 2-ui/99-ui-misc/03-event-loop/eventLoop.svg | 2 +- 20-css-for-js/10-box-sizing/border-box.svg | 2 +- .../8bit-integer-256.svg | 2 +- .../8bit-integer-257.svg | 2 +- .../arraybuffer-view-buffersource.svg | 2 +- .../arraybuffer-views.svg | 2 +- 4-binary/03-blob/blob.svg | 2 +- 5-network/01-fetch/logo-fetch.svg | 2 +- 5-network/03-fetch-progress/logo-fetch.svg | 2 +- .../cors-gmail-messages.svg | 2 +- .../xhr-another-domain.svg | 2 +- .../05-fetch-crossorigin/xhr-preflight.svg | 2 +- 5-network/06-fetch-api/logo-fetch.svg | 2 +- 5-network/07-url/url-object.svg | 2 +- 5-network/10-long-polling/long-polling.svg | 2 +- .../11-websocket/websocket-handshake.svg | 2 +- .../01-cookie/cookie-third-party-2.svg | 2 +- .../01-cookie/cookie-third-party-3.svg | 2 +- .../01-cookie/cookie-third-party.svg | 2 +- 6-data-storage/01-cookie/cookie-xsrf.svg | 2 +- .../03-indexeddb/indexeddb-cursor.svg | 2 +- .../03-indexeddb/indexeddb-index.svg | 2 +- .../03-indexeddb/indexeddb-structure.svg | 2 +- 7-animation/1-bezier-curve/bezier-car.svg | 2 +- 7-animation/1-bezier-curve/bezier-letter.svg | 2 +- 7-animation/1-bezier-curve/bezier-vase.svg | 2 +- 7-animation/1-bezier-curve/bezier2.svg | 2 +- 7-animation/1-bezier-curve/bezier3-draw1.svg | 2 +- 7-animation/1-bezier-curve/bezier3-draw2.svg | 2 +- 7-animation/1-bezier-curve/bezier3-e.svg | 2 +- 7-animation/1-bezier-curve/bezier3.svg | 2 +- 7-animation/1-bezier-curve/bezier4-e.svg | 2 +- 7-animation/1-bezier-curve/bezier4.svg | 2 +- 7-animation/1-bezier-curve/demo.svg | 4 +- .../2-animate-logo-bezier-css/bezier-up.svg | 2 +- .../2-css-animations/bezier-linear.svg | 2 +- .../2-css-animations/bezier-train-over.svg | 2 +- 7-animation/2-css-animations/ease-in-out.svg | 2 +- 7-animation/2-css-animations/ease-in.svg | 2 +- 7-animation/2-css-animations/ease-out.svg | 2 +- 7-animation/2-css-animations/ease.svg | 2 +- 7-animation/2-css-animations/train-curve.svg | 2 +- 7-animation/3-js-animation/back.svg | 2 +- 7-animation/3-js-animation/bezier-linear.svg | 2 +- 7-animation/3-js-animation/bounce-inout.svg | 2 +- 7-animation/3-js-animation/circ-ease.svg | 2 +- 7-animation/3-js-animation/circ.svg | 2 +- 7-animation/3-js-animation/elastic.svg | 2 +- 7-animation/3-js-animation/linear.svg | 2 +- 7-animation/3-js-animation/quad.svg | 2 +- 7-animation/3-js-animation/quint.svg | 2 +- .../web-components-twitter.svg | 2 +- .../shadow-dom-user-card.svg | 2 +- .../love-html5-classes.svg | 2 +- .../hello-java-boundaries.svg | 2 +- .../witch_greedy1.svg | 2 +- .../witch_greedy2.svg | 2 +- .../witch_greedy3.svg | 2 +- .../witch_greedy4.svg | 2 +- .../witch_greedy5.svg | 2 +- .../witch_greedy6.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy3.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy4.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy5.svg | 2 +- .../10-regexp-greedy-and-lazy/witch_lazy6.svg | 2 +- .../regexp-nested-groups-matches.svg | 2 +- .../regexp-nested-groups-pattern.svg | 2 +- 99-archive/064-bezier/demo.svg | 279 +----------------- 99-archive/122-minification/my.svg | 2 +- README.md | 2 +- 245 files changed, 252 insertions(+), 529 deletions(-) diff --git a/1-js/01-getting-started/1-intro/article.md b/1-js/01-getting-started/1-intro/article.md index 00c4d8761c..809783d990 100644 --- a/1-js/01-getting-started/1-intro/article.md +++ b/1-js/01-getting-started/1-intro/article.md @@ -15,7 +15,7 @@ ```smart header="Почему JavaScript?" Когда JavaScript создавался, у него было другое имя - "LiveScript". Однако, язык Java был очень популярен в то время, и было решено, что позиционирование JavaScript как "младшего брата" Java будет полезно. -Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся [ECMAScript](https://ru.wikipedia.org/wiki/ECMAScript), и сейчас не имеет никакого отношения к Java. +Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся [ECMAScript](http://ru.wikipedia.org/wiki/ECMAScript), и сейчас не имеет никакого отношения к Java. ``` Сегодня JavaScript может выполняться не только в браузере, но и на сервере или на любом другом устройстве, которое имеет специальную программу, называющуюся ["движком" JavaScript](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript). @@ -107,8 +107,8 @@ JavaScript - это единственная браузерная техноло Примеры таких языков: - [CoffeeScript](http://coffeescript.org/) добавляет "синтаксический сахар" для JavaScript. Он вводит более короткий синтаксис, который позволяет писать чистый и лаконичный код. Обычно такое нравится Ruby-программистам. -- [TypeScript](https://www.typescriptlang.org//) концентрируется на добавлении "строгой типизации" для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft. -- [Flow](https://flow.org/) тоже добавляет типизацию, но иначе. Разработан Facebook. +- [TypeScript](http://www.typescriptlang.org/) концентрируется на добавлении "строгой типизации" для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft. +- [Flow](http://flow.org/) тоже добавляет типизацию, но иначе. Разработан Facebook. - [Dart](https://www.dartlang.org/) стоит особняком, потому что имеет собственный движок, работающий вне браузера (например, в мобильных приложениях). Первоначально был предложен Google, как замена JavaScript, но на данный момент необходима его транспиляция для запуска так же, как для вышеперечисленных языков. - [Brython](https://brython.info/) транспилирует Python в JavaScript, что позволяет писать приложения на чистом Python без JavaScript. diff --git a/1-js/01-getting-started/1-intro/limitations.svg b/1-js/01-getting-started/1-intro/limitations.svg index 6dcdcf9b0d..76ea43fd7a 100644 --- a/1-js/01-getting-started/1-intro/limitations.svg +++ b/1-js/01-getting-started/1-intro/limitations.svg @@ -1 +1 @@ -https://javascript.info<script> ... </script>https://gmail.comhttps://javascript.info \ No newline at end of file +https://javascript.info<script> ... </script>https://gmail.comhttps://javascript.info \ No newline at end of file diff --git a/1-js/01-getting-started/2-manuals-specifications/article.md b/1-js/01-getting-started/2-manuals-specifications/article.md index e2c6e20226..bc00e6fa23 100644 --- a/1-js/01-getting-started/2-manuals-specifications/article.md +++ b/1-js/01-getting-started/2-manuals-specifications/article.md @@ -24,7 +24,7 @@ Хотя зачастую вместо их сайта удобнее использовать какой-нибудь интернет-поисковик, вводя там запрос "MDN [что вы хотите найти]", например для поиска информации о функции `parseInt`. -- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . +- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . Так же, как и в предыдущем случае, можно использовать интернет-поиск, набирая фразы типа "RegExp MSDN" или "RegExp MSDN jscript". @@ -34,7 +34,7 @@ JavaScript -- это развивающийся язык, в который по Посмотреть, какие возможности поддерживаются в разных браузерах и других движках, можно в следующих источниках: -- - таблицы с информацией о поддержке по каждой возможности языка. Например, чтобы узнать, какие движки поддерживают современные криптографические функции, посетите: . +- - таблицы с информацией о поддержке по каждой возможности языка. Например, чтобы узнать, какие движки поддерживают современные криптографические функции, посетите: . - - таблица с возможностями языка и движками, которые их поддерживают и не поддерживают. Все эти ресурсы полезны в ежедневной работе программиста, так как они содержат ценную информацию о возможностях использования языка, их поддержке и так далее. diff --git a/1-js/01-getting-started/3-code-editors/article.md b/1-js/01-getting-started/3-code-editors/article.md index 748c0427c5..a49042780b 100644 --- a/1-js/01-getting-started/3-code-editors/article.md +++ b/1-js/01-getting-started/3-code-editors/article.md @@ -13,7 +13,7 @@ IDE загружает проект (который может состоять Если вы ещё не выбрали себе IDE, присмотритесь к этим: - [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенная, бесплатная). -- [WebStorm](https://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). +- [WebStorm](http://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). Для Windows есть ещё Visual Studio (не путать с Visual Studio Code). Visual Studio - это платная мощная среда разработки, которая работает только на Windows. Она хорошо подходит для .NET платформы. У неё есть бесплатная версия, которая называется [Visual Studio Community](https://www.visualstudio.com/vs/community/). @@ -34,7 +34,7 @@ IDE загружает проект (который может состоять - [Atom](https://atom.io/) (кроссплатформенный, бесплатный). - [Sublime Text](http://www.sublimetext.com) (кроссплатформенный, условно-бесплатный). - [Notepad++](https://notepad-plus-plus.org/) (Windows, бесплатный). -- [Vim](https://www.vim.org/) и [Emacs](https://www.gnu.org/software/emacs/) тоже хороши, если знать, как ими пользоваться. +- [Vim](http://www.vim.org/) и [Emacs](https://www.gnu.org/software/emacs/) тоже хороши, если знать, как ими пользоваться. ## Не будем ссориться diff --git a/1-js/02-first-steps/04-variables/article.md b/1-js/02-first-steps/04-variables/article.md index 3bb55e145c..74c763dc83 100644 --- a/1-js/02-first-steps/04-variables/article.md +++ b/1-js/02-first-steps/04-variables/article.md @@ -151,7 +151,7 @@ let message = "Другое"; // SyntaxError: 'message' has already been declare ```` ```smart header="Функциональные языки программирования" -Примечательно, что существуют [функциональные](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) языки программирования, такие как [Scala](https://www.scala-lang.org/) или [Erlang](https://www.erlang.org/), которые запрещают изменять значение переменной. +Примечательно, что существуют [функциональные](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) языки программирования, такие как [Scala](http://www.scala-lang.org/) или [Erlang](http://www.erlang.org/), которые запрещают изменять значение переменной. В таких языках однажды сохранённое "в коробку" значение остаётся там навсегда. Если нам нужно сохранить что-то другое, язык заставляет нас создать новую коробку (объявить новую переменную). Мы не можем использовать старую переменную. diff --git a/1-js/02-first-steps/04-variables/variable-change.svg b/1-js/02-first-steps/04-variables/variable-change.svg index ce16696252..1b26792380 100644 --- a/1-js/02-first-steps/04-variables/variable-change.svg +++ b/1-js/02-first-steps/04-variables/variable-change.svg @@ -1 +1 @@ -"World!""Hello!"message \ No newline at end of file +"World!""Hello!"message \ No newline at end of file diff --git a/1-js/02-first-steps/04-variables/variable.svg b/1-js/02-first-steps/04-variables/variable.svg index 0010177d54..1c3d8b0cbe 100644 --- a/1-js/02-first-steps/04-variables/variable.svg +++ b/1-js/02-first-steps/04-variables/variable.svg @@ -1 +1 @@ -"Hello!"message \ No newline at end of file +"Hello!"message \ No newline at end of file diff --git a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg index fcb6a93bd5..2ef4442c7b 100644 --- a/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg +++ b/1-js/02-first-steps/10-ifelse/2-check-standard/ifelse_task2.svg @@ -1 +1 @@ -НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное" название JavaScript?ДругоеECMAScript \ No newline at end of file +НачалоНе знаете? “ECMAScript”!Верно!Какое "официальное" название JavaScript?ДругоеECMAScript \ No newline at end of file diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg b/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg index 6c037c068f..319fa9ea1b 100644 --- a/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg +++ b/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg @@ -1 +1 @@ -НачалоОтмененоОтмененоЗдравствуйте!Я вас не знаюНеверный парольКто там?Пароль?ОтменаОтменаАдминЯ ГлавныйДругоеДругое \ No newline at end of file +НачалоОтмененоОтмененоЗдравствуйте!Я вас не знаюНеверный парольКто там?Пароль?ОтменаОтменаАдминЯ ГлавныйДругоеДругое \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg index b5b7b91d74..a850a00603 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-open-sources.svg @@ -1 +1 @@ -открыть исходные файлы \ No newline at end of file +открыть исходные файлы \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg index 1c0ccc4566..bef78e166d 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-breakpoint.svg @@ -1 +1 @@ -вот списокточки останова \ No newline at end of file +вот списокточки останова \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg index 32adcd9515..d5d2a0b934 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-console.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg index 9231912f1c..c5d92a7564 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-pause.svg @@ -1 +1 @@ -213посмотреть детали внешнего вызовасмотреть за выражениямитекущие переменные \ No newline at end of file +213посмотреть детали внешнего вызовасмотреть за выражениямитекущие переменные \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg index 28efad7e49..e9bccf2df7 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-sources-debugger-trace-1.svg @@ -1 +1 @@ -вложенные вызовы \ No newline at end of file +вложенные вызовы \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg b/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg index 1d95bc8ac3..41a3d8784b 100644 --- a/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg +++ b/1-js/03-code-quality/01-debugging-chrome/chrome-tabs.svg @@ -1 +1 @@ -213 \ No newline at end of file +213 \ No newline at end of file diff --git a/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg b/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg index 1fec9d526c..83303365bd 100644 --- a/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg +++ b/1-js/03-code-quality/01-debugging-chrome/largeIcons.svg @@ -3,8 +3,8 @@ xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="https://www.w3.org/2000/svg" - xmlns="https://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" diff --git a/1-js/03-code-quality/02-coding-style/code-style.svg b/1-js/03-code-quality/02-coding-style/code-style.svg index cc70607ea7..23eff7f6b4 100644 --- a/1-js/03-code-quality/02-coding-style/code-style.svg +++ b/1-js/03-code-quality/02-coding-style/code-style.svg @@ -1 +1 @@ -2Без пробелов между именем функции и скобками между скобками и параметрамиОтступ 2 пробелаПробел после for/if/while…} else { без перевода строкиПробелы вокруг вложенного вызоваПустая строка Между логическими блокамиСтроки не очень длинныеТочка с запятой ; обязательнаПробелы вокруг операторовФигурная скобка { на той же строке, после пробелаПробел между аргументамиПробел между параметрами \ No newline at end of file +2Без пробелов между именем функции и скобками между скобками и параметрамиОтступ 2 пробелаПробел после for/if/while…} else { без перевода строкиПробелы вокруг вложенного вызоваПустая строка Между логическими блокамиСтроки не очень длинныеТочка с запятой ; обязательнаПробелы вокруг операторовФигурная скобка { на той же строке, после пробелаПробел между аргументамиПробел между параметрами \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-delete.svg b/1-js/04-object-basics/01-object/object-user-delete.svg index 6b336fa3f5..c5af7e7afc 100644 --- a/1-js/04-object-basics/01-object/object-user-delete.svg +++ b/1-js/04-object-basics/01-object/object-user-delete.svg @@ -1 +1 @@ -nameisAdminuser \ No newline at end of file +nameisAdminuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-empty.svg b/1-js/04-object-basics/01-object/object-user-empty.svg index f34e222ba1..edde844cf5 100644 --- a/1-js/04-object-basics/01-object/object-user-empty.svg +++ b/1-js/04-object-basics/01-object/object-user-empty.svg @@ -1 +1 @@ -пустоuser \ No newline at end of file +пустоuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-isadmin.svg b/1-js/04-object-basics/01-object/object-user-isadmin.svg index aa2c703fe0..e2cc0eaf15 100644 --- a/1-js/04-object-basics/01-object/object-user-isadmin.svg +++ b/1-js/04-object-basics/01-object/object-user-isadmin.svg @@ -1 +1 @@ -nameageisAdminuser \ No newline at end of file +nameageisAdminuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user-props.svg b/1-js/04-object-basics/01-object/object-user-props.svg index e6cc46f598..b3d5c9b71b 100644 --- a/1-js/04-object-basics/01-object/object-user-props.svg +++ b/1-js/04-object-basics/01-object/object-user-props.svg @@ -1 +1 @@ -nameagelikes birdsuser \ No newline at end of file +nameagelikes birdsuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object-user.svg b/1-js/04-object-basics/01-object/object-user.svg index f45ce98b53..f499fbc10f 100644 --- a/1-js/04-object-basics/01-object/object-user.svg +++ b/1-js/04-object-basics/01-object/object-user.svg @@ -1 +1 @@ -nameageuser \ No newline at end of file +nameageuser \ No newline at end of file diff --git a/1-js/04-object-basics/01-object/object.svg b/1-js/04-object-basics/01-object/object.svg index 8a1b7e63c8..47431a6e1f 100644 --- a/1-js/04-object-basics/01-object/object.svg +++ b/1-js/04-object-basics/01-object/object.svg @@ -1 +1 @@ -key1key2key3 \ No newline at end of file +key1key2key3 \ No newline at end of file diff --git a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg index 971a679234..267f045785 100644 --- a/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-contains-reference.svg @@ -1 +1 @@ -username \ No newline at end of file +username \ No newline at end of file diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg index b2ca57e06d..a847fb200e 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-reference.svg @@ -1 +1 @@ -useradminname \ No newline at end of file +useradminname \ No newline at end of file diff --git a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg index e24646b8d0..f12e7fc4c8 100644 --- a/1-js/04-object-basics/02-object-copy/variable-copy-value.svg +++ b/1-js/04-object-basics/02-object-copy/variable-copy-value.svg @@ -1 +1 @@ -"Привет!"message"Привет!"phrase \ No newline at end of file +"Привет!"message"Привет!"phrase \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg b/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg index 14bf46fc16..a582ca64b7 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-delete-refs.svg @@ -1 +1 @@ -<global variable>ObjectObjectwifefamilyname: "John"name: "Ann"motherObjectfatherhusband \ No newline at end of file +<global variable>ObjectObjectwifefamilyname: "John"name: "Ann"motherObjectfatherhusband \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-no-family.svg b/1-js/04-object-basics/03-garbage-collection/family-no-family.svg index 119958721a..c73dd6a48f 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-no-family.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-no-family.svg @@ -1 +1 @@ -<global>ObjectObjectfatherwifename: "John"name: "Ann"motherObjecthusbandfamily: null \ No newline at end of file +<global>ObjectObjectfatherwifename: "John"name: "Ann"motherObjecthusbandfamily: null \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg b/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg index 272387450b..6bd13c0e80 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-no-father-2.svg @@ -1 +1 @@ -Objectfamilyname: "Ann"motherObject<global> \ No newline at end of file +Objectfamilyname: "Ann"motherObject<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family-no-father.svg b/1-js/04-object-basics/03-garbage-collection/family-no-father.svg index cf7f32e866..fd1f206073 100644 --- a/1-js/04-object-basics/03-garbage-collection/family-no-father.svg +++ b/1-js/04-object-basics/03-garbage-collection/family-no-father.svg @@ -1 +1 @@ -ObjectObjectwifefamilyname: "John"name: "Ann"motherObject<global> \ No newline at end of file +ObjectObjectwifefamilyname: "John"name: "Ann"motherObject<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/family.svg b/1-js/04-object-basics/03-garbage-collection/family.svg index 4787a3c0ba..fd05348740 100644 --- a/1-js/04-object-basics/03-garbage-collection/family.svg +++ b/1-js/04-object-basics/03-garbage-collection/family.svg @@ -1 +1 @@ -ObjectObjectfatherwifefamilyname: "John"name: "Ann"motherObjecthusband<global variable> \ No newline at end of file +ObjectObjectfatherwifefamilyname: "John"name: "Ann"motherObjecthusband<global variable> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg index 343674c6ff..5cac52e9a9 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-1.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg index 61c1fa4b36..7dd3a693a8 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-2.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg index e654b8f364..1060577874 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-3.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg index 179a5b4a9f..bd485adeeb 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-4.svg @@ -1 +1 @@ -<global> \ No newline at end of file +<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg b/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg index bf5dcaeb14..6de756f7cf 100644 --- a/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg +++ b/1-js/04-object-basics/03-garbage-collection/garbage-collection-5.svg @@ -1 +1 @@ -<global>недостижимые \ No newline at end of file +<global>недостижимые \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg b/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg index f58bc593fc..1913243548 100644 --- a/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg +++ b/1-js/04-object-basics/03-garbage-collection/memory-user-john-admin.svg @@ -1 +1 @@ -username: "John"Objectadmin<global> \ No newline at end of file +username: "John"Objectadmin<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg b/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg index 69e74a8905..07914a9ca0 100644 --- a/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg +++ b/1-js/04-object-basics/03-garbage-collection/memory-user-john-lost.svg @@ -1 +1 @@ -name: "John"Objectuser: null<global> \ No newline at end of file +name: "John"Objectuser: null<global> \ No newline at end of file diff --git a/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg b/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg index e308ffce7b..15bd51afb1 100644 --- a/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg +++ b/1-js/04-object-basics/03-garbage-collection/memory-user-john.svg @@ -1 +1 @@ -username: "John"Object<global> \ No newline at end of file +username: "John"Object<global> \ No newline at end of file diff --git a/1-js/05-data-types/04-array/array-pop.svg b/1-js/05-data-types/04-array/array-pop.svg index a73a0582e7..b97b0c5c97 100644 --- a/1-js/05-data-types/04-array/array-pop.svg +++ b/1-js/05-data-types/04-array/array-pop.svg @@ -1 +1 @@ -0123"Apple""Orange""Pear""Lemon"length = 4очистить012"Apple""Orange""Pear"length = 3 \ No newline at end of file +0123"Apple""Orange""Pear""Lemon"length = 4очистить012"Apple""Orange""Pear"length = 3 \ No newline at end of file diff --git a/1-js/05-data-types/04-array/array-shift.svg b/1-js/05-data-types/04-array/array-shift.svg index 6cc86540d8..5319324c5b 100644 --- a/1-js/05-data-types/04-array/array-shift.svg +++ b/1-js/05-data-types/04-array/array-shift.svg @@ -1 +1 @@ -123"Orange""Pear""Lemon"length = 423"Orange""Pear""Lemon"length = 3очиститьпередвинуть элементы влево0"Apple"012"Orange""Pear""Lemon"11 \ No newline at end of file +123"Orange""Pear""Lemon"length = 423"Orange""Pear""Lemon"length = 3очиститьпередвинуть элементы влево0"Apple"012"Orange""Pear""Lemon"11 \ No newline at end of file diff --git a/1-js/05-data-types/04-array/array-speed.svg b/1-js/05-data-types/04-array/array-speed.svg index 05813cda9b..41f7d998b4 100644 --- a/1-js/05-data-types/04-array/array-speed.svg +++ b/1-js/05-data-types/04-array/array-speed.svg @@ -1 +1 @@ -0123popunshiftpushshift \ No newline at end of file +0123popunshiftpushshift \ No newline at end of file diff --git a/1-js/05-data-types/04-array/queue.svg b/1-js/05-data-types/04-array/queue.svg index 862b869083..e89a3dcd2d 100644 --- a/1-js/05-data-types/04-array/queue.svg +++ b/1-js/05-data-types/04-array/queue.svg @@ -1 +1 @@ -pushshift \ No newline at end of file +pushshift \ No newline at end of file diff --git a/1-js/05-data-types/04-array/stack.svg b/1-js/05-data-types/04-array/stack.svg index 851b1ad5b3..ae0c474d0f 100644 --- a/1-js/05-data-types/04-array/stack.svg +++ b/1-js/05-data-types/04-array/stack.svg @@ -1 +1 @@ -pushpop \ No newline at end of file +pushpop \ No newline at end of file diff --git a/1-js/05-data-types/05-array-methods/reduce.svg b/1-js/05-data-types/05-array-methods/reduce.svg index f61f23663c..180941dc29 100644 --- a/1-js/05-data-types/05-array-methods/reduce.svg +++ b/1-js/05-data-types/05-array-methods/reduce.svg @@ -1 +1 @@ -1sum 0 current 12sum 0+1 current 23sum 0+1+2 current 34sum 0+1+2+3 current 45sum 0+1+2+3+4 current 50+1+2+3+4+5 = 15 \ No newline at end of file +1sum 0 current 12sum 0+1 current 23sum 0+1+2 current 34sum 0+1+2+3 current 45sum 0+1+2+3+4 current 50+1+2+3+4+5 = 15 \ No newline at end of file diff --git a/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg b/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg index 512258c592..8a1ff1a934 100644 --- a/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg +++ b/1-js/05-data-types/10-destructuring-assignment/destructuring-complex.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/05-data-types/12-json/json-meetup.svg b/1-js/05-data-types/12-json/json-meetup.svg index e7c4644f66..3fa32a261c 100644 --- a/1-js/05-data-types/12-json/json-meetup.svg +++ b/1-js/05-data-types/12-json/json-meetup.svg @@ -1 +1 @@ -number: 23title: "Conference"...placeoccupiedByparticipants \ No newline at end of file +number: 23title: "Conference"...placeoccupiedByparticipants \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg b/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg index 317dd8d335..1313837f30 100644 --- a/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg +++ b/1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/fibonacci-recursion-tree.svg @@ -1 +1 @@ -fib ( 5 )fib(4)fib(3)fib(3)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1) \ No newline at end of file +fib ( 5 )fib(4)fib(3)fib(3)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1)fib(1)fib(2)fib(0)fib(1) \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list-0.svg b/1-js/06-advanced-functions/01-recursion/linked-list-0.svg index 596636722e..5d23c7a4c6 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list-0.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list-0.svg @@ -1 +1 @@ -value1nextvalue"new item"nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file +value1nextvalue"new item"nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg b/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg index 9a44ca1e85..2f37449c47 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list-remove-1.svg @@ -1 +1 @@ -value"new item"nextvalue1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file +value"new item"nextvalue1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list-split.svg b/1-js/06-advanced-functions/01-recursion/linked-list-split.svg index 70fc7deef5..6c30721307 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list-split.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list-split.svg @@ -1 +1 @@ -value1nextvalue2nextvalue3nextvalue4nextnullnullsecondListlist \ No newline at end of file +value1nextvalue2nextvalue3nextvalue4nextnullnullsecondListlist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/linked-list.svg b/1-js/06-advanced-functions/01-recursion/linked-list.svg index fc47b0fc33..c02744f390 100644 --- a/1-js/06-advanced-functions/01-recursion/linked-list.svg +++ b/1-js/06-advanced-functions/01-recursion/linked-list.svg @@ -1 +1 @@ -value1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file +value1nextvalue2nextvalue3nextvalue4nextnulllist \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/recursion-pow.svg b/1-js/06-advanced-functions/01-recursion/recursion-pow.svg index fc7abf5611..0901f76364 100644 --- a/1-js/06-advanced-functions/01-recursion/recursion-pow.svg +++ b/1-js/06-advanced-functions/01-recursion/recursion-pow.svg @@ -1 +1 @@ -pow(x,n)xx * pow(x, n-1)n == 1 ?ДаНетрекурсивный вызов до n==1 \ No newline at end of file +pow(x,n)xx * pow(x, n-1)n == 1 ?ДаНетрекурсивный вызов до n==1 \ No newline at end of file diff --git a/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg b/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg index 5d2aef0fee..bd874c5ba6 100644 --- a/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg +++ b/1-js/06-advanced-functions/01-recursion/recursive-salaries.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg b/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg index af0160ce46..c488da0c2b 100644 --- a/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg +++ b/1-js/06-advanced-functions/03-closure/8-make-army/lexenv-makearmy.svg @@ -1 +1 @@ -outeri: 0i: 1i: 2i: 10...makeArmy() LexicalEnvironmentблочный LexicalEnvironment \ No newline at end of file +outeri: 0i: 1i: 2i: 10...makeArmy() LexicalEnvironmentблочный LexicalEnvironment \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-if.svg b/1-js/06-advanced-functions/03-closure/lexenv-if.svg index e8a1596a41..3d4d6d7ccf 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-if.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-if.svg @@ -1 +1 @@ -phrase: "Hello"outerouternulluser: "John" \ No newline at end of file +phrase: "Hello"outerouternulluser: "John" \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg index 5d693059fd..f15e77a888 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-1.svg @@ -1 +1 @@ -makeCounter: function[[Environment]]outernull \ No newline at end of file +makeCounter: function[[Environment]]outernull \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg index ae0df652a2..3cd8162cc1 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-2.svg @@ -1 +1 @@ -makeCounter: functioncounter: undefinedcount: 0outerouternullглобальное LexicalEnvironmentLexicalEnvironment вызова makeCounter() \ No newline at end of file +makeCounter: functioncounter: undefinedcount: 0outerouternullглобальное LexicalEnvironmentLexicalEnvironment вызова makeCounter() \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg index e443a7b61d..54f1d97ba5 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-3.svg @@ -1 +1 @@ -makeCounter: functioncounter: undefinedcount: 0outerouternull[[Environment]] \ No newline at end of file +makeCounter: functioncounter: undefinedcount: 0outerouternull[[Environment]] \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg index 1b1503655c..fb60a785fa 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-4.svg @@ -1 +1 @@ -makeCounter: functioncounter: functioncount: 0outerouternull[[Environment]] \ No newline at end of file +makeCounter: functioncounter: functioncount: 0outerouternull[[Environment]] \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg index 24fcdb96bf..79c440da7a 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-5.svg @@ -1 +1 @@ -makeCounter: functioncounter: functioncount: 0<empty>outerouterouternull[[Environment]] \ No newline at end of file +makeCounter: functioncounter: functioncount: 0<empty>outerouterouternull[[Environment]] \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg index 6b4810ce32..f5a73aa0cb 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-makecounter-6.svg @@ -1 +1 @@ -makeCounter: functioncounter: functioncount: 1outerouternull[[Environment]]изменено здесь \ No newline at end of file +makeCounter: functioncounter: functioncount: 1outerouternull[[Environment]]изменено здесь \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg b/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg index 81c9a5d62a..e5b7f83e78 100644 --- a/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg +++ b/1-js/06-advanced-functions/03-closure/lexenv-nested-work.svg @@ -1 +1 @@ -makeWorker: function name: "John"<empty>outerouterouternullname: "Pete" \ No newline at end of file +makeWorker: function name: "John"<empty>outerouterouternullname: "Pete" \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg index 5c4e265c2a..72d8f77f6b 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-global-2.svg @@ -1 +1 @@ -phrase: "Bye"phrase: "Hello"phrase: undefined<empty>outernullначало выполнения \ No newline at end of file +phrase: "Bye"phrase: "Hello"phrase: undefined<empty>outernullначало выполнения \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg index 61d0afb475..e33d72adad 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-global-3.svg @@ -1 +1 @@ -say: function phrase: "Hello"say: functionouternullначало выполнения \ No newline at end of file +say: function phrase: "Hello"say: functionouternullначало выполнения \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg index 514377b11a..9b032bc88b 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-global.svg @@ -1 +1 @@ -phrase: "Hello"outernullЛексическое Окружение \ No newline at end of file +phrase: "Hello"outernullЛексическое Окружение \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg index 5338e9da72..79501a5b0c 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-simple-lookup.svg @@ -1 +1 @@ -say: function phrase: "Hello"name: "John"outerouternull \ No newline at end of file +say: function phrase: "Hello"name: "John"outerouternull \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg b/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg index c0e1d23400..2778c0919a 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-environment-simple.svg @@ -1 +1 @@ -say: function phrase: "Hello"name: "John"outerouternullЛексическое Окружение вызова \ No newline at end of file +say: function phrase: "Hello"name: "John"outerouternullЛексическое Окружение вызова \ No newline at end of file diff --git a/1-js/06-advanced-functions/03-closure/lexical-search-order.svg b/1-js/06-advanced-functions/03-closure/lexical-search-order.svg index 2721484866..d9884ec4f1 100644 --- a/1-js/06-advanced-functions/03-closure/lexical-search-order.svg +++ b/1-js/06-advanced-functions/03-closure/lexical-search-order.svg @@ -1 +1 @@ -123 \ No newline at end of file +123 \ No newline at end of file diff --git a/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg b/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg index e11136fe59..bce7d6a843 100644 --- a/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg +++ b/1-js/06-advanced-functions/08-settimeout-setinterval/setinterval-interval.svg @@ -1 +1 @@ -func(1)func(2)func(3)100200300 \ No newline at end of file +func(1)func(2)func(3)100200300 \ No newline at end of file diff --git a/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg b/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg index de8ca2616e..d6d233b2ba 100644 --- a/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg +++ b/1-js/06-advanced-functions/08-settimeout-setinterval/settimeout-interval.svg @@ -1 +1 @@ -func(1)func(2)func(3)100100 \ No newline at end of file +func(1)func(2)func(3)100100 \ No newline at end of file diff --git a/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg b/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg index f73b9f5924..3d8428b273 100644 --- a/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg +++ b/1-js/06-advanced-functions/09-call-apply-decorators/decorator-makecaching-wrapper.svg @@ -1 +1 @@ -обёрткавокруг функции \ No newline at end of file +обёрткавокруг функции \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg b/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg index d1db859bd6..982f2e4c17 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/object-prototype-empty.svg @@ -1 +1 @@ -прототип objectobject[[Prototype]] \ No newline at end of file +прототип objectobject[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg index c920cd0811..4bf580ae77 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-chain.svg @@ -1 +1 @@ -eats: true walk: functionanimaljumps: truerabbit[[Prototype]]earLength: 10longEar[[Prototype]] \ No newline at end of file +eats: true walk: functionanimaljumps: truerabbit[[Prototype]]earLength: 10longEar[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg index b895dbfc37..838c78395b 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-2.svg @@ -1 +1 @@ -eats: true walk: functionanimalwalk: functionrabbit[[Prototype]] \ No newline at end of file +eats: true walk: functionanimalwalk: functionrabbit[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg index ca51a037fd..e994331dab 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk-3.svg @@ -1 +1 @@ -walk: function sleep: functionanimalrabbit[[Prototype]]name: "Белый кролик" isSleeping: true \ No newline at end of file +walk: function sleep: functionanimalrabbit[[Prototype]]name: "Белый кролик" isSleeping: true \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg index 8881694318..b324710286 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit-walk.svg @@ -1 +1 @@ -eats: true walk: functionanimaljumps: truerabbit[[Prototype]] \ No newline at end of file +eats: true walk: functionanimaljumps: truerabbit[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg index 26f7b9a00d..4f3c1bc0ec 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-animal-rabbit.svg @@ -1 +1 @@ -eats: trueanimaljumps: truerabbit[[Prototype]] \ No newline at end of file +eats: trueanimaljumps: truerabbit[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg b/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg index a6fb69dd02..bf0baf013a 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/proto-user-admin.svg @@ -1 +1 @@ -name: "John" surname: "Smith" set fullName: functionisAdmin: true name: "Alice" surname: "Cooper"useradmin[[Prototype]] \ No newline at end of file +name: "John" surname: "Smith" set fullName: functionisAdmin: true name: "Alice" surname: "Cooper"useradmin[[Prototype]] \ No newline at end of file diff --git a/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg b/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg index b0dc7fc61c..32a9858f83 100644 --- a/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg +++ b/1-js/08-prototypes/01-prototype-inheritance/rabbit-animal-object.svg @@ -1 +1 @@ -toString: function hasOwnProperty: function ...Object.prototypeanimal[[Prototype]][[Prototype]][[Prototype]]nulleats: truerabbitjumps: true \ No newline at end of file +toString: function hasOwnProperty: function ...Object.prototypeanimal[[Prototype]][[Prototype]][[Prototype]]nulleats: truerabbitjumps: true \ No newline at end of file diff --git a/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg b/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg index 63678b02d5..1fced82b39 100644 --- a/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg +++ b/1-js/08-prototypes/02-function-prototype/function-prototype-constructor.svg @@ -1 +1 @@ -Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file +Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file diff --git a/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg b/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg index 4e0188bd8a..ede4e1227e 100644 --- a/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg +++ b/1-js/08-prototypes/02-function-prototype/proto-constructor-animal-rabbit.svg @@ -1 +1 @@ -eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file +eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg b/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg index 4ec43091b7..2424ea648d 100644 --- a/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg +++ b/1-js/08-prototypes/02-function-prototype/rabbit-prototype-constructor.svg @@ -1 +1 @@ -"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file +"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg b/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg index 63678b02d5..1fced82b39 100644 --- a/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg +++ b/1-js/08-prototypes/03-native-prototypes/function-prototype-constructor.svg @@ -1 +1 @@ -Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file +Rabbitprototypeconstructor"prototype" по умолчанию \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg b/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg index c026f7a728..ebb4f32051 100644 --- a/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg +++ b/1-js/08-prototypes/03-native-prototypes/native-prototypes-array-tostring.svg @@ -1 +1 @@ -toString: function ...Array.prototypetoString: function ...Object.prototype[[Prototype]][[Prototype]][1, 2, 3] \ No newline at end of file +toString: function ...Array.prototypetoString: function ...Object.prototype[[Prototype]][[Prototype]][1, 2, 3] \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg b/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg index d6fad88876..4d6129e0a0 100644 --- a/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg +++ b/1-js/08-prototypes/03-native-prototypes/native-prototypes-classes.svg @@ -1 +1 @@ -toString: function other object methodsObject.prototypenullslice: function other array methods[[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]]Array.prototypecall: function other function methodsFunction.prototypetoFixed: function other number methodsNumber.prototype[1, 2, 3]function f(args) { ... }5 \ No newline at end of file +toString: function other object methodsObject.prototypenullslice: function other array methods[[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]][[Prototype]]Array.prototypecall: function other function methodsFunction.prototypetoFixed: function other number methodsNumber.prototype[1, 2, 3]function f(args) { ... }5 \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg b/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg index f6ac8d8209..9630e68e27 100644 --- a/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg +++ b/1-js/08-prototypes/03-native-prototypes/object-prototype-1.svg @@ -1 +1 @@ -constructor: Object toString: function ...Object.prototypeObjectobj = new Object()[[Prototype]]prototype \ No newline at end of file +constructor: Object toString: function ...Object.prototypeObjectobj = new Object()[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg b/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg index d4551c126a..9ccb342299 100644 --- a/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg +++ b/1-js/08-prototypes/03-native-prototypes/object-prototype-null.svg @@ -1 +1 @@ -obj[[Prototype]]null \ No newline at end of file +obj[[Prototype]]null \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/object-prototype.svg b/1-js/08-prototypes/03-native-prototypes/object-prototype.svg index c6e6774c5c..024dd30213 100644 --- a/1-js/08-prototypes/03-native-prototypes/object-prototype.svg +++ b/1-js/08-prototypes/03-native-prototypes/object-prototype.svg @@ -1 +1 @@ -constructor: Object toString: function ...Object.prototypeObjectprototype \ No newline at end of file +constructor: Object toString: function ...Object.prototypeObjectprototype \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg b/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg index 4e0188bd8a..ede4e1227e 100644 --- a/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg +++ b/1-js/08-prototypes/03-native-prototypes/proto-constructor-animal-rabbit.svg @@ -1 +1 @@ -eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file +eats: truename: "White Rabbit"animalRabbitrabbit[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg b/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg index 4ec43091b7..2424ea648d 100644 --- a/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg +++ b/1-js/08-prototypes/03-native-prototypes/rabbit-prototype-constructor.svg @@ -1 +1 @@ -"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file +"prototype" по умолчаниюRabbitrabbit[[Prototype]]prototypeconstructor \ No newline at end of file diff --git a/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg b/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg index b8e9e818b8..cf4d3023f8 100644 --- a/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg +++ b/1-js/08-prototypes/04-prototype-methods/object-prototype-2.svg @@ -1 +1 @@ -... get __proto__: function set __proto__: functionObject.prototypeObjectobj[[Prototype]]prototype \ No newline at end of file +... get __proto__: function set __proto__: functionObject.prototypeObjectobj[[Prototype]]prototype \ No newline at end of file diff --git a/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg b/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg index d4551c126a..9ccb342299 100644 --- a/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg +++ b/1-js/08-prototypes/04-prototype-methods/object-prototype-null.svg @@ -1 +1 @@ -obj[[Prototype]]null \ No newline at end of file +obj[[Prototype]]null \ No newline at end of file diff --git a/1-js/09-classes/01-class/class-user.svg b/1-js/09-classes/01-class/class-user.svg index 977077a50b..418d71d187 100644 --- a/1-js/09-classes/01-class/class-user.svg +++ b/1-js/09-classes/01-class/class-user.svg @@ -1 +1 @@ -sayHi: functionUserUser.prototypeprototypeconstructor: User \ No newline at end of file +sayHi: functionUserUser.prototypeprototypeconstructor: User \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg b/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg index c93c047712..203c59447a 100644 --- a/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg +++ b/1-js/09-classes/02-class-inheritance/animal-rabbit-extends.svg @@ -1 +1 @@ -constructor: Animal run: function stop: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitnew Rabbit[[Prototype]][[Prototype]]prototypeprototypename: "Белый кролик"constructorconstructorextends \ No newline at end of file +constructor: Animal run: function stop: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitnew Rabbit[[Prototype]][[Prototype]]prototypeprototypename: "Белый кролик"constructorconstructorextends \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg b/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg index 4dd5b0dc02..5ea9bf29ea 100644 --- a/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg +++ b/1-js/09-classes/02-class-inheritance/class-inheritance-array-object.svg @@ -1 +1 @@ -slice: function ...Array.prototypearrhasOwnProperty: function ...Object.prototype[1, 2, 3][[Prototype]][[Prototype]] \ No newline at end of file +slice: function ...Array.prototypearrhasOwnProperty: function ...Object.prototype[1, 2, 3][[Prototype]][[Prototype]] \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg index 14a81b6bcf..2172088e64 100644 --- a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg +++ b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal-2.svg @@ -1 +1 @@ -jump: functionRabbit.prototyperabbiteat: functionAnimal.prototypename: "Белый кролик"[[Prototype]][[Prototype]]Rabbit.prototype.__proto__ = Animal.prototype sets thistoString: function hasOwnProperty: function ...Object.prototype[[Prototype]][[Prototype]]null \ No newline at end of file +jump: functionRabbit.prototyperabbiteat: functionAnimal.prototypename: "Белый кролик"[[Prototype]][[Prototype]]Rabbit.prototype.__proto__ = Animal.prototype sets thistoString: function hasOwnProperty: function ...Object.prototype[[Prototype]][[Prototype]]null \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg index 5b00a1fb96..1b21dd81b5 100644 --- a/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg +++ b/1-js/09-classes/02-class-inheritance/class-inheritance-rabbit-animal.svg @@ -1 +1 @@ -методы RabbitRabbit.prototyperabbitметоды AnimalAnimal.prototype[[Prototype]][[Prototype]]свойства rabbit \ No newline at end of file +методы RabbitRabbit.prototyperabbitметоды AnimalAnimal.prototype[[Prototype]][[Prototype]]свойства rabbit \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg index 71d070e05c..62b876d3ac 100644 --- a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg +++ b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-animal.svg @@ -1 +1 @@ - constructor: Animal run: function stop: functionAnimal.prototypeAnimalnew Animal[[Prototype]]prototypename: "Мой питомец" \ No newline at end of file + constructor: Animal run: function stop: functionAnimal.prototypeAnimalnew Animal[[Prototype]]prototypename: "Мой питомец" \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg index f42387effa..ff669d3d84 100644 --- a/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg +++ b/1-js/09-classes/02-class-inheritance/rabbit-animal-independent-rabbit.svg @@ -1 +1 @@ - constructor: Rabbit hide: functionRabbit.prototypeRabbitnew Rabbit[[Prototype]]prototypename: "Мой кролик" \ No newline at end of file + constructor: Rabbit hide: functionRabbit.prototypeRabbitnew Rabbit[[Prototype]]prototypename: "Мой кролик" \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg b/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg index fa747bd124..f6450ddc49 100644 --- a/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg +++ b/1-js/09-classes/02-class-inheritance/super-homeobject-wrong.svg @@ -1 +1 @@ -sayHiplantsayHitreesayHianimalrabbit[[HomeObject]]sayHi \ No newline at end of file +sayHiplantsayHitreesayHianimalrabbit[[HomeObject]]sayHi \ No newline at end of file diff --git a/1-js/09-classes/02-class-inheritance/this-super-loop.svg b/1-js/09-classes/02-class-inheritance/this-super-loop.svg index 8f43d5967a..4f5f45034a 100644 --- a/1-js/09-classes/02-class-inheritance/this-super-loop.svg +++ b/1-js/09-classes/02-class-inheritance/this-super-loop.svg @@ -1 +1 @@ -rabbitlongEarrabbitlongEar \ No newline at end of file +rabbitlongEarrabbitlongEar \ No newline at end of file diff --git a/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg b/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg index a27a34800a..34d783b4de 100644 --- a/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg +++ b/1-js/09-classes/03-static-properties-methods/1-class-extend-object/rabbit-extends-object.svg @@ -1 +1 @@ -call: function bind: function ...Function.prototypeconstructorObjectRabbit[[Prototype]][[Prototype]]constructorcall: function bind: function ...Function.prototypeRabbit[[Prototype]]constructorclass Rabbitclass Rabbit extends Object \ No newline at end of file +call: function bind: function ...Function.prototypeconstructorObjectRabbit[[Prototype]][[Prototype]]constructorcall: function bind: function ...Function.prototypeRabbit[[Prototype]]constructorclass Rabbitclass Rabbit extends Object \ No newline at end of file diff --git a/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg b/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg index 95fdad628e..ee1fc54748 100644 --- a/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg +++ b/1-js/09-classes/03-static-properties-methods/animal-rabbit-static.svg @@ -1 +1 @@ -constructor: Animal run: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitrabbit[[Prototype]][[Prototype]][[Prototype]]prototypeprototypecomparename: "Белый кролик" \ No newline at end of file +constructor: Animal run: functionAnimal.prototypeconstructor: Rabbit hide: functionRabbit.prototypeAnimalRabbitrabbit[[Prototype]][[Prototype]][[Prototype]]prototypeprototypecomparename: "Белый кролик" \ No newline at end of file diff --git a/1-js/09-classes/05-extend-natives/object-date-inheritance.svg b/1-js/09-classes/05-extend-natives/object-date-inheritance.svg index 3f2adcc8ec..be47d7fd96 100644 --- a/1-js/09-classes/05-extend-natives/object-date-inheritance.svg +++ b/1-js/09-classes/05-extend-natives/object-date-inheritance.svg @@ -1 +1 @@ -constructor: Object toString: function hasOwnProperty: function ...Object.prototypeconstructor: Date toString: function getDate: function ...Date.prototypeObjectDatenew Date()[[Prototype]][[Prototype]]prototypeprototypedefineProperty keys ...now parse ...1 Jan 2019 \ No newline at end of file +constructor: Object toString: function hasOwnProperty: function ...Object.prototypeconstructor: Date toString: function getDate: function ...Date.prototypeObjectDatenew Date()[[Prototype]][[Prototype]]prototypeprototypedefineProperty keys ...now parse ...1 Jan 2019 \ No newline at end of file diff --git a/1-js/09-classes/06-instanceof/instanceof.svg b/1-js/09-classes/06-instanceof/instanceof.svg index 61985bd68d..d63b03a8a2 100644 --- a/1-js/09-classes/06-instanceof/instanceof.svg +++ b/1-js/09-classes/06-instanceof/instanceof.svg @@ -1 +1 @@ -Animal.prototypeObject.prototypeRabbit.prototype[[Prototype]]rabbit[[Prototype]][[Prototype]]null[[Prototype]]= Animal.prototype? \ No newline at end of file +Animal.prototypeObject.prototypeRabbit.prototype[[Prototype]]rabbit[[Prototype]][[Prototype]]null[[Prototype]]= Animal.prototype? \ No newline at end of file diff --git a/1-js/09-classes/07-mixins/mixin-inheritance.svg b/1-js/09-classes/07-mixins/mixin-inheritance.svg index cfe84ef577..1fdc223936 100644 --- a/1-js/09-classes/07-mixins/mixin-inheritance.svg +++ b/1-js/09-classes/07-mixins/mixin-inheritance.svg @@ -1 +1 @@ -sayHi: function sayBye: functionsayHiMixinsay: functionsayMixin[[Prototype]]constructor: User sayHi: function sayBye: functionUser.prototype[[Prototype]]name: ...user[[HomeObject] \ No newline at end of file +sayHi: function sayBye: functionsayHiMixinsay: functionsayMixin[[Prototype]]constructor: User sayHi: function sayBye: functionUser.prototype[[Prototype]]name: ...user[[HomeObject] \ No newline at end of file diff --git a/1-js/10-error-handling/1-try-catch/try-catch-flow.svg b/1-js/10-error-handling/1-try-catch/try-catch-flow.svg index f9c6e31d1d..8e6ca4d79c 100644 --- a/1-js/10-error-handling/1-try-catch/try-catch-flow.svg +++ b/1-js/10-error-handling/1-try-catch/try-catch-flow.svg @@ -1 +1 @@ -НачалоНет ошибокВ коде произошла ошибкаИгнорировать блок catchИгнорировать остаток tryВыполнить блок catchtry { }// код... \ No newline at end of file +НачалоНет ошибокВ коде произошла ошибкаИгнорировать блок catchИгнорировать остаток tryВыполнить блок catchtry { }// код... \ No newline at end of file diff --git a/1-js/11-async/01-callbacks/callback-hell.svg b/1-js/11-async/01-callbacks/callback-hell.svg index 6ce6eec906..bd53e44322 100644 --- a/1-js/11-async/01-callbacks/callback-hell.svg +++ b/1-js/11-async/01-callbacks/callback-hell.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-reject-1.svg b/1-js/11-async/02-promise-basics/promise-reject-1.svg index a16ff536e7..777e477394 100644 --- a/1-js/11-async/02-promise-basics/promise-reject-1.svg +++ b/1-js/11-async/02-promise-basics/promise-reject-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedreject(error)state: "rejected" result: error \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-1.svg b/1-js/11-async/02-promise-basics/promise-resolve-1.svg index bf086402e2..f1f34eaee1 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-1.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-1.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedresolve("done")state: "fulfilled" result: "done" \ No newline at end of file diff --git a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg index 13e7dc95f4..80593a3a4b 100644 --- a/1-js/11-async/02-promise-basics/promise-resolve-reject.svg +++ b/1-js/11-async/02-promise-basics/promise-resolve-reject.svg @@ -1 +1 @@ -new Promise(executor)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file +new Promise(executor)state: "pending" result: undefinedresolve(value)reject(error)state: "fulfilled" result: valuestate: "rejected" result: error \ No newline at end of file diff --git a/1-js/11-async/03-promise-chaining/promise-handler-variants.svg b/1-js/11-async/03-promise-chaining/promise-handler-variants.svg index 9c327d8c6a..cf5a2c7a69 100644 --- a/1-js/11-async/03-promise-chaining/promise-handler-variants.svg +++ b/1-js/11-async/03-promise-chaining/promise-handler-variants.svg @@ -1 +1 @@ -возвратом значениявозвратом промисаошибкойstate: "fulfilled" result: valuestate: "rejected" result: error...с результатом нового промиса...state: "pending" result: undefinedвызов .then(handler) всегда возвращает промис:если handler заканчивается…этот промис завершается с: \ No newline at end of file +возвратом значениявозвратом промисаошибкойstate: "fulfilled" result: valuestate: "rejected" result: error...с результатом нового промиса...state: "pending" result: undefinedвызов .then(handler) всегда возвращает промис:если handler заканчивается…этот промис завершается с: \ No newline at end of file diff --git a/1-js/11-async/03-promise-chaining/promise-then-chain.svg b/1-js/11-async/03-promise-chaining/promise-then-chain.svg index 5dcb55a4be..fb60142fbd 100644 --- a/1-js/11-async/03-promise-chaining/promise-then-chain.svg +++ b/1-js/11-async/03-promise-chaining/promise-then-chain.svg @@ -1 +1 @@ -.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file +.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file diff --git a/1-js/11-async/03-promise-chaining/promise-then-many.svg b/1-js/11-async/03-promise-chaining/promise-then-many.svg index cf2a813e75..8fea7beaaf 100644 --- a/1-js/11-async/03-promise-chaining/promise-then-many.svg +++ b/1-js/11-async/03-promise-chaining/promise-then-many.svg @@ -1 +1 @@ -.thennew Promiseresolve(1).then.then \ No newline at end of file +.thennew Promiseresolve(1).then.then \ No newline at end of file diff --git a/1-js/11-async/04-promise-error-handling/promise-then-chain.svg b/1-js/11-async/04-promise-error-handling/promise-then-chain.svg index 5dcb55a4be..fb60142fbd 100644 --- a/1-js/11-async/04-promise-error-handling/promise-then-chain.svg +++ b/1-js/11-async/04-promise-error-handling/promise-then-chain.svg @@ -1 +1 @@ -.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file +.thennew Promiseresolve(1)return 2.thenreturn 4.then \ No newline at end of file diff --git a/1-js/11-async/04-promise-error-handling/promise-then-many.svg b/1-js/11-async/04-promise-error-handling/promise-then-many.svg index cf2a813e75..8fea7beaaf 100644 --- a/1-js/11-async/04-promise-error-handling/promise-then-many.svg +++ b/1-js/11-async/04-promise-error-handling/promise-then-many.svg @@ -1 +1 @@ -.thennew Promiseresolve(1).then.then \ No newline at end of file +.thennew Promiseresolve(1).then.then \ No newline at end of file diff --git a/1-js/11-async/07-microtask-queue/promiseQueue.svg b/1-js/11-async/07-microtask-queue/promiseQueue.svg index 380671b91c..d9df04d704 100644 --- a/1-js/11-async/07-microtask-queue/promiseQueue.svg +++ b/1-js/11-async/07-microtask-queue/promiseQueue.svg @@ -1 +1 @@ -promise . then ( handler ); ... alert ( "код завершён" );handler в очередизапускается handler из очередивыполнение скрипта завершено \ No newline at end of file +promise . then ( handler ); ... alert ( "код завершён" );handler в очередизапускается handler из очередивыполнение скрипта завершено \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/genYield2-2.svg b/1-js/12-generators-iterators/1-generators/genYield2-2.svg index 5103c1dded..e100650905 100644 --- a/1-js/12-generators-iterators/1-generators/genYield2-2.svg +++ b/1-js/12-generators-iterators/1-generators/genYield2-2.svg @@ -1 +1 @@ -"2 + 2 = ?""3 * 3 = ?". next ( 4 ). next ( 9 )ГенераторВызывающий код \ No newline at end of file +"2 + 2 = ?""3 * 3 = ?". next ( 4 ). next ( 9 )ГенераторВызывающий код \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/genYield2.svg b/1-js/12-generators-iterators/1-generators/genYield2.svg index 5570c39dd1..9776156cd2 100644 --- a/1-js/12-generators-iterators/1-generators/genYield2.svg +++ b/1-js/12-generators-iterators/1-generators/genYield2.svg @@ -1 +1 @@ -question = "2 + 2 = ?"ГенераторВызывающий код.next(4) \ No newline at end of file +question = "2 + 2 = ?"ГенераторВызывающий код.next(4) \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-1.svg b/1-js/12-generators-iterators/1-generators/generateSequence-1.svg index acf4ccc220..138df324cc 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-1.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-2.svg b/1-js/12-generators-iterators/1-generators/generateSequence-2.svg index c1dbcb84f1..7478543a4b 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-2.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-2.svg @@ -1 +1 @@ -{value: 1, done: false} \ No newline at end of file +{value: 1, done: false} \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-3.svg b/1-js/12-generators-iterators/1-generators/generateSequence-3.svg index 04f9afe015..d32b114f98 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-3.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-3.svg @@ -1 +1 @@ -{value: 2, done: false} \ No newline at end of file +{value: 2, done: false} \ No newline at end of file diff --git a/1-js/12-generators-iterators/1-generators/generateSequence-4.svg b/1-js/12-generators-iterators/1-generators/generateSequence-4.svg index d2fd93c9d9..23049fcd21 100644 --- a/1-js/12-generators-iterators/1-generators/generateSequence-4.svg +++ b/1-js/12-generators-iterators/1-generators/generateSequence-4.svg @@ -1 +1 @@ -{value: 3, done: true} \ No newline at end of file +{value: 3, done: true} \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg b/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg index 1def75c6ba..8f75484e9c 100644 --- a/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg +++ b/1-js/99-js-misc/01-proxy/proxy-inherit-admin.svg @@ -1 +1 @@ -_name: "Guest" name: getter_name: "Admin"user (прокси)исходный useradmin[[Prototype]] \ No newline at end of file +_name: "Guest" name: getter_name: "Admin"user (прокси)исходный useradmin[[Prototype]] \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy-inherit.svg b/1-js/99-js-misc/01-proxy/proxy-inherit.svg index ed773bfb81..9a5706c55e 100644 --- a/1-js/99-js-misc/01-proxy/proxy-inherit.svg +++ b/1-js/99-js-misc/01-proxy/proxy-inherit.svg @@ -1 +1 @@ -_name: "Guest" name: getteruser (прокси)исходный user \ No newline at end of file +_name: "Guest" name: getteruser (прокси)исходный user \ No newline at end of file diff --git a/1-js/99-js-misc/01-proxy/proxy.svg b/1-js/99-js-misc/01-proxy/proxy.svg index 86c9563321..157e350f44 100644 --- a/1-js/99-js-misc/01-proxy/proxy.svg +++ b/1-js/99-js-misc/01-proxy/proxy.svg @@ -1 +1 @@ -test: 5proxytargetget proxy.test5 \ No newline at end of file +test: 5proxytargetget proxy.test5 \ No newline at end of file diff --git a/2-ui/1-document/01-browser-environment/windowObjects.svg b/2-ui/1-document/01-browser-environment/windowObjects.svg index 3dc3346753..b7e18bb347 100644 --- a/2-ui/1-document/01-browser-environment/windowObjects.svg +++ b/2-ui/1-document/01-browser-environment/windowObjects.svg @@ -1 +1 @@ -windowdocumentObjectnavigatorscreenlocationframeshistoryArrayFunctionXMLHttpRequestBOMJavaScriptDOM \ No newline at end of file +windowdocumentObjectnavigatorscreenlocationframeshistoryArrayFunctionXMLHttpRequestBOMJavaScriptDOM \ No newline at end of file diff --git a/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg b/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg index 002e8fc830..5bdf20a83a 100644 --- a/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg +++ b/2-ui/1-document/02-dom-nodes/toolbarButtonGlyphs.svg @@ -4,8 +4,8 @@ xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="https://www.w3.org/2000/svg" - xmlns="https://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" diff --git a/2-ui/1-document/03-dom-navigation/dom-links-elements.svg b/2-ui/1-document/03-dom-navigation/dom-links-elements.svg index 2a75ea447c..fd0b2826a4 100644 --- a/2-ui/1-document/03-dom-navigation/dom-links-elements.svg +++ b/2-ui/1-document/03-dom-navigation/dom-links-elements.svg @@ -1 +1 @@ -document.documentElement <HTML>document.body (if inside body)parent Element<DIV>next Element Siblingprevious Element Siblingchildrenfirst Element Child last Element Child \ No newline at end of file +document.documentElement <HTML>document.body (if inside body)parent Element<DIV>next Element Siblingprevious Element Siblingchildrenfirst Element Child last Element Child \ No newline at end of file diff --git a/2-ui/1-document/03-dom-navigation/dom-links.svg b/2-ui/1-document/03-dom-navigation/dom-links.svg index 24a9e0e689..6c34bca4a4 100644 --- a/2-ui/1-document/03-dom-navigation/dom-links.svg +++ b/2-ui/1-document/03-dom-navigation/dom-links.svg @@ -1 +1 @@ -documentdocument.documentElement <HTML>document.body (if inside body)parentNode<DIV>nextSiblingpreviousSiblingchildNodesfirstChild lastChild \ No newline at end of file +documentdocument.documentElement <HTML>document.body (if inside body)parentNode<DIV>nextSiblingpreviousSiblingchildNodesfirstChild lastChild \ No newline at end of file diff --git a/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg b/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg index 2b63967dfa..39f7d8f8c3 100644 --- a/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg +++ b/2-ui/1-document/05-basic-dom-node-properties/dom-class-hierarchy.svg @@ -1 +1 @@ -EventTargetNode Element HTMLElement HTMLBodyElement HTMLInputElement HTMLAnchorElement Text Comment SVGElement <div> Text </div><input type="…"><body><a href="…">< div > Text </ div ><!--comment--> \ No newline at end of file +EventTargetNode Element HTMLElement HTMLBodyElement HTMLInputElement HTMLAnchorElement Text Comment SVGElement <div> Text </div><input type="…"><body><a href="…">< div > Text </ div ><!--comment--> \ No newline at end of file diff --git a/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg b/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg index f651c20e95..0843713cec 100644 --- a/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg +++ b/2-ui/1-document/07-modifying-document/before-prepend-append-after.svg @@ -1 +1 @@ -ol.afterol.appendol.prependol.before(…nodes or strings) \ No newline at end of file +ol.afterol.appendol.prependol.before(…nodes or strings) \ No newline at end of file diff --git a/2-ui/1-document/07-modifying-document/insert-adjacent.svg b/2-ui/1-document/07-modifying-document/insert-adjacent.svg index fa8ad82845..e26fd023a1 100644 --- a/2-ui/1-document/07-modifying-document/insert-adjacent.svg +++ b/2-ui/1-document/07-modifying-document/insert-adjacent.svg @@ -1 +1 @@ -ol.insertAdjacentHTML(*, html)afterendbeforeendafterbeginbeforebegin \ No newline at end of file +ol.insertAdjacentHTML(*, html)afterendbeforeendafterbeginbeforebegin \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg b/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg index e263be16a5..4ae90b1c71 100644 --- a/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg +++ b/2-ui/1-document/09-size-and-scroll/4-put-ball-in-center/field.svg @@ -1 +1 @@ -(0,0)clientWidth \ No newline at end of file +(0,0)clientWidth \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-all.svg b/2-ui/1-document/09-size-and-scroll/metric-all.svg index e1078df769..a5dadb47f0 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-all.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-all.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeightoffsetHeightscrollTopclientHeightoffsetTopclientLeftclientWidthclientTopoffsetLeftoffsetWidth \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeightoffsetHeightscrollTopclientHeightoffsetTopclientLeftclientWidthclientTopoffsetLeftoffsetWidth \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg b/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg index 34d54ee9e3..e8dd3d60a0 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-left-top-rtl.svg @@ -1 +1 @@ -clientTop: 25px = borderclientLeft: 41px \ No newline at end of file +clientTop: 25px = borderclientLeft: 41px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg b/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg index cef29a882d..8097afa78f 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-left-top.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.clientTop: 25px = borderclientLeft: 25px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997.clientTop: 25px = borderclientLeft: 25px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg b/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg index d346616742..83864b4c57 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-width-height.svg @@ -1 +1 @@ -border 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxclientWidth = 20+284+20 = 324pxclientHeight: 240pxheight: 200pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file +border 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxclientWidth = 20+284+20 = 324pxclientHeight: 240pxheight: 200pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg b/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg index 7b92735b0b..330d2a7c04 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-client-width-nopadding.svg @@ -1 +1 @@ -clientWidth: 284px = content widthCSS width: 300pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with padding: 0; width: 300px; \ No newline at end of file +clientWidth: 284px = content widthCSS width: 300pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with padding: 0; width: 300px; \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-css.svg b/2-ui/1-document/09-size-and-scroll/metric-css.svg index 59861ff245..13aa62afd0 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-css.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-css.svg @@ -1 +1 @@ -padding: 20pxheight: 200pxpadding: 20pxborder 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file +padding: 20pxheight: 200pxpadding: 20pxborder 25pxpadding 20pxcontent width: 284pxborder 25pxpadding 20pxscrollbar 16pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg b/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg index a0bdcef42b..9e247639be 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-offset-parent.svg @@ -1 +1 @@ -offsetTop: 180pxoffsetLeft: 180pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoftposition: absolute; left: 180px; top: 180px;offsetParent <MAIN> <DIV> \ No newline at end of file +offsetTop: 180pxoffsetLeft: 180pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoftposition: absolute; left: 180px; top: 180px;offsetParent <MAIN> <DIV> \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg b/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg index 5af4b3980f..49bdccda78 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-offset-width-height.svg @@ -1 +1 @@ -border 25pxpadding 20pxcontent width: 284pxheight: 200pxborder 25pxpadding 20pxscrollbar 16pxoffsetWidth = 25+20+284+20+16+25 = 390pxoffsetHeight: 290pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file +border 25pxpadding 20pxcontent width: 284pxheight: 200pxborder 25pxpadding 20pxscrollbar 16pxoffsetWidth = 25+20+284+20+16+25 = 390pxoffsetHeight: 290pxIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg b/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg index 687b0cda55..c6d14d0f38 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-scroll-top.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollTopscrollHeight: 723px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollTopscrollHeight: 723px \ No newline at end of file diff --git a/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg b/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg index 0fbb7d42a1..0c3d299528 100644 --- a/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg +++ b/2-ui/1-document/09-size-and-scroll/metric-scroll-width-height.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeight: 723pxscrollWidth = 324px \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.scrollHeight: 723pxscrollWidth = 324px \ No newline at end of file diff --git a/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg b/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg index 58a370d5b5..829d27ee85 100644 --- a/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg +++ b/2-ui/1-document/10-size-and-scroll-window/document-client-width-height.svg @@ -1 +1 @@ -documentElement.clientHeightdocumentElement.clientWidth \ No newline at end of file +documentElement.clientHeightdocumentElement.clientWidth \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/coordinates-negative.svg b/2-ui/1-document/11-coordinates/coordinates-negative.svg index 56c7a99571..4f2e78687c 100644 --- a/2-ui/1-document/11-coordinates/coordinates-negative.svg +++ b/2-ui/1-document/11-coordinates/coordinates-negative.svg @@ -1 +1 @@ -bottom(x,y)(x,y)leftrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top(width,height) \ No newline at end of file +bottom(x,y)(x,y)leftrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top(width,height) \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/coordinates.svg b/2-ui/1-document/11-coordinates/coordinates.svg index ebebbec346..261ff66966 100644 --- a/2-ui/1-document/11-coordinates/coordinates.svg +++ b/2-ui/1-document/11-coordinates/coordinates.svg @@ -1 +1 @@ -heightbottomxleftywidthrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top \ No newline at end of file +heightbottomxleftywidthrightIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at top \ No newline at end of file diff --git a/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg b/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg index 34ac00c7e7..f03317f0c3 100644 --- a/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg +++ b/2-ui/1-document/11-coordinates/document-and-window-coordinates-scrolled.svg @@ -1 +1 @@ -Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.😍pageYclientYpageXclientXIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.pageYclientYpageXclientX😍 \ No newline at end of file +Introduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.😍pageYclientYpageXclientXIntroduction This Ecma Standard is based on several originating technologies, the most well known being JavaScript (Netscape) and JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company’s Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft starting with Internet Explorer 3.0. The development of this Standard started in November 1996. The first edition of this Ecma Standard was adopted by the Ecma General Assembly of June 1997. That Ecma Standard was submitted to ISO/ IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition are editorial in nature.pageYclientYpageXclientX😍 \ No newline at end of file diff --git a/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg b/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg index b6d24d9f69..fc26b023c5 100644 --- a/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg +++ b/2-ui/2-events/01-introduction-browser-events/04-move-ball-field/move-ball-coords.svg @@ -1 +1 @@ -ball.style.left?fieldCoords.leftevent.clientX \ No newline at end of file +ball.style.left?fieldCoords.leftevent.clientX \ No newline at end of file diff --git a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg index 11689456de..5bb161f6cb 100644 --- a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg +++ b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel1.svg @@ -1 +1 @@ -div (container)130x130ul (width: 9999px) \ No newline at end of file +div (container)130x130ul (width: 9999px) \ No newline at end of file diff --git a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg index 8006cb3876..81aea5b89e 100644 --- a/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg +++ b/2-ui/2-events/01-introduction-browser-events/07-carousel/carousel2.svg @@ -1 +1 @@ -div (container)130x130ul (margin-left: -350px) \ No newline at end of file +div (container)130x130ul (margin-left: -350px) \ No newline at end of file diff --git a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg index d9d5f96c06..fd2a13f7bc 100644 --- a/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg +++ b/2-ui/2-events/02-bubbling-and-capturing/event-order-bubbling.svg @@ -1 +1 @@ -123Самый глубоко вложенный элемент \ No newline at end of file +123Самый глубоко вложенный элемент \ No newline at end of file diff --git a/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg b/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg index fd25c06bda..566064cd6b 100644 --- a/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg +++ b/2-ui/2-events/02-bubbling-and-capturing/eventflow.svg @@ -1 +1 @@ -WindowDocument<html><body><table><tbody><tr><tr><td>Shady Grove<td>Aeolian<td>Over the River,Charlie<td>DorianTargetPhase(2)CapturePhase(1)BubblingPhase(3) \ No newline at end of file +WindowDocument<html><body><table><tbody><tr><tr><td>Shady Grove<td>Aeolian<td>Over the River,Charlie<td>DorianTargetPhase(2)CapturePhase(1)BubblingPhase(3) \ No newline at end of file diff --git a/2-ui/2-events/03-event-delegation/bagua-bubble.svg b/2-ui/2-events/03-event-delegation/bagua-bubble.svg index b6780147fc..4ae67102dd 100644 --- a/2-ui/2-events/03-event-delegation/bagua-bubble.svg +++ b/2-ui/2-events/03-event-delegation/bagua-bubble.svg @@ -1 +1 @@ -<table><td><strong>event.target \ No newline at end of file +<table><td><strong>event.target \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg index 0509b7572a..6044eff17d 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-bubble-nested.svg @@ -1 +1 @@ -mouseoutmouseover#parent#child \ No newline at end of file +mouseoutmouseover#parent#child \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg index c3d5288efb..22335b52e1 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-from-outside.svg @@ -1 +1 @@ -#TOtargetrelatedTarget = null \ No newline at end of file +#TOtargetrelatedTarget = null \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg index 4b76476991..437f03b102 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout-over-elems.svg @@ -1 +1 @@ -#TO#FROM<DIV><DIV><DIV>mouseovermouseout \ No newline at end of file +#TO#FROM<DIV><DIV><DIV>mouseovermouseout \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg index 0c32a8eeba..1277ddff55 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-mouseout.svg @@ -1 +1 @@ -<DIV>mouseovermouseout \ No newline at end of file +<DIV>mouseovermouseout \ No newline at end of file diff --git a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg index eff4f74fdd..78210845b4 100644 --- a/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg +++ b/2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/mouseover-to-child.svg @@ -1 +1 @@ -mouseoutmouseover#parent#child \ No newline at end of file +mouseoutmouseover#parent#child \ No newline at end of file diff --git a/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg b/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg index e263be16a5..4ae90b1c71 100644 --- a/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg +++ b/2-ui/3-event-details/4-mouse-drag-and-drop/2-drag-heroes/solution.view/field.svg @@ -1 +1 @@ -(0,0)clientWidth \ No newline at end of file +(0,0)clientWidth \ No newline at end of file diff --git a/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg b/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg index af7c1b4bdb..29fdb31ef0 100644 --- a/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg +++ b/2-ui/3-event-details/4-mouse-drag-and-drop/ball_shift.svg @@ -1 +1 @@ -shiftXshiftY \ No newline at end of file +shiftXshiftY \ No newline at end of file diff --git a/2-ui/3-event-details/5-keyboard-events/german-layout.svg b/2-ui/3-event-details/5-keyboard-events/german-layout.svg index b75ac951a4..8a880e8e03 100644 --- a/2-ui/3-event-details/5-keyboard-events/german-layout.svg +++ b/2-ui/3-event-details/5-keyboard-events/german-layout.svg @@ -1 +1 @@ -StrgStrgAl tAlt GrWinWinMenu \ No newline at end of file +StrgStrgAl tAlt GrWinWinMenu \ No newline at end of file diff --git a/2-ui/3-event-details/5-keyboard-events/us-layout.svg b/2-ui/3-event-details/5-keyboard-events/us-layout.svg index c488d00af8..699277e02d 100644 --- a/2-ui/3-event-details/5-keyboard-events/us-layout.svg +++ b/2-ui/3-event-details/5-keyboard-events/us-layout.svg @@ -1 +1 @@ -Caps LockShiftShift \ No newline at end of file +Caps LockShiftShift \ No newline at end of file diff --git a/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg b/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg index 86aed1ddff..7535dd311c 100644 --- a/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg +++ b/2-ui/3-event-details/8-onscroll/3-load-visible-img/solution.view/placeholder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg b/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg index 86aed1ddff..7535dd311c 100644 --- a/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg +++ b/2-ui/3-event-details/8-onscroll/3-load-visible-img/source.view/placeholder.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/2-ui/4-forms-controls/1-form-elements/form-navigation.svg b/2-ui/4-forms-controls/1-form-elements/form-navigation.svg index 02eb3e5b5c..2c9080703d 100644 --- a/2-ui/4-forms-controls/1-form-elements/form-navigation.svg +++ b/2-ui/4-forms-controls/1-form-elements/form-navigation.svg @@ -1 +1 @@ -formelements[0]elements[1]elements[n]...formform \ No newline at end of file +formelements[0]elements[1]elements[n]...formform \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg index bd8ba4cc3f..9ebcffaac4 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-0-1.svg @@ -1 +1 @@ -0123 \ No newline at end of file +0123 \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg index 4085655255..088c71c208 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-1-3.svg @@ -1 +1 @@ -0123 \ No newline at end of file +0123 \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg index e704d5b2f5..f13c6d74a7 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3-range.svg @@ -1 +1 @@ -startContainer (<p>.firstChild)startOffset (=2)commonAncestorContainer (<p>)endContainer (<b>.firstChild)endOffset (=3) \ No newline at end of file +startContainer (<p>.firstChild)startOffset (=2)commonAncestorContainer (<p>)endContainer (<b>.firstChild)endOffset (=3) \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg index 7b7d71be23..4bf5b00b00 100644 --- a/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg +++ b/2-ui/99-ui-misc/02-selection-range/range-example-p-2-b-3.svg @@ -1 +1 @@ -0123 \ No newline at end of file +0123 \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg b/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg index 7beae79665..b5b2c0dd5b 100644 --- a/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg +++ b/2-ui/99-ui-misc/02-selection-range/selection-direction-backward.svg @@ -1 +1 @@ -фокусякорьmouse move direction \ No newline at end of file +фокусякорьmouse move direction \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg b/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg index 6ec81daf42..d97c1503b9 100644 --- a/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg +++ b/2-ui/99-ui-misc/02-selection-range/selection-direction-forward.svg @@ -1 +1 @@ -якорьфокусmouse move direction \ No newline at end of file +якорьфокусmouse move direction \ No newline at end of file diff --git a/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg b/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg index dcee5504f4..537c837fa0 100644 --- a/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg +++ b/2-ui/99-ui-misc/02-selection-range/selection-firefox.svg @@ -1 +1 @@ -выделение \ No newline at end of file +выделение \ No newline at end of file diff --git a/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg b/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg index d0907bb9a6..f5660fff9a 100644 --- a/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg +++ b/2-ui/99-ui-misc/03-event-loop/eventLoop-full.svg @@ -1 +1 @@ -...mousemoveсобытийный циклрендерингмикрозадачирендерингмикрозадачискриптsetTimeout \ No newline at end of file +...mousemoveсобытийный циклрендерингмикрозадачирендерингмикрозадачискриптsetTimeout \ No newline at end of file diff --git a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg index 50104579e1..eb4eecf1a9 100644 --- a/2-ui/99-ui-misc/03-event-loop/eventLoop.svg +++ b/2-ui/99-ui-misc/03-event-loop/eventLoop.svg @@ -1 +1 @@ -...mousemoveскриптсобытийный циклочередь макрозадачsetTimeout \ No newline at end of file +...mousemoveскриптсобытийный циклочередь макрозадачsetTimeout \ No newline at end of file diff --git a/20-css-for-js/10-box-sizing/border-box.svg b/20-css-for-js/10-box-sizing/border-box.svg index 7b531e5cac..90f792a67f 100644 --- a/20-css-for-js/10-box-sizing/border-box.svg +++ b/20-css-for-js/10-box-sizing/border-box.svg @@ -1 +1 @@ -ContentContentborder-boxcontent-boxborder: 5px; padding: 20px; \ No newline at end of file +ContentContentborder-boxcontent-boxborder: 5px; padding: 20px; \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg index b24e373dd8..b697d63043 100644 --- a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg +++ b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-256.svg @@ -1 +1 @@ -8-bit integer256 \ No newline at end of file +8-bit integer256 \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg index 308ca4abf0..8e3074fdf3 100644 --- a/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg +++ b/4-binary/01-arraybuffer-binary-arrays/8bit-integer-257.svg @@ -1 +1 @@ -8-bit integer257 \ No newline at end of file +8-bit integer257 \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg index 64874459d7..b9de47de1e 100644 --- a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg +++ b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-view-buffersource.svg @@ -1 +1 @@ -02134567012301new ArrayBuffer(16)ArrayBufferViewUint16Array Int16ArrayUint8Array Int8Array Uint8ClampedArrayUint32Array Int32Array Float32ArrayFloat64ArrayDataViewget/setUint8(offset) get/setFloat32(offset)...BufferSource1023456789101112131415 \ No newline at end of file +02134567012301new ArrayBuffer(16)ArrayBufferViewUint16Array Int16ArrayUint8Array Int8Array Uint8ClampedArrayUint32Array Int32Array Float32ArrayFloat64ArrayDataViewget/setUint8(offset) get/setFloat32(offset)...BufferSource1023456789101112131415 \ No newline at end of file diff --git a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg index 657d0f6c32..b022796ad2 100644 --- a/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg +++ b/4-binary/01-arraybuffer-binary-arrays/arraybuffer-views.svg @@ -1 +1 @@ -100213234567891011121314154567012301new ArrayBuffer(16)Uint16ArrayUint8ArrayUint32ArrayFloat64Array \ No newline at end of file +100213234567891011121314154567012301new ArrayBuffer(16)Uint16ArrayUint8ArrayUint32ArrayFloat64Array \ No newline at end of file diff --git a/4-binary/03-blob/blob.svg b/4-binary/03-blob/blob.svg index 5416b087f3..8f42454516 100644 --- a/4-binary/03-blob/blob.svg +++ b/4-binary/03-blob/blob.svg @@ -1 +1 @@ -image/pngblob1blob2strbuffer...typeBlobblobParts+= \ No newline at end of file +image/pngblob1blob2strbuffer...typeBlobblobParts+= \ No newline at end of file diff --git a/5-network/01-fetch/logo-fetch.svg b/5-network/01-fetch/logo-fetch.svg index 4a38150313..5a58b209b5 100644 --- a/5-network/01-fetch/logo-fetch.svg +++ b/5-network/01-fetch/logo-fetch.svg @@ -1,4 +1,4 @@ - + diff --git a/5-network/03-fetch-progress/logo-fetch.svg b/5-network/03-fetch-progress/logo-fetch.svg index 4a38150313..5a58b209b5 100644 --- a/5-network/03-fetch-progress/logo-fetch.svg +++ b/5-network/03-fetch-progress/logo-fetch.svg @@ -1,4 +1,4 @@ - + diff --git a/5-network/05-fetch-crossorigin/cors-gmail-messages.svg b/5-network/05-fetch-crossorigin/cors-gmail-messages.svg index 51b978ab8e..737aaddef1 100644 --- a/5-network/05-fetch-crossorigin/cors-gmail-messages.svg +++ b/5-network/05-fetch-crossorigin/cors-gmail-messages.svg @@ -1 +1 @@ -evil.comесть куки? ок!gmail.comGET /messagescookie: user=John{"messages": [...]} \ No newline at end of file +evil.comесть куки? ок!gmail.comGET /messagescookie: user=John{"messages": [...]} \ No newline at end of file diff --git a/5-network/05-fetch-crossorigin/xhr-another-domain.svg b/5-network/05-fetch-crossorigin/xhr-another-domain.svg index 0e43428e19..35e93a46aa 100644 --- a/5-network/05-fetch-crossorigin/xhr-another-domain.svg +++ b/5-network/05-fetch-crossorigin/xhr-another-domain.svg @@ -1 +1 @@ -JavaScriptБраузерСерверOrigin: https://javascript.infoHTTP-запросfetch()HTTP-ответAccess-Control-Allow-Origin: * (or https://javascript.info)если заголовок разрешает, то успехиначе ошибка \ No newline at end of file +JavaScriptБраузерСерверOrigin: https://javascript.infoHTTP-запросfetch()HTTP-ответAccess-Control-Allow-Origin: * (or https://javascript.info)если заголовок разрешает, то успехиначе ошибка \ No newline at end of file diff --git a/5-network/05-fetch-crossorigin/xhr-preflight.svg b/5-network/05-fetch-crossorigin/xhr-preflight.svg index f4683afb59..25d0b92840 100644 --- a/5-network/05-fetch-crossorigin/xhr-preflight.svg +++ b/5-network/05-fetch-crossorigin/xhr-preflight.svg @@ -1 +1 @@ -JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file +JavaScriptБраузерСерверfetch()OPTIONSOrigin Access-Control-Request-Method Access-Control-Request-Headers200 OKAccess-Control-Allow-OriginОсновной HTTP-ответиначе ошибкаесли разрешено, то успех,OriginОсновной HTTP-запроспредзапросесли разрешено1234 Access-Control-Allow-Origin Access-Control-Allow-Methods Access-Control-Allow-Headers Access-Control-Max-Age \ No newline at end of file diff --git a/5-network/06-fetch-api/logo-fetch.svg b/5-network/06-fetch-api/logo-fetch.svg index 4a38150313..5a58b209b5 100644 --- a/5-network/06-fetch-api/logo-fetch.svg +++ b/5-network/06-fetch-api/logo-fetch.svg @@ -1,4 +1,4 @@ - + diff --git a/5-network/07-url/url-object.svg b/5-network/07-url/url-object.svg index 2d50041af4..628ccc13be 100644 --- a/5-network/07-url/url-object.svg +++ b/5-network/07-url/url-object.svg @@ -1 +1 @@ -hreforiginhostprotocolhostnameportpathnamesearchhash \ No newline at end of file +hreforiginhostprotocolhostnameportpathnamesearchhash \ No newline at end of file diff --git a/5-network/10-long-polling/long-polling.svg b/5-network/10-long-polling/long-polling.svg index df48863fc2..da29d5f016 100644 --- a/5-network/10-long-polling/long-polling.svg +++ b/5-network/10-long-polling/long-polling.svg @@ -1 +1 @@ -БраузерСерверзапроссоединение виситсоединение разорвано конец запросаданныезапроссоединение виситзапросданныесоединение разорвано конец запроса \ No newline at end of file +БраузерСерверзапроссоединение виситсоединение разорвано конец запросаданныезапроссоединение виситзапросданныесоединение разорвано конец запроса \ No newline at end of file diff --git a/5-network/11-websocket/websocket-handshake.svg b/5-network/11-websocket/websocket-handshake.svg index 17c3ef3b1f..d3013be159 100644 --- a/5-network/11-websocket/websocket-handshake.svg +++ b/5-network/11-websocket/websocket-handshake.svg @@ -1 +1 @@ -БраузерСерверHTTP-запрос"Сервер, давай поговорим на WebSocket?"HTTP-ответ Давай!Протокол WebSocket \ No newline at end of file +БраузерСерверHTTP-запрос"Сервер, давай поговорим на WebSocket?"HTTP-ответ Давай!Протокол WebSocket \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-third-party-2.svg b/6-data-storage/01-cookie/cookie-third-party-2.svg index 16de333a95..8912e4a68f 100644 --- a/6-data-storage/01-cookie/cookie-third-party-2.svg +++ b/6-data-storage/01-cookie/cookie-third-party-2.svg @@ -1 +1 @@ -<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file +<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-third-party-3.svg b/6-data-storage/01-cookie/cookie-third-party-3.svg index 4bc2d1b65b..ab38ea27fc 100644 --- a/6-data-storage/01-cookie/cookie-third-party-3.svg +++ b/6-data-storage/01-cookie/cookie-third-party-3.svg @@ -1 +1 @@ -<img src="https://ads.com/banner.png">other.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file +<img src="https://ads.com/banner.png">other.comads.comGET /banner.pngcookie: id=123 \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-third-party.svg b/6-data-storage/01-cookie/cookie-third-party.svg index 65fdd2321a..21c7cf94d0 100644 --- a/6-data-storage/01-cookie/cookie-third-party.svg +++ b/6-data-storage/01-cookie/cookie-third-party.svg @@ -1 +1 @@ -<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngSet-Cookie: id=123 \ No newline at end of file +<img src="https://ads.com/banner.png">site.comads.comGET /banner.pngSet-Cookie: id=123 \ No newline at end of file diff --git a/6-data-storage/01-cookie/cookie-xsrf.svg b/6-data-storage/01-cookie/cookie-xsrf.svg index cb365f0c01..fa8cf1c95d 100644 --- a/6-data-storage/01-cookie/cookie-xsrf.svg +++ b/6-data-storage/01-cookie/cookie-xsrf.svg @@ -1 +1 @@ -<form action="https://bank.com/pay"> .... </form>evil.comесть куки? отлично!bank.comPOST /paycookie: user=John \ No newline at end of file +<form action="https://bank.com/pay"> .... </form>evil.comесть куки? отлично!bank.comPOST /paycookie: user=John \ No newline at end of file diff --git a/6-data-storage/03-indexeddb/indexeddb-cursor.svg b/6-data-storage/03-indexeddb/indexeddb-cursor.svg index 25f234ce0f..c41ac75d91 100644 --- a/6-data-storage/03-indexeddb/indexeddb-cursor.svg +++ b/6-data-storage/03-indexeddb/indexeddb-cursor.svg @@ -1,5 +1,5 @@ - + indexeddb-cursor.svg Created with sketchtool. diff --git a/6-data-storage/03-indexeddb/indexeddb-index.svg b/6-data-storage/03-indexeddb/indexeddb-index.svg index cfb8e92bfc..b7f34cadd3 100644 --- a/6-data-storage/03-indexeddb/indexeddb-index.svg +++ b/6-data-storage/03-indexeddb/indexeddb-index.svg @@ -1 +1 @@ -id: 'html' price: 3id: 'css' price: 53: ['html'] 5: ['css'] 10: ['js','nodejs']id: 'js' price: 10id: 'nodejs' price: 10booksindex \ No newline at end of file +id: 'html' price: 3id: 'css' price: 53: ['html'] 5: ['css'] 10: ['js','nodejs']id: 'js' price: 10id: 'nodejs' price: 10booksindex \ No newline at end of file diff --git a/6-data-storage/03-indexeddb/indexeddb-structure.svg b/6-data-storage/03-indexeddb/indexeddb-structure.svg index 091533d423..a13e16918d 100644 --- a/6-data-storage/03-indexeddb/indexeddb-structure.svg +++ b/6-data-storage/03-indexeddb/indexeddb-structure.svg @@ -1 +1 @@ -key1: value1DatabaseobjectStoreobjectStorekey3: value3key2: value2key4: value4key5: value5objectStorekey1: value1key3: value3key2: value2key4: value4key5: value5key1: value1key3: value3key2: value2key4: value4key5: value5 \ No newline at end of file +key1: value1DatabaseobjectStoreobjectStorekey3: value3key2: value2key4: value4key5: value5objectStorekey1: value1key3: value3key2: value2key4: value4key5: value5key1: value1key3: value3key2: value2key4: value4key5: value5 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier-car.svg b/7-animation/1-bezier-curve/bezier-car.svg index a76d8a2daa..9f3f31f27d 100644 --- a/7-animation/1-bezier-curve/bezier-car.svg +++ b/7-animation/1-bezier-curve/bezier-car.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier-letter.svg b/7-animation/1-bezier-curve/bezier-letter.svg index aee4b23f98..d384cc7acf 100644 --- a/7-animation/1-bezier-curve/bezier-letter.svg +++ b/7-animation/1-bezier-curve/bezier-letter.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier-vase.svg b/7-animation/1-bezier-curve/bezier-vase.svg index 47fd63ce9b..ccc09690a9 100644 --- a/7-animation/1-bezier-curve/bezier-vase.svg +++ b/7-animation/1-bezier-curve/bezier-vase.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier2.svg b/7-animation/1-bezier-curve/bezier2.svg index d3bed1d15d..b8dfe8f26d 100644 --- a/7-animation/1-bezier-curve/bezier2.svg +++ b/7-animation/1-bezier-curve/bezier2.svg @@ -1 +1 @@ -12 \ No newline at end of file +12 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-draw1.svg b/7-animation/1-bezier-curve/bezier3-draw1.svg index 6415633c58..fd3ca092fd 100644 --- a/7-animation/1-bezier-curve/bezier3-draw1.svg +++ b/7-animation/1-bezier-curve/bezier3-draw1.svg @@ -1 +1 @@ -1320.25t = 0.250.25 \ No newline at end of file +1320.25t = 0.250.25 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-draw2.svg b/7-animation/1-bezier-curve/bezier3-draw2.svg index baff934bdf..4afe044541 100644 --- a/7-animation/1-bezier-curve/bezier3-draw2.svg +++ b/7-animation/1-bezier-curve/bezier3-draw2.svg @@ -1 +1 @@ -1320.5t = 0.50.5 \ No newline at end of file +1320.5t = 0.50.5 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3-e.svg b/7-animation/1-bezier-curve/bezier3-e.svg index cc11700b20..a892258c4a 100644 --- a/7-animation/1-bezier-curve/bezier3-e.svg +++ b/7-animation/1-bezier-curve/bezier3-e.svg @@ -1 +1 @@ -132 \ No newline at end of file +132 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier3.svg b/7-animation/1-bezier-curve/bezier3.svg index e34fb54df0..ff95f88777 100644 --- a/7-animation/1-bezier-curve/bezier3.svg +++ b/7-animation/1-bezier-curve/bezier3.svg @@ -1 +1 @@ -132 \ No newline at end of file +132 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier4-e.svg b/7-animation/1-bezier-curve/bezier4-e.svg index a0a760d8b3..2e2bed1bac 100644 --- a/7-animation/1-bezier-curve/bezier4-e.svg +++ b/7-animation/1-bezier-curve/bezier4-e.svg @@ -1 +1 @@ -1234 \ No newline at end of file +1234 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/bezier4.svg b/7-animation/1-bezier-curve/bezier4.svg index 0baed69c0a..551184d1b9 100644 --- a/7-animation/1-bezier-curve/bezier4.svg +++ b/7-animation/1-bezier-curve/bezier4.svg @@ -1 +1 @@ -1234 \ No newline at end of file +1234 \ No newline at end of file diff --git a/7-animation/1-bezier-curve/demo.svg b/7-animation/1-bezier-curve/demo.svg index 251324a2fa..5240697ee5 100644 --- a/7-animation/1-bezier-curve/demo.svg +++ b/7-animation/1-bezier-curve/demo.svg @@ -1,6 +1,6 @@ - + - - - - - - - - - - - - - - - - - - - - - -1 - - - - - - -t:1 - - - - - - + 1 t:1 diff --git a/99-archive/122-minification/my.svg b/99-archive/122-minification/my.svg index f52c37c40d..b8d93362fb 100755 --- a/99-archive/122-minification/my.svg +++ b/99-archive/122-minification/my.svg @@ -1 +1 @@ -ASTnode0BLOCKnode1SCRIPTnode0->node1node0->node1UNCONDRETURNRETURNnode0->RETURNSYN_BLOCKnode2FUNCTIONфункцияnode1->node2node1->RETURNUNCONDnode3NAMEимяnode2->node3node4PARAM_LISTсписок параметровnode2->node4node6BLOCKтело функцииnode2->node6UNCONDnode2->node6node5NAMEимяnode4->node5node7EXPR_RESULTвыражениеnode6->node7UNCONDnode6->node7node8ASSIGNприсвоитьnode7->node8node7->RETURNUNCONDnode9GETPROPполучить свойствоnode8->node9node12FUNCTIONфункцияnode8->node12node10THISnode9->node10node11STRINGстрока-константаnode9->node11node13NAMEnode12->node13node14PARAM_LISTnode12->node14node15BLOCKnode12->node15node16EXPR_RESULTnode15->node16node17CALLвызов функцииnode16->node17node18NAMEимя(функции)node17->node18node19NAMEимя(параметр)node17->node19 +ASTnode0BLOCKnode1SCRIPTnode0->node1node0->node1UNCONDRETURNRETURNnode0->RETURNSYN_BLOCKnode2FUNCTIONфункцияnode1->node2node1->RETURNUNCONDnode3NAMEимяnode2->node3node4PARAM_LISTсписок параметровnode2->node4node6BLOCKтело функцииnode2->node6UNCONDnode2->node6node5NAMEимяnode4->node5node7EXPR_RESULTвыражениеnode6->node7UNCONDnode6->node7node8ASSIGNприсвоитьnode7->node8node7->RETURNUNCONDnode9GETPROPполучить свойствоnode8->node9node12FUNCTIONфункцияnode8->node12node10THISnode9->node10node11STRINGстрока-константаnode9->node11node13NAMEnode12->node13node14PARAM_LISTnode12->node14node15BLOCKnode12->node15node16EXPR_RESULTnode15->node16node17CALLвызов функцииnode16->node17node18NAMEимя(функции)node17->node18node19NAMEимя(параметр)node17->node19 diff --git a/README.md b/README.md index 8843571328..223a97ac85 100755 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Недавно он был почти полностью переписан, основываясь на английской редакции, если что не так - пожалуйста, пришлите исправляющий Pull Request 👏 -**Нужна помощь с [разделом по CSS](https://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** +**Нужна помощь с [разделом по CSS](http://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** # Структура From 63c09afbcddde6fb679ff823f38820f3a109267d Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 12:30:23 +0600 Subject: [PATCH 0349/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index a3d703111e..5fb04d9411 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -757,7 +757,7 @@ alert(soldiers[1].age); // 23 - [arr.copyWithin(target, start, end)](mdn:js/Array/copyWithin) -- копирует свои элементы, начиная со `start` и заканчивая `end`, в *собственную* позицию `target` (перезаписывает существующие). -- [arr.flat(depth)](mdn:js/Array/flat)/[arr.flatMap(fn)](mdn:js/Array/flatMap) создайте новый плоский массив из многомерного массива. +- [arr.flat(depth)](mdn:js/Array/flat)/[arr.flatMap(fn)](mdn:js/Array/flatMap) создаёт новый плоский массив из многомерного массива. Полный список есть в [справочнике MDN](mdn:js/Array). From 33afcf17d160e6379eb9401d64a40c8152bcd199 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 12:36:00 +0600 Subject: [PATCH 0350/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 223a97ac85..8843571328 100755 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Недавно он был почти полностью переписан, основываясь на английской редакции, если что не так - пожалуйста, пришлите исправляющий Pull Request 👏 -**Нужна помощь с [разделом по CSS](http://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** +**Нужна помощь с [разделом по CSS](https://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** # Структура From 2f86612c6bc590813fd9e070c0f3b3a3e999476f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 12:39:17 +0600 Subject: [PATCH 0351/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/01-getting-started/1-intro/article.md | 6 +++--- 1-js/01-getting-started/2-manuals-specifications/article.md | 2 +- 1-js/01-getting-started/3-code-editors/article.md | 4 ++-- 1-js/02-first-steps/04-variables/article.md | 2 +- 1-js/02-first-steps/15-function-basics/article.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/1-js/01-getting-started/1-intro/article.md b/1-js/01-getting-started/1-intro/article.md index 809783d990..f920dce2c1 100644 --- a/1-js/01-getting-started/1-intro/article.md +++ b/1-js/01-getting-started/1-intro/article.md @@ -15,7 +15,7 @@ ```smart header="Почему JavaScript?" Когда JavaScript создавался, у него было другое имя - "LiveScript". Однако, язык Java был очень популярен в то время, и было решено, что позиционирование JavaScript как "младшего брата" Java будет полезно. -Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся [ECMAScript](http://ru.wikipedia.org/wiki/ECMAScript), и сейчас не имеет никакого отношения к Java. +Со временем JavaScript стал полностью независимым языком со своей собственной спецификацией, называющейся [ECMAScript](https://ru.wikipedia.org/wiki/ECMAScript), и сейчас не имеет никакого отношения к Java. ``` Сегодня JavaScript может выполняться не только в браузере, но и на сервере или на любом другом устройстве, которое имеет специальную программу, называющуюся ["движком" JavaScript](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_JavaScript). @@ -107,8 +107,8 @@ JavaScript - это единственная браузерная техноло Примеры таких языков: - [CoffeeScript](http://coffeescript.org/) добавляет "синтаксический сахар" для JavaScript. Он вводит более короткий синтаксис, который позволяет писать чистый и лаконичный код. Обычно такое нравится Ruby-программистам. -- [TypeScript](http://www.typescriptlang.org/) концентрируется на добавлении "строгой типизации" для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft. -- [Flow](http://flow.org/) тоже добавляет типизацию, но иначе. Разработан Facebook. +- [TypeScript](https://www.typescriptlang.org/) концентрируется на добавлении "строгой типизации" для упрощения разработки и поддержки больших и сложных систем. Разработан Microsoft. +- [Flow](https://flow.org/) тоже добавляет типизацию, но иначе. Разработан Facebook. - [Dart](https://www.dartlang.org/) стоит особняком, потому что имеет собственный движок, работающий вне браузера (например, в мобильных приложениях). Первоначально был предложен Google, как замена JavaScript, но на данный момент необходима его транспиляция для запуска так же, как для вышеперечисленных языков. - [Brython](https://brython.info/) транспилирует Python в JavaScript, что позволяет писать приложения на чистом Python без JavaScript. diff --git a/1-js/01-getting-started/2-manuals-specifications/article.md b/1-js/01-getting-started/2-manuals-specifications/article.md index bc00e6fa23..64ed54756b 100644 --- a/1-js/01-getting-started/2-manuals-specifications/article.md +++ b/1-js/01-getting-started/2-manuals-specifications/article.md @@ -24,7 +24,7 @@ Хотя зачастую вместо их сайта удобнее использовать какой-нибудь интернет-поисковик, вводя там запрос "MDN [что вы хотите найти]", например для поиска информации о функции `parseInt`. -- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . +- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . Так же, как и в предыдущем случае, можно использовать интернет-поиск, набирая фразы типа "RegExp MSDN" или "RegExp MSDN jscript". diff --git a/1-js/01-getting-started/3-code-editors/article.md b/1-js/01-getting-started/3-code-editors/article.md index a49042780b..748c0427c5 100644 --- a/1-js/01-getting-started/3-code-editors/article.md +++ b/1-js/01-getting-started/3-code-editors/article.md @@ -13,7 +13,7 @@ IDE загружает проект (который может состоять Если вы ещё не выбрали себе IDE, присмотритесь к этим: - [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенная, бесплатная). -- [WebStorm](http://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). +- [WebStorm](https://www.jetbrains.com/webstorm/) (кросс-платформенная, платная). Для Windows есть ещё Visual Studio (не путать с Visual Studio Code). Visual Studio - это платная мощная среда разработки, которая работает только на Windows. Она хорошо подходит для .NET платформы. У неё есть бесплатная версия, которая называется [Visual Studio Community](https://www.visualstudio.com/vs/community/). @@ -34,7 +34,7 @@ IDE загружает проект (который может состоять - [Atom](https://atom.io/) (кроссплатформенный, бесплатный). - [Sublime Text](http://www.sublimetext.com) (кроссплатформенный, условно-бесплатный). - [Notepad++](https://notepad-plus-plus.org/) (Windows, бесплатный). -- [Vim](http://www.vim.org/) и [Emacs](https://www.gnu.org/software/emacs/) тоже хороши, если знать, как ими пользоваться. +- [Vim](https://www.vim.org/) и [Emacs](https://www.gnu.org/software/emacs/) тоже хороши, если знать, как ими пользоваться. ## Не будем ссориться diff --git a/1-js/02-first-steps/04-variables/article.md b/1-js/02-first-steps/04-variables/article.md index 74c763dc83..3bb55e145c 100644 --- a/1-js/02-first-steps/04-variables/article.md +++ b/1-js/02-first-steps/04-variables/article.md @@ -151,7 +151,7 @@ let message = "Другое"; // SyntaxError: 'message' has already been declare ```` ```smart header="Функциональные языки программирования" -Примечательно, что существуют [функциональные](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) языки программирования, такие как [Scala](http://www.scala-lang.org/) или [Erlang](http://www.erlang.org/), которые запрещают изменять значение переменной. +Примечательно, что существуют [функциональные](https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) языки программирования, такие как [Scala](https://www.scala-lang.org/) или [Erlang](https://www.erlang.org/), которые запрещают изменять значение переменной. В таких языках однажды сохранённое "в коробку" значение остаётся там навсегда. Если нам нужно сохранить что-то другое, язык заставляет нас создать новую коробку (объявить новую переменную). Мы не можем использовать старую переменную. diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index e9b301c5f7..25c48b9277 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -408,7 +408,7 @@ checkPermission(..) // проверяет доступ, возвращая true/ ```smart header="Сверхкороткие имена функций" Имена функций, которые используются *очень часто*, иногда делают сверхкороткими. -Например, во фреймворке [jQuery](http://jquery.com) есть функция с именем `$`. В библиотеке [Lodash](http://lodash.com/) основная функция представлена именем `_`. +Например, во фреймворке [jQuery](https://jquery.com) есть функция с именем `$`. В библиотеке [Lodash](https://lodash.com/) основная функция представлена именем `_`. Это исключения. В основном имена функций должны быть в меру краткими и описательными. ``` From 2b60bafc0d059976dac2a40cff62d241ad208774 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 12:46:02 +0600 Subject: [PATCH 0352/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/03-code-quality/05-testing-mocha/article.md | 12 ++++++------ 1-js/03-code-quality/06-polyfills/article.md | 6 +++--- .../03-garbage-collection/article.md | 4 ++-- 1-js/05-data-types/02-number/article.md | 2 +- 1-js/05-data-types/03-string/article.md | 2 +- .../04-array/10-maximal-subarray/solution.md | 2 +- 1-js/05-data-types/11-date/article.md | 2 +- 1-js/05-data-types/12-json/article.md | 4 ++-- .../01-spy-decorator/task.md | 2 +- 1-js/06-advanced-functions/10-bind/article.md | 2 +- 1-js/13-modules/01-modules-intro/article.md | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/1-js/03-code-quality/05-testing-mocha/article.md b/1-js/03-code-quality/05-testing-mocha/article.md index 80023c71e6..9279fcd7b3 100644 --- a/1-js/03-code-quality/05-testing-mocha/article.md +++ b/1-js/03-code-quality/05-testing-mocha/article.md @@ -69,7 +69,7 @@ describe("pow", function() { 1. Пишется начальная спецификация с тестами, проверяющими основную функциональность. 2. Создаётся начальная реализация. -3. Для запуска тестов мы используем фреймворк [Mocha](http://mochajs.org/) (подробнее о нём чуть позже). Пока функция не готова, будут ошибки. Вносим изменения до тех пор, пока всё не начнёт работать так, как нам нужно. +3. Для запуска тестов мы используем фреймворк [Mocha](https://mochajs.org/) (подробнее о нём чуть позже). Пока функция не готова, будут ошибки. Вносим изменения до тех пор, пока всё не начнёт работать так, как нам нужно. 4. Теперь у нас есть правильно работающая начальная реализация и тесты. 5. Мы добавляем новые способы использования в спецификацию, возможно, ещё не реализованные в тестируемом коде. Тесты начинают "падать" (выдавать ошибки). 6. Возвращаемся на шаг 3, дописываем реализацию до тех пор, пока тесты не начнут завершаться без ошибок. @@ -85,9 +85,9 @@ describe("pow", function() { В этой главе мы будем пользоваться следующими JavaScript-библиотеками для тестов: -- [Mocha](http://mochajs.org/) -- основной фреймворк. Он предоставляет общие функции тестирования, такие как `describe` и `it`, а также функцию запуска тестов. -- [Chai](http://chaijs.com) -- библиотека, предоставляющая множество функций проверки утверждений. Пока мы будем использовать только `assert.equal`. -- [Sinon](http://sinonjs.org/) -- библиотека, позволяющая наблюдать за функциями, эмулировать встроенные функции и многое другое. Нам она пригодится позднее. +- [Mocha](https://mochajs.org/) -- основной фреймворк. Он предоставляет общие функции тестирования, такие как `describe` и `it`, а также функцию запуска тестов. +- [Chai](https://chaijs.com) -- библиотека, предоставляющая множество функций проверки утверждений. Пока мы будем использовать только `assert.equal`. +- [Sinon](https://sinonjs.org/) -- библиотека, позволяющая наблюдать за функциями, эмулировать встроенные функции и многое другое. Нам она пригодится позднее. Эти библиотеки подходят как для тестирования внутри браузера, так и на стороне сервера. Мы рассмотрим вариант с браузером. @@ -339,14 +339,14 @@ describe("pow", function() { ```smart header="Другие функции сравнения" Обратите внимание на `assert.isNaN`. Это проверка того, что переданное значение равно `NaN`. -Библиотека [Chai](http://chaijs.com) содержит множество других подобных функций, например: +Библиотека [Chai](https://chaijs.com) содержит множество других подобных функций, например: - `assert.equal(value1, value2)` -- проверяет равенство `value1 == value2`. - `assert.strictEqual(value1, value2)` -- проверяет строгое равенство `value1 === value2`. - `assert.notEqual`, `assert.notStrictEqual` -- проверяет неравенство и строгое неравенство соответственно. - `assert.isTrue(value)` -- проверяет, что `value === true` - `assert.isFalse(value)` -- проверяет, что `value === false` -- ...с полным списком можно ознакомиться в [документации](http://chaijs.com/api/assert/) +- ...с полным списком можно ознакомиться в [документации](https://chaijs.com/api/assert/) ``` Итак, нам нужно добавить пару строчек в функцию `pow`: diff --git a/1-js/03-code-quality/06-polyfills/article.md b/1-js/03-code-quality/06-polyfills/article.md index 9be2b3eb6b..60fac7be73 100644 --- a/1-js/03-code-quality/06-polyfills/article.md +++ b/1-js/03-code-quality/06-polyfills/article.md @@ -1,7 +1,7 @@ # Полифилы -JavaScript - динамично развивающийся язык программирования. Регулярно появляются предложения о добавлении в JS новых возможностей, они анализируются, и, если предложения одобряются, то описания новых возможностей языка переносятся в черновик , а затем публикуются в [спецификации](http://www.ecma-international.org/publications/standards/Ecma-262.htm). +JavaScript - динамично развивающийся язык программирования. Регулярно появляются предложения о добавлении в JS новых возможностей, они анализируются, и, если предложения одобряются, то описания новых возможностей языка переносятся в черновик , а затем публикуются в [спецификации](https://www.ecma-international.org/publications/standards/Ecma-262.htm). Разработчики JavaScript-движков сами решают, какие предложения реализовывать в первую очередь. Они могут заранее добавить в браузеры поддержку функций, которые всё ещё находятся в черновике, и отложить разработку функций, которые уже перенесены в спецификацию, потому что они менее интересны разработчикам или более сложные в реализации. @@ -19,7 +19,7 @@ JavaScript - динамично развивающийся язык програ На самом деле, есть две части Babel: -1. Во-первых, транспилер, который переписывает код. Разработчик запускает Babel на своём компьютере. Он переписывает код в старый стандарт. И после этого код отправляется на сайт. Современные сборщики проектов, такие как [webpack](http://webpack.github.io/) или [brunch](http://brunch.io/), предоставляют возможность запускать транспилер автоматически после каждого изменения кода, что позволяет экономить время. +1. Во-первых, транспилер, который переписывает код. Разработчик запускает Babel на своём компьютере. Он переписывает код в старый стандарт. И после этого код отправляется на сайт. Современные сборщики проектов, такие как [webpack](http://webpack.github.io/) или [brunch](https://brunch.io/), предоставляют возможность запускать транспилер автоматически после каждого изменения кода, что позволяет экономить время. 2. Во-вторых, полифил. @@ -29,7 +29,7 @@ JavaScript - динамично развивающийся язык програ Два интересных хранилища полифилов: - [core js](https://github.com/zloirock/core-js) поддерживает много функций, можно подключать только нужные. - - [polyfill.io](http://polyfill.io) - сервис, который автоматически создаёт скрипт с полифилом в зависимости от необходимых функций и браузера пользователя. + - [polyfill.io](https://polyfill.io) - сервис, который автоматически создаёт скрипт с полифилом в зависимости от необходимых функций и браузера пользователя. Таким образом, чтобы современные функции поддерживались в старых движках, нам надо установить транспилер и добавить полифил. diff --git a/1-js/04-object-basics/03-garbage-collection/article.md b/1-js/04-object-basics/03-garbage-collection/article.md index e6218c78f5..2cbe2515bf 100644 --- a/1-js/04-object-basics/03-garbage-collection/article.md +++ b/1-js/04-object-basics/03-garbage-collection/article.md @@ -205,8 +205,8 @@ family = null; О многих из них рассказано в прекрасной книге о сборке мусора "The Garbage Collection Handbook: The Art of Automatic Memory Management" (R. Jones и др.). -Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора V8 находится в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). +Если вы знакомы с низкоуровневым программированием, то более подробная информация о сборщике мусора V8 находится в статье [A tour of V8: Garbage Collection](https://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). -Также в [блоге V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам лучше подготовиться, узнав о том как устроен движок V8 внутри в целом и почитав блог [Вячеслава Егорова](http://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещается в статьях в Интернете. Для других движков многие подходы схожи, но сборка мусора отличается во многих аспектах. +Также в [блоге V8](https://v8.dev/) время от времени публикуются статьи об изменениях в управлении памятью. Разумеется, чтобы изучить сборку мусора, вам лучше подготовиться, узнав о том как устроен движок V8 внутри в целом и почитав блог [Вячеслава Егорова](https://mrale.ph), одного из инженеров, разрабатывавших V8. Я говорю про "V8", потому что он лучше всего освещается в статьях в Интернете. Для других движков многие подходы схожи, но сборка мусора отличается во многих аспектах. Глубокое понимание работы движков полезно, когда вам нужна низкоуровневая оптимизация. Было бы разумно запланировать их изучение как следующий шаг после того, как вы познакомитесь с языком. diff --git a/1-js/05-data-types/02-number/article.md b/1-js/05-data-types/02-number/article.md index 225792de5e..2d12392915 100644 --- a/1-js/05-data-types/02-number/article.md +++ b/1-js/05-data-types/02-number/article.md @@ -1,7 +1,7 @@ # Числа В современном JavaScript существует два типа чисел: -1. Обычные числа в JavaScript хранятся в 64-битном формате [IEEE-754](http://en.wikipedia.org/wiki/IEEE_754-1985), который также называют "числа с плавающей точкой двойной точности" (double precision floating point numbers). Это числа, которые мы будем использовать чаще всего. Мы поговорим о них в этой главе. +1. Обычные числа в JavaScript хранятся в 64-битном формате [IEEE-754](https://en.wikipedia.org/wiki/IEEE_754-1985), который также называют "числа с плавающей точкой двойной точности" (double precision floating point numbers). Это числа, которые мы будем использовать чаще всего. Мы поговорим о них в этой главе. 2. `BigInt` числа дают возможность работать с целыми числами произвольной длины. Они нужны достаточно редко и используются в случаях, когда необходимо работать со значениями более чем 253 или менее чем -253. Так как `BigInt` числа нужны достаточно редко, мы рассмотрим их в отдельной главе . В данной главе мы рассмотрим только первый тип чисел: числа типа `number`. Давайте глубже изучим, как с ними работать в JavaScript. diff --git a/1-js/05-data-types/03-string/article.md b/1-js/05-data-types/03-string/article.md index fa2bbf5387..99b12debfd 100644 --- a/1-js/05-data-types/03-string/article.md +++ b/1-js/05-data-types/03-string/article.md @@ -536,7 +536,7 @@ alert( str ); Поэтому браузеру нужно знать, какой язык использовать для сравнения. -К счастью, все современные браузеры (для IE10− нужна дополнительная библиотека [Intl.JS](https://github.com/andyearnshaw/Intl.js/)) поддерживают стандарт [ECMA 402](http://www.ecma-international.org/ecma-402/1.0/ECMA-402.pdf), обеспечивающий правильное сравнение строк на разных языках с учётом их правил. +К счастью, все современные браузеры (для IE10− нужна дополнительная библиотека [Intl.JS](https://github.com/andyearnshaw/Intl.js/)) поддерживают стандарт [ECMA 402](https://www.ecma-international.org/ecma-402/1.0/ECMA-402.pdf), обеспечивающий правильное сравнение строк на разных языках с учётом их правил. Для этого есть соответствующий метод. diff --git a/1-js/05-data-types/04-array/10-maximal-subarray/solution.md b/1-js/05-data-types/04-array/10-maximal-subarray/solution.md index 71b339c82a..3abf9e3a72 100644 --- a/1-js/05-data-types/04-array/10-maximal-subarray/solution.md +++ b/1-js/05-data-types/04-array/10-maximal-subarray/solution.md @@ -91,4 +91,4 @@ alert( getMaxSubSum([-1, -2, -3]) ); // 0 Этот алгоритм требует ровно 1 проход по массиву и его оценка сложности O(n). -Больше информации об алгоритме тут: [Задача поиска максимальной суммы подмассива](http://en.wikipedia.org/wiki/Maximum_subarray_problem). Если всё ещё не очевидно как это работает, просмотрите алгоритм в примерах выше, это будет лучше всяких слов. +Больше информации об алгоритме тут: [Задача поиска максимальной суммы подмассива](https://en.wikipedia.org/wiki/Maximum_subarray_problem). Если всё ещё не очевидно как это работает, просмотрите алгоритм в примерах выше, это будет лучше всяких слов. diff --git a/1-js/05-data-types/11-date/article.md b/1-js/05-data-types/11-date/article.md index 1e68c26944..a03c056025 100644 --- a/1-js/05-data-types/11-date/article.md +++ b/1-js/05-data-types/11-date/article.md @@ -376,7 +376,7 @@ for (let i = 0; i < 10; i++) { ```warn header="Будьте осторожны с микробенчмарками" Современные интерпретаторы JavaScript выполняют множество оптимизаций. Они могут повлиять на результаты "искусственных тестов" по сравнению с "нормальным использованием", особенно если мы тестируем что-то очень маленькое, например, работу оператора или встроенной функции. Поэтому если хотите серьёзно понять производительность, пожалуйста, изучите, как работают интерпретаторы JavaScript. И тогда вам, вероятно, уже не понадобятся микробенчмарки. -Отличный набор статей о V8 можно найти на . +Отличный набор статей о V8 можно найти на . ``` ## Разбор строки с датой diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index 314f058402..37300eab59 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -27,7 +27,7 @@ alert(user); // {name: "John", age: 30} ## JSON.stringify -[JSON](https://ru.wikipedia.org/wiki/JSON) (JavaScript Object Notation) - это общий формат для представления значений и объектов. Его описание задокументировано в стандарте [RFC 4627](http://tools.ietf.org/html/rfc4627). Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java или любом другом языке. +[JSON](https://ru.wikipedia.org/wiki/JSON) (JavaScript Object Notation) - это общий формат для представления значений и объектов. Его описание задокументировано в стандарте [RFC 4627](https://tools.ietf.org/html/rfc4627). Первоначально он был создан для JavaScript, но многие другие языки также имеют библиотеки, которые могут работать с ним. Таким образом, JSON легко использовать для обмена данными, когда клиент использует JavaScript, а сервер написан на Ruby/PHP/Java или любом другом языке. JavaScript предоставляет методы: @@ -447,7 +447,7 @@ let json = `{ Кроме того, JSON не поддерживает комментарии. Добавление комментария в JSON делает его недействительным. -Существует ещё один формат [JSON5](http://json5.org/), который поддерживает ключи без кавычек, комментарии и т.д. Но это самостоятельная библиотека, а не спецификация языка. +Существует ещё один формат [JSON5](https://json5.org/), который поддерживает ключи без кавычек, комментарии и т.д. Но это самостоятельная библиотека, а не спецификация языка. Обычный JSON настолько строг не потому, что его разработчики ленивы, а потому, что позволяет легко, надёжно и очень быстро реализовывать алгоритм кодирования и чтения. diff --git a/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md b/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md index 5fbba081e5..9256d08393 100644 --- a/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md +++ b/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/task.md @@ -27,4 +27,4 @@ for (let args of work.calls) { } ``` -P.S.: Этот декоратор иногда полезен для юнит-тестирования. Его расширенная форма - `sinon.spy` - содержится в библиотеке [Sinon.JS](http://sinonjs.org/). +P.S.: Этот декоратор иногда полезен для юнит-тестирования. Его расширенная форма - `sinon.spy` - содержится в библиотеке [Sinon.JS](https://sinonjs.org/). diff --git a/1-js/06-advanced-functions/10-bind/article.md b/1-js/06-advanced-functions/10-bind/article.md index 9b1c8d4731..1c597cdf12 100644 --- a/1-js/06-advanced-functions/10-bind/article.md +++ b/1-js/06-advanced-functions/10-bind/article.md @@ -191,7 +191,7 @@ for (let key in user) { } ``` -Некоторые JS-библиотеки предоставляют встроенные функции для удобной массовой привязки контекста, например [_.bindAll(obj)](http://lodash.com/docs#bindAll) в lodash. +Некоторые JS-библиотеки предоставляют встроенные функции для удобной массовой привязки контекста, например [_.bindAll(obj)](https://lodash.com/docs#bindAll) в lodash. ```` ## Частичное применение diff --git a/1-js/13-modules/01-modules-intro/article.md b/1-js/13-modules/01-modules-intro/article.md index 05fdb0ee00..944eff33c3 100644 --- a/1-js/13-modules/01-modules-intro/article.md +++ b/1-js/13-modules/01-modules-intro/article.md @@ -9,8 +9,8 @@ Например: -- [AMD](https://ru.wikipedia.org/wiki/Asynchronous_module_definition) -- одна из самых старых модульных систем, изначально реализована библиотекой [require.js](http://requirejs.org/). -- [CommonJS](http://wiki.commonjs.org/wiki/Modules/1.1) -- модульная система, созданная для сервера Node.js. +- [AMD](https://ru.wikipedia.org/wiki/Asynchronous_module_definition) -- одна из самых старых модульных систем, изначально реализована библиотекой [require.js](https://requirejs.org/). +- [CommonJS](https://wiki.commonjs.org/wiki/Modules/1.1) -- модульная система, созданная для сервера Node.js. - [UMD](https://github.com/umdjs/umd) -- ещё одна модульная система, предлагается как универсальная, совместима с AMD и CommonJS. Теперь все они постепенно становятся частью истории, хотя их и можно найти в старых скриптах. From c64d6e34b2a41477c888a8d564c01a756c13990f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 12:54:17 +0600 Subject: [PATCH 0353/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/99-js-misc/90-intl/1-collate-array-sort/task.md | 2 +- 1-js/99-js-misc/90-intl/article.md | 6 +++--- 2-ui/1-document/04-searching-elements-dom/article.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/99-js-misc/90-intl/1-collate-array-sort/task.md b/1-js/99-js-misc/90-intl/1-collate-array-sort/task.md index a0eb4a63b2..1259405529 100755 --- a/1-js/99-js-misc/90-intl/1-collate-array-sort/task.md +++ b/1-js/99-js-misc/90-intl/1-collate-array-sort/task.md @@ -16,4 +16,4 @@ alert( animals ); // АИСТ,ёж,енот,ехидна,тигр,ЯК В этом примере порядок сортировки не должен зависеть от регистра. -Что касается буквы `"ё"`, то мы следуем [обычным правилам сортировки буквы ё](http://ru.wikipedia.org/wiki/%D0%81#.D0.A1.D0.BE.D1.80.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0), по которым "е" и "ё" считаются одной и той же буквой, за исключением случая, когда два слова отличаются только в позиции буквы "е" / "ё" -- тогда слово с "е" ставится первым. +Что касается буквы `"ё"`, то мы следуем [обычным правилам сортировки буквы ё](https://ru.wikipedia.org/wiki/%D0%81#.D0.A1.D0.BE.D1.80.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0), по которым "е" и "ё" считаются одной и той же буквой, за исключением случая, когда два слова отличаются только в позиции буквы "е" / "ё" -- тогда слово с "е" ставится первым. diff --git a/1-js/99-js-misc/90-intl/article.md b/1-js/99-js-misc/90-intl/article.md index a7058accf6..a652cf61e1 100644 --- a/1-js/99-js-misc/90-intl/article.md +++ b/1-js/99-js-misc/90-intl/article.md @@ -13,7 +13,7 @@ Числа : В одних странах выводятся цифрами, в других -- иероглифами, длинные числа разделяются где-то пробелом, где-то запятой. -Все современные браузеры, кроме IE10 (но есть библиотеки и для него) поддерживают стандарт [ECMA 402](http://www.ecma-international.org/ecma-402/1.0/ECMA-402.pdf), предназначенный решить эти проблемы навсегда. +Все современные браузеры, кроме IE10 (но есть библиотеки и для него) поддерживают стандарт [ECMA 402](https://www.ecma-international.org/ecma-402/1.0/ECMA-402.pdf), предназначенный решить эти проблемы навсегда. ## Основные объекты @@ -244,7 +244,7 @@ let formatter = new Intl.DateTimeFormat([locales, [options]]) - month, day - hour, minute, second -Если указанный формат не поддерживается, то настройка `formatMatcher` задаёт алгоритм подбора наиболее близкого формата: `basic` -- по [стандартным правилам](http://www.ecma-international.org/ecma-402/1.0/#BasicFormatMatcher) и `best fit` -- по умолчанию, на усмотрение окружения (браузера). +Если указанный формат не поддерживается, то настройка `formatMatcher` задаёт алгоритм подбора наиболее близкого формата: `basic` -- по [стандартным правилам](https://www.ecma-international.org/ecma-402/1.0/#BasicFormatMatcher) и `best fit` -- по умолчанию, на усмотрение окружения (браузера). Использование: @@ -331,7 +331,7 @@ formatter.format(number); // форматирование currency Алфавитный код валюты - См. Список кодов валюты, например USD + См. Список кодов валюты, например USD diff --git a/2-ui/1-document/04-searching-elements-dom/article.md b/2-ui/1-document/04-searching-elements-dom/article.md index b40b22204b..0b6fb4920f 100644 --- a/2-ui/1-document/04-searching-elements-dom/article.md +++ b/2-ui/1-document/04-searching-elements-dom/article.md @@ -55,7 +55,7 @@ ``` ```warn header="Пожалуйста, не используйте такие глобальные переменные для доступа к элементам" -Это поведение соответствует [стандарту](http://www.whatwg.org/specs/web-apps/current-work/#dom-window-nameditem), но поддерживается в основном для совместимости, как осколок далёкого прошлого. +Это поведение соответствует [стандарту](https://html.spec.whatwg.org/#dom-window-nameditem), но поддерживается в основном для совместимости, как осколок далёкого прошлого. Браузер пытается помочь нам, смешивая пространства имён JS и DOM. Это удобно для простых скриптов, которые находятся прямо в HTML, но, вообще говоря, не очень хорошо. Возможны конфликты имён. Кроме того, при чтении JS-кода, не видя HTML, непонятно, откуда берётся переменная. From 9ba41942bc6e5d31035134d60c6764c02e90c836 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 13:20:20 +0600 Subject: [PATCH 0354/1128] =?UTF-8?q?=F0=9F=91=BE=20Smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/1-document/04-searching-elements-dom/article.md | 2 +- .../05-basic-dom-node-properties/article.md | 6 +++--- .../2-yellow-links/solution.view/index.html | 4 ++-- .../2-yellow-links/source.view/index.html | 4 ++-- 2-ui/2-events/02-bubbling-and-capturing/article.md | 2 +- 2-ui/2-events/05-dispatch-events/article.md | 2 +- 20-css-for-js/1-css-why/article.md | 6 +++--- .../11-margin/1-failing-margins/solution.md | 2 +- 20-css-for-js/11-margin/article.md | 2 +- 20-css-for-js/12-space-under-img/article.md | 2 +- 20-css-for-js/14-height-percent/article.md | 4 ++-- 20-css-for-js/17-css-sprite/article.md | 2 +- 20-css-for-js/18-css-format/article.md | 2 +- 20-css-for-js/2-css-units/article.md | 12 ++++++------ 20-css-for-js/3-display/article.md | 8 ++++---- 20-css-for-js/4-float/article.md | 4 ++-- 20-css-for-js/5-position/article.md | 10 +++++----- 20-css-for-js/6-css-center/article.md | 4 ++-- 18 files changed, 39 insertions(+), 39 deletions(-) diff --git a/2-ui/1-document/04-searching-elements-dom/article.md b/2-ui/1-document/04-searching-elements-dom/article.md index 0b6fb4920f..52a4f8a8a1 100644 --- a/2-ui/1-document/04-searching-elements-dom/article.md +++ b/2-ui/1-document/04-searching-elements-dom/article.md @@ -115,7 +115,7 @@ ## matches Предыдущие методы искали по DOM. -Метод [elem.matches(css)](http://dom.spec.whatwg.org/#dom-element-matches) ничего не ищет, а проверяет, удовлетворяет ли `elem` CSS-селектору, и возвращает `true` или `false`. +Метод [elem.matches(css)](https://dom.spec.whatwg.org/#dom-element-matches) ничего не ищет, а проверяет, удовлетворяет ли `elem` CSS-селектору, и возвращает `true` или `false`. Этот метод удобен, когда мы перебираем элементы (например, в массиве или в чём-то подобном) и пытаемся выбрать те из них, которые нас интересуют. diff --git a/2-ui/1-document/05-basic-dom-node-properties/article.md b/2-ui/1-document/05-basic-dom-node-properties/article.md index 24636d348e..e339e3a4ff 100644 --- a/2-ui/1-document/05-basic-dom-node-properties/article.md +++ b/2-ui/1-document/05-basic-dom-node-properties/article.md @@ -10,7 +10,7 @@ Каждый DOM-узел принадлежит соответствующему встроенному классу. -Корнем иерархии является [EventTarget](https://dom.spec.whatwg.org/#eventtarget), от него наследует [Node](http://dom.spec.whatwg.org/#interface-node) и остальные DOM-узлы. +Корнем иерархии является [EventTarget](https://dom.spec.whatwg.org/#eventtarget), от него наследует [Node](https://dom.spec.whatwg.org/#interface-node) и остальные DOM-узлы. На рисунке ниже изображены основные классы: @@ -19,8 +19,8 @@ Существуют следующие классы: - [EventTarget](https://dom.spec.whatwg.org/#eventtarget) -- это корневой "абстрактный" класс. Объекты этого класса никогда не создаются. Он служит основой, благодаря которой все DOM-узлы поддерживают так называемые "события", о которых мы поговорим позже. -- [Node](http://dom.spec.whatwg.org/#interface-node) -- также является "абстрактным" классом, и служит основой для DOM-узлов. Он обеспечивает базовую функциональность: `parentNode`, `nextSibling`, `childNodes` и т.д. (это геттеры). Объекты класса `Node` никогда не создаются. Но есть определённые классы узлов, которые наследуют от него: `Text` -- для текстовых узлов, `Element` -- для узлов-элементов и более экзотический `Comment` -- для узлов-комментариев. -- [Element](http://dom.spec.whatwg.org/#interface-element) -- это базовый класс для DOM-элементов. Он обеспечивает навигацию на уровне элементов: `nextElementSibling`, `children` и методы поиска: `getElementsByTagName`, `querySelector`. Браузер поддерживает не только HTML, но также XML и SVG. Класс Element служит базой для следующих классов: `SVGElement`, `XMLElement` и `HTMLElement`. +- [Node](https://dom.spec.whatwg.org/#interface-node) -- также является "абстрактным" классом, и служит основой для DOM-узлов. Он обеспечивает базовую функциональность: `parentNode`, `nextSibling`, `childNodes` и т.д. (это геттеры). Объекты класса `Node` никогда не создаются. Но есть определённые классы узлов, которые наследуют от него: `Text` -- для текстовых узлов, `Element` -- для узлов-элементов и более экзотический `Comment` -- для узлов-комментариев. +- [Element](https://dom.spec.whatwg.org/#interface-element) -- это базовый класс для DOM-элементов. Он обеспечивает навигацию на уровне элементов: `nextElementSibling`, `children` и методы поиска: `getElementsByTagName`, `querySelector`. Браузер поддерживает не только HTML, но также XML и SVG. Класс Element служит базой для следующих классов: `SVGElement`, `XMLElement` и `HTMLElement`. - [HTMLElement](https://html.spec.whatwg.org/multipage/dom.html#htmlelement) -- является базовым классом для всех остальных HTML-элементов. От него наследуют конкретные элементы: - [HTMLInputElement](https://html.spec.whatwg.org/multipage/forms.html#htmlinputelement) -- класс для тега ``, - [HTMLBodyElement](https://html.spec.whatwg.org/multipage/semantics.html#htmlbodyelement) -- класс для тега ``, diff --git a/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/solution.view/index.html b/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/solution.view/index.html index 4209a5f34d..f6f0dd0643 100644 --- a/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/solution.view/index.html +++ b/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/solution.view/index.html @@ -4,11 +4,11 @@ The list: diff --git a/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/source.view/index.html b/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/source.view/index.html index e120483238..5bbdc31765 100644 --- a/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/source.view/index.html +++ b/2-ui/1-document/06-dom-attributes-and-properties/2-yellow-links/source.view/index.html @@ -4,11 +4,11 @@ The list: diff --git a/2-ui/2-events/02-bubbling-and-capturing/article.md b/2-ui/2-events/02-bubbling-and-capturing/article.md index c4c87d2d3c..f4328b8409 100644 --- a/2-ui/2-events/02-bubbling-and-capturing/article.md +++ b/2-ui/2-events/02-bubbling-and-capturing/article.md @@ -120,7 +120,7 @@ Существует ещё одна фаза из жизненного цикла события -- "погружение" (иногда её называют "перехват"). Она очень редко используется в реальном коде, однако тоже может быть полезной. -Стандарт [DOM Events](http://www.w3.org/TR/DOM-Level-3-Events/) описывает 3 фазы прохода события: +Стандарт [DOM Events](https://www.w3.org/TR/DOM-Level-3-Events/) описывает 3 фазы прохода события: 1. Фаза погружения (capturing phase) -- событие сначала идёт сверху вниз. 2. Фаза цели (target phase) -- событие достигло целевого(исходного) элемента. diff --git a/2-ui/2-events/05-dispatch-events/article.md b/2-ui/2-events/05-dispatch-events/article.md index 9dae0573c7..97cc8f3f68 100644 --- a/2-ui/2-events/05-dispatch-events/article.md +++ b/2-ui/2-events/05-dispatch-events/article.md @@ -8,7 +8,7 @@ ## Конструктор Event -Встроенные классы для событий формируют иерархию аналогично классам для DOM-элементов. Её корнем является встроенный класс [Event](http://www.w3.org/TR/dom/#event). +Встроенные классы для событий формируют иерархию аналогично классам для DOM-элементов. Её корнем является встроенный класс [Event](https://dom.spec.whatwg.org/#event). Событие встроенного класса `Event` можно создать так: diff --git a/20-css-for-js/1-css-why/article.md b/20-css-for-js/1-css-why/article.md index 9f1cf50cb5..9dee35e4c7 100644 --- a/20-css-for-js/1-css-why/article.md +++ b/20-css-for-js/1-css-why/article.md @@ -43,7 +43,7 @@ - Приоритет селекторов - Селекторы `#id`, `.class`, `a > b` -- Сброс браузерных стилей, reset.css +- Сброс браузерных стилей, reset.css ## Почитать @@ -51,9 +51,9 @@ С уверенностью могу рекомендовать следующие: -- Большая книга CSS3. +- Большая книга CSS3. Дэвид Макфарланд. -- CSS. Каскадные таблицы стилей. Подробное руководство. +- CSS. Каскадные таблицы стилей. Подробное руководство. Эрик Мейер - Отладка CSS Ахмад Шадид diff --git a/20-css-for-js/11-margin/1-failing-margins/solution.md b/20-css-for-js/11-margin/1-failing-margins/solution.md index 6a34d31e59..34b4d72db3 100755 --- a/20-css-for-js/11-margin/1-failing-margins/solution.md +++ b/20-css-for-js/11-margin/1-failing-margins/solution.md @@ -1,4 +1,4 @@ -Ошибка заключается в том, что `margin` при задании в процентах высчитывается *относительно ширины*. Так написано [в стандарте](http://www.w3.org/TR/CSS2/box.html#margin-properties). +Ошибка заключается в том, что `margin` при задании в процентах высчитывается *относительно ширины*. Так написано [в стандарте](https://www.w3.org/TR/CSS2/box.html#margin-properties). При этом не важно, какой отступ: левый, правый. верхний или нижний. Все они в процентах отсчитываются от ширины. Из-за этого и ошибка. diff --git a/20-css-for-js/11-margin/article.md b/20-css-for-js/11-margin/article.md index 1a1d0eddc0..1ad4d82bb8 100755 --- a/20-css-for-js/11-margin/article.md +++ b/20-css-for-js/11-margin/article.md @@ -166,5 +166,5 @@ hr.position { position: relative; left: -2em; } - Отрицательные `margin-left/top` сдвигают элемент влево-вверх. Остальные элементы это учитывают, в отличие от сдвига через `position`. - Отрицательные `margin-right/bottom` заставляют другие элементы думать, что блок меньше по размеру справа-внизу, чем он на самом деле. -Отличная статья на тему отрицательных `margin`: [The Definitive Guide to Using Negative Margins](http://coding.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins/) +Отличная статья на тему отрицательных `margin`: [The Definitive Guide to Using Negative Margins](https://coding.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins/) diff --git a/20-css-for-js/12-space-under-img/article.md b/20-css-for-js/12-space-under-img/article.md index 6260159e69..bdde97f671 100755 --- a/20-css-for-js/12-space-under-img/article.md +++ b/20-css-for-js/12-space-under-img/article.md @@ -65,7 +65,7 @@ А что, если мы, по каким-то причинам, *не хотим* делать элемент блочным? -Существует ещё один способ избежать проблемы -- использовать свойство [vertical-align](http://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align). +Существует ещё один способ избежать проблемы -- использовать свойство [vertical-align](https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align). **Если установить `vertical-align` в `top`, то инлайн-элемент будет отпозиционирован по верхней границе текущей строки.** diff --git a/20-css-for-js/14-height-percent/article.md b/20-css-for-js/14-height-percent/article.md index 06d1a04a98..ce9656bfb6 100755 --- a/20-css-for-js/14-height-percent/article.md +++ b/20-css-for-js/14-height-percent/article.md @@ -69,13 +69,13 @@ CSS: Как видно, блок со стрелкой вообще исчез! Куда же он подевался? -Ответ нам даст спецификация CSS 2.1 [пункт 10.5](http://www.w3.org/TR/CSS2/visudet.html#propdef-height). +Ответ нам даст спецификация CSS 2.1 [пункт 10.5](https://www.w3.org/TR/CSS2/visudet.html#propdef-height). **"Если высота внешнего блока вычисляется по содержимому, то высота в % не работает, и заменяется на `height:auto`. Кроме случая, когда у элемента стоит `position:absolute`."** В нашем случае высота `.container` как раз определяется по содержимому, поэтому для `.toggler` проценты не действуют, а размер вычисляется как при `height:auto`. -Какая же она -- эта автоматическая высота? Вспоминаем, что обычно размеры `float` определяются по содержимому ([10.3.5](http://www.w3.org/TR/CSS2/visudet.html#float-width)). А содержимого-то в `.toggler` нет, так что высота нулевая. Поэтому этот блок и не виден. +Какая же она -- эта автоматическая высота? Вспоминаем, что обычно размеры `float` определяются по содержимому ([10.3.5](https://www.w3.org/TR/CSS2/visudet.html#float-width)). А содержимого-то в `.toggler` нет, так что высота нулевая. Поэтому этот блок и не виден. Если бы мы точно знали высоту внешнего блока и добавили её в CSS -- это решило бы проблему. diff --git a/20-css-for-js/17-css-sprite/article.md b/20-css-for-js/17-css-sprite/article.md index ed5832f238..5723dabe00 100755 --- a/20-css-for-js/17-css-sprite/article.md +++ b/20-css-for-js/17-css-sprite/article.md @@ -198,4 +198,4 @@ background-position: -90px -40px; Далее мы встретимся со спрайтами при создании интерфейсов, чтобы кнопка при наведении меняла своё изображение. Один спрайт будет содержать все состояния кнопки, а переключение внешнего вида -- осуществляться при помощи сдвига `background-position`. -Для автоматизированной сборки спрайтов используются специальные инструменты, например SmartSprites. +Для автоматизированной сборки спрайтов используются специальные инструменты, например [SmartSprites](http://csssprites.org/). diff --git a/20-css-for-js/18-css-format/article.md b/20-css-for-js/18-css-format/article.md index 94aa1bb656..58b6b0dbc5 100755 --- a/20-css-for-js/18-css-format/article.md +++ b/20-css-for-js/18-css-format/article.md @@ -133,7 +133,7 @@ box-shadow:0 0 100px 20px #000; } ``` -CSS-препроцессоры, такие как [SASS](http://sass-lang.com/), [LESS](http://lesscss.org/), [Stylus](http://learnboost.github.com/stylus/), [Autoprefixer](https://github.com/postcss/autoprefixer) делают написание CSS сильно удобнее. +CSS-препроцессоры, такие как [SASS](https://sass-lang.com/), [LESS](https://lesscss.org/), [Stylus](https://learnboost.github.com/stylus/), [Autoprefixer](https://github.com/postcss/autoprefixer) делают написание CSS сильно удобнее. Выберите один из них и используйте. Единственно, они добавляют дополнительную предобработку CSS, которую нужно учесть, и желательно, на сервере. diff --git a/20-css-for-js/2-css-units/article.md b/20-css-for-js/2-css-units/article.md index 7cf67f96b1..ac4f921ddf 100644 --- a/20-css-for-js/2-css-units/article.md +++ b/20-css-for-js/2-css-units/article.md @@ -6,7 +6,7 @@ Пиксель `px` -- это самая базовая, абсолютная и окончательная единица измерения. -Количество пикселей задаётся в настройках [разрешения экрана](http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0)), один `px` -- это как раз один такой пиксель на экране. Все значения браузер в итоге пересчитает в пиксели. +Количество пикселей задаётся в настройках [разрешения экрана](https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0)), один `px` -- это как раз один такой пиксель на экране. Все значения браузер в итоге пересчитает в пиксели. Пиксели могут быть дробными, например размер можно задать в `16.5px`. Это совершенно нормально, браузер сам использует дробные пиксели для внутренних вычислений. К примеру, есть элемент шириной в `100px`, его нужно разделить на три части -- волей-неволей появляются `33.333...px`. При окончательном отображении дробные пиксели, конечно же, округляются и становятся целыми. @@ -31,9 +31,9 @@ ``` ```smart header="Почему в сантиметре `cm` содержится ровно 38 пикселей?" -В реальной жизни сантиметр -- это эталон длины, одна сотая метра. А [пиксель](http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%BA%D1%81%D0%B5%D0%BB%D1%8C) может быть разным, в зависимости от экрана. +В реальной жизни сантиметр -- это эталон длины, одна сотая метра. А [пиксель](https://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%BA%D1%81%D0%B5%D0%BB%D1%8C) может быть разным, в зависимости от экрана. -Но в формулах выше под пикселем понимается "сферический пиксель в вакууме", точка на "стандартизованном экране", характеристики которого описаны в [спецификации](http://www.w3.org/TR/CSS2/syndata.html#length-units). +Но в формулах выше под пикселем понимается "сферический пиксель в вакууме", точка на "стандартизованном экране", характеристики которого описаны в [спецификации](https://www.w3.org/TR/CSS2/syndata.html#length-units). Поэтому ни о каком соответствии `cm` реальному сантиметру здесь нет и речи. Это полностью синтетическая и производная единица измерения, которая не нужна. ``` @@ -79,7 +79,7 @@ ``` ```smart header="Единицы `ex` и `ch`" -В спецификации указаны также единицы [ex](http://www.w3.org/TR/css3-values/#ex-unit) и [ch](http://www.w3.org/TR/css3-values/#ch-unit), которые означают размер символа `"x"` и размер символа `"0"`. +В спецификации указаны также единицы [ex](https://www.w3.org/TR/css3-values/#ex-unit) и [ch](https://www.w3.org/TR/css3-values/#ch-unit), которые означают размер символа `"x"` и размер символа `"0"`. Эти размеры присутствуют в шрифте всегда, даже если по коду этих символов в шрифте находятся другие значения, а не именно буква `"x"` и ноль `"0"`. В этом случае они носят более условный характер. @@ -96,7 +96,7 @@ Это очень важная особенность процентов, про которую, увы, часто забывают. -Отличный источник информации по этой теме -- стандарт, [Visual formatting model details](http://www.w3.org/TR/CSS2/visudet.html). +Отличный источник информации по этой теме -- стандарт, [Visual formatting model details](https://www.w3.org/TR/CSS2/visudet.html). Вот пример с `%`, он выглядит в точности так же, как с `em`: @@ -275,7 +275,7 @@ up.onclick = function() { ## Относительно экрана: vw, vh, vmin, vmax -Во всех современных браузерах, исключая IE8-, поддерживаются новые единицы из черновика стандарта [CSS Values and Units 3](http://dev.w3.org/csswg/css3-values/): +Во всех современных браузерах, исключая IE8-, поддерживаются новые единицы из черновика стандарта [CSS Values and Units 3](https://drafts.csswg.org/css-values-3/): - `vw` -- 1% ширины окна - `vh` -- 1% высоты окна diff --git a/20-css-for-js/3-display/article.md b/20-css-for-js/3-display/article.md index 0e1ab7f27e..49c3f8de52 100644 --- a/20-css-for-js/3-display/article.md +++ b/20-css-for-js/3-display/article.md @@ -167,7 +167,7 @@ li { ``` -Важно то, что это действительно полноценная таблица. Используются табличные алгоритмы вычисления ширины и высоты элемента, [описанные в стандарте](http://www.w3.org/TR/CSS2/tables.html#width-layout). +Важно то, что это действительно полноценная таблица. Используются табличные алгоритмы вычисления ширины и высоты элемента, [описанные в стандарте](https://www.w3.org/TR/CSS2/tables.html#width-layout). **Это хорошо для семантической вёрстки и позволяет избавиться от лишних тегов.** @@ -185,11 +185,11 @@ td, th { display: table-cell } caption { display: table-caption } ``` -Очень подробно об алгоритмах вычисления размеров и отображении таблиц рассказывает стандарт [CSS 2.1 - Tables](http://www.w3.org/TR/CSS2/tables.html). +Очень подробно об алгоритмах вычисления размеров и отображении таблиц рассказывает стандарт [CSS 2.1 - Tables](https://www.w3.org/TR/CSS2/tables.html). ### Вертикальное центрирование с table-cell -Внутри ячеек свойство [vertical-align](http://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align) выравнивает содержимое по вертикали. +Внутри ячеек свойство [vertical-align](https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align) выравнивает содержимое по вертикали. Это можно использовать для центрирования: @@ -242,5 +242,5 @@ CSS не требует, чтобы вокруг `table-cell` была стру `flex-box` -: Flexbox позволяет удобно управлять дочерними и родительскими элементами на странице, располагая их в необходимом порядке. Официальная спецификация находится здесь: CSS Flexible Box Layout Module +: Flexbox позволяет удобно управлять дочерними и родительскими элементами на странице, располагая их в необходимом порядке. Официальная спецификация находится здесь: CSS Flexible Box Layout Module diff --git a/20-css-for-js/4-float/article.md b/20-css-for-js/4-float/article.md index f121b7a9ba..89507afc6e 100644 --- a/20-css-for-js/4-float/article.md +++ b/20-css-for-js/4-float/article.md @@ -25,9 +25,9 @@ float: left | right | none | inherit; То есть, указав элементу, у которого `display:inline` свойство `float: left/right`, мы автоматически сделаем его блочным. В частности, для него будут работать `width/height`. - Исключением являются некоторые редкие `display` наподобие `inline-table` и `run-in` (см. [Relationships between 'display', 'position', and 'float'](http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)) + Исключением являются некоторые редкие `display` наподобие `inline-table` и `run-in` (см. [Relationships between 'display', 'position', and 'float'](https://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)) -2. Ширина `float`-блока определяется по содержимому. (["CSS 2.1, 10.3.5"](http://www.w3.org/TR/CSS2/visudet.html#float-width)). +2. Ширина `float`-блока определяется по содержимому. (["CSS 2.1, 10.3.5"](https://www.w3.org/TR/CSS2/visudet.html#float-width)). 3. Вертикальные отступы `margin` элементов с `float` не сливаются с отступами соседей, в отличие от обычных блочных элементов. diff --git a/20-css-for-js/5-position/article.md b/20-css-for-js/5-position/article.md index d1fc07a71a..cf11e36b5e 100755 --- a/20-css-for-js/5-position/article.md +++ b/20-css-for-js/5-position/article.md @@ -116,8 +116,8 @@ position: absolute; Кроме того: -- **Ширина элемента с `position: absolute` устанавливается по содержимому.** Детали алгоритма вычисления ширины [описаны в стандарте](http://www.w3.org/TR/CSS2/visudet.html#abs-non-replaced-width). -- **Элемент получает `display:block`**, который перекрывает почти все возможные `display` (см. [Relationships between 'display', 'position', and 'float'](http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)). +- **Ширина элемента с `position: absolute` устанавливается по содержимому.** Детали алгоритма вычисления ширины [описаны в стандарте](https://www.w3.org/TR/CSS2/visudet.html#abs-non-replaced-width). +- **Элемент получает `display:block`**, который перекрывает почти все возможные `display` (см. [Relationships between 'display', 'position', and 'float'](https://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo)). Например, отпозиционируем заголовок в правом-верхнем углу документа: @@ -191,7 +191,7 @@ div { Дело в том, что в CSS `100%` относится к ширине внешнего блока ("containing block"). А какой внешний блок имеется в виду здесь, ведь элемент изъят со своего обычного места? -В данном случае им является так называемый (["\"initial containing block\""](http://www.w3.org/TR/CSS21/visudet.html#containing-block-details)), которым является окно, *а не документ*. +В данном случае им является так называемый (["\"initial containing block\""](https://www.w3.org/TR/CSS21/visudet.html#containing-block-details)), которым является окно, *а не документ*. **То есть, координаты и ширины вычисляются относительно окна, а не документа.** @@ -337,7 +337,7 @@ position: fixed; ## Почитать -CSS-позиционирование по-настоящему глубоко в спецификации Visual Formatting Model, 9.3 и ниже. +CSS-позиционирование по-настоящему глубоко в спецификации [Visual Formatting Model, 9.3 и ниже](https://www.w3.org/TR/CSS2/visuren.html#positioning-scheme). -Ещё есть хорошее руководство CSS Positioning in 10 steps, которое охватывает основные типы позиционирования. +Ещё есть хорошее руководство [CSS Positioning in 10 steps](https://www.barelyfitz.com/screencast/html-training/css/positioning/), которое охватывает основные типы позиционирования. diff --git a/20-css-for-js/6-css-center/article.md b/20-css-for-js/6-css-center/article.md index f61533aa68..b9bd9edc07 100755 --- a/20-css-for-js/6-css-center/article.md +++ b/20-css-for-js/6-css-center/article.md @@ -61,7 +61,7 @@ В отличие от `width/height`, значение `auto` для `margin` само не появляется. Обычно `margin` равно конкретной величине для элемента, например `0` для `DIV`. Нужно поставить его явно. -Значение `margin-left:auto/margin-right:auto` заставляет браузер выделять под `margin` всё доступное сбоку пространство. А если и то и другое `auto`, то слева и справа будет одинаковый отступ, таким образом элемент окажется в середине. Детали вычислений описаны в разделе спецификации [Calculating widths and margins](http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins). +Значение `margin-left:auto/margin-right:auto` заставляет браузер выделять под `margin` всё доступное сбоку пространство. А если и то и другое `auto`, то слева и справа будет одинаковый отступ, таким образом элемент окажется в середине. Детали вычислений описаны в разделе спецификации [Calculating widths and margins](https://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins). ## Вертикальное @@ -158,7 +158,7 @@ ### Таблица с vertical-align -У свойства [vertical-align](http://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align), которое управляет вертикальным расположением элемента, есть два режима работы. +У свойства [vertical-align](https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align), которое управляет вертикальным расположением элемента, есть два режима работы. **В таблицах свойство `vertical-align` указывает расположение *содержимого* ячейки.** From d98f2abba4e519ff7aab934a4494be84eccc2623 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 13:26:50 +0600 Subject: [PATCH 0355/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05-fetch-crossorigin/1-do-we-need-origin/solution.md | 2 +- 5-network/05-fetch-crossorigin/article.md | 8 ++++---- 5-network/08-xmlhttprequest/article.md | 4 ++-- 5-network/11-websocket/article.md | 2 +- 7-animation/1-bezier-curve/article.md | 2 +- 7-animation/2-css-animations/article.md | 6 +++--- 7-animation/3-js-animation/article.md | 2 +- 9-regular-expressions/03-regexp-unicode/article.md | 2 +- .../08-regexp-character-sets-and-ranges/article.md | 2 +- .../15-regexp-catastrophic-backtracking/article.md | 2 +- 99-archive/004-unselectable/article.md | 2 +- 11 files changed, 17 insertions(+), 17 deletions(-) diff --git a/5-network/05-fetch-crossorigin/1-do-we-need-origin/solution.md b/5-network/05-fetch-crossorigin/1-do-we-need-origin/solution.md index 4cab2615f1..76ab2b3559 100644 --- a/5-network/05-fetch-crossorigin/1-do-we-need-origin/solution.md +++ b/5-network/05-fetch-crossorigin/1-do-we-need-origin/solution.md @@ -1,6 +1,6 @@ Нам нужен `Origin`, потому что иногда `Referer` отсутствует. Например, когда мы запрашиваем через `fetch` HTTP-страницу с HTTPS (менее безопасный доступ с более безопасного), то `Referer` нет. -[Content Security Policy](http://en.wikipedia.org/wiki/Content_Security_Policy) (политика безопасности содержимого) может запретить отправление `Referer`. +[Content Security Policy](https://en.wikipedia.org/wiki/Content_Security_Policy) (политика безопасности содержимого) может запретить отправление `Referer`. Как мы увидим позже, у `fetch` есть опции, которые предотвращают отправку `Referer` и даже позволяют изменять его (в пределах того же сайта). diff --git a/5-network/05-fetch-crossorigin/article.md b/5-network/05-fetch-crossorigin/article.md index 3df1cda2af..ff4952a929 100644 --- a/5-network/05-fetch-crossorigin/article.md +++ b/5-network/05-fetch-crossorigin/article.md @@ -106,10 +106,10 @@ CORS существует для защиты интернета от злых Простые запросы будут попроще, поэтому давайте начнём с них. -[Простой запрос](http://www.w3.org/TR/cors/#terminology) - это запрос, удовлетворяющий следующим условиям: +[Простой запрос](https://www.w3.org/TR/cors/#terminology) - это запрос, удовлетворяющий следующим условиям: -1. [Простой метод](http://www.w3.org/TR/cors/#simple-method): GET, POST или HEAD -2. [Простые заголовки](http://www.w3.org/TR/cors/#simple-header) -- разрешены только: +1. [Простой метод](https://www.w3.org/TR/cors/#simple-method): GET, POST или HEAD +2. [Простые заголовки](https://www.w3.org/TR/cors/#simple-header) -- разрешены только: - `Accept`, - `Accept-Language`, - `Content-Language`, @@ -349,7 +349,7 @@ Access-Control-Allow-Credentials: true С точки зрения браузера запросы к другому источнику бывают двух видов: "простые" и все остальные. -[Простые запросы](http://www.w3.org/TR/cors/#terminology) должны удовлетворять следующим условиям: +[Простые запросы](https://www.w3.org/TR/cors/#terminology) должны удовлетворять следующим условиям: - Метод: GET, POST или HEAD. - Заголовки -- мы можем установить только: - `Accept` diff --git a/5-network/08-xmlhttprequest/article.md b/5-network/08-xmlhttprequest/article.md index 83811c643f..eee0fa3368 100644 --- a/5-network/08-xmlhttprequest/article.md +++ b/5-network/08-xmlhttprequest/article.md @@ -268,7 +268,7 @@ try { ```warn header="Ограничения на заголовки" Некоторые заголовки управляются исключительно браузером, например `Referer` или `Host`, а также ряд других. - Полный список [тут](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method). + Полный список [тут](https://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method). `XMLHttpRequest` не разрешено изменять их ради безопасности пользователей и для обеспечения корректности HTTP-запроса. ``` @@ -506,7 +506,7 @@ xhr.onerror = function() { }; ``` -Событий на самом деле больше, в [современной спецификации](http://www.w3.org/TR/XMLHttpRequest/#events) они все перечислены в том порядке, в каком генерируются во время запроса: +Событий на самом деле больше, в [современной спецификации](https://www.w3.org/TR/XMLHttpRequest/#events) они все перечислены в том порядке, в каком генерируются во время запроса: - `loadstart` -- начало запроса. - `progress` -- прибыла часть данных ответа, тело ответа полностью на данный момент можно получить из свойства `responseText`. diff --git a/5-network/11-websocket/article.md b/5-network/11-websocket/article.md index 79be8d7437..c5d1534a60 100644 --- a/5-network/11-websocket/article.md +++ b/5-network/11-websocket/article.md @@ -119,7 +119,7 @@ Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g= - `Sec-WebSocket-Extensions: deflate-frame` означает, что браузер поддерживает сжатие данных. Расширение -- это что-то, связанное с передачей данных, расширяющее сам протокол WebSocket. Заголовок `Sec-WebSocket-Extensions` отправляется браузером автоматически со списком всевозможных расширений, которые он поддерживает. -- `Sec-WebSocket-Protocol: soap, wamp` означает, что мы будем передавать не только произвольные данные, но и данные в протоколах [SOAP](http://en.wikipedia.org/wiki/SOAP) или WAMP (The WebSocket Application Messaging Protocol" -- "протокол обмена сообщениями WebSocket приложений"). То есть, этот заголовок описывает не передачу, а формат данных, который мы собираемся использовать. Официальные подпротоколы WebSocket регистрируются в [каталоге IANA](http://www.iana.org/assignments/websocket/websocket.xml). +- `Sec-WebSocket-Protocol: soap, wamp` означает, что мы будем передавать не только произвольные данные, но и данные в протоколах [SOAP](https://en.wikipedia.org/wiki/SOAP) или WAMP (The WebSocket Application Messaging Protocol" -- "протокол обмена сообщениями WebSocket приложений"). То есть, этот заголовок описывает не передачу, а формат данных, который мы собираемся использовать. Официальные подпротоколы WebSocket регистрируются в [каталоге IANA](http://www.iana.org/assignments/websocket/websocket.xml). Этот необязательный заголовок ставим мы сами, передавая массив подпротоколов вторым параметром `new WebSocket`, вот так: diff --git a/7-animation/1-bezier-curve/article.md b/7-animation/1-bezier-curve/article.md index 1c2befa52f..5e657be2a0 100644 --- a/7-animation/1-bezier-curve/article.md +++ b/7-animation/1-bezier-curve/article.md @@ -49,7 +49,7 @@ ## Алгоритм "де Кастельжо" -Есть математическая формула для кривых Безье, но давайте рассмотрим её чуть позже, потому что [Алгоритм де Кастельжо](http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B5_%D0%9A%D0%B0%D1%81%D1%82%D0%B5%D0%BB%D1%8C%D0%B6%D0%BE) идентичен математическому определению кривой и наглядно показывает, как она строится. +Есть математическая формула для кривых Безье, но давайте рассмотрим её чуть позже, потому что [Алгоритм де Кастельжо](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B5_%D0%9A%D0%B0%D1%81%D1%82%D0%B5%D0%BB%D1%8C%D0%B6%D0%BE) идентичен математическому определению кривой и наглядно показывает, как она строится. Рассмотрим его на примере трёх точек (точки 1,2 и 3 можно двигать). Нажатие на кнопку "play" запустит демонстрацию. diff --git a/7-animation/2-css-animations/article.md b/7-animation/2-css-animations/article.md index 208398f539..2a678c2ccf 100644 --- a/7-animation/2-css-animations/article.md +++ b/7-animation/2-css-animations/article.md @@ -76,11 +76,11 @@ growing.onclick = function() { В `transition-property` записывается список свойств, изменения которых необходимо анимировать, например: `left`, `margin-left`, `height`, `color`. -Анимировать можно не все свойства, но [многие из них](http://www.w3.org/TR/css3-transitions/#animatable-properties-). Значение свойства `all` означает "анимируй все свойства". +Анимировать можно не все свойства, но [многие из них](https://www.w3.org/TR/css3-transitions/#animatable-properties-). Значение свойства `all` означает "анимируй все свойства". ## transition-duration -В `transition-duration` можно определить, сколько времени займёт анимация. Время должно быть задано в [формате времени CSS](http://www.w3.org/TR/css3-values/#time): в секундах `s` или миллисекундах `ms`. +В `transition-duration` можно определить, сколько времени займёт анимация. Время должно быть задано в [формате времени CSS](https://www.w3.org/TR/css3-values/#time): в секундах `s` или миллисекундах `ms`. ## transition-delay @@ -254,7 +254,7 @@ CSS: Это, конечно, "мягкий" вариант. Если значение `y` будут `-99` и `99`, то поезд будет гораздо сильнее "выпрыгивать" за пределы. -Как сделать кривую Безье необходимую для конкретной задачи? Существует множество инструментов, например можно использовать с сайта . +Как сделать кривую Безье необходимую для конкретной задачи? Существует множество инструментов, например можно использовать с сайта . ### Шаги diff --git a/7-animation/3-js-animation/article.md b/7-animation/3-js-animation/article.md index 56859118dd..12bee2cc5e 100644 --- a/7-animation/3-js-animation/article.md +++ b/7-animation/3-js-animation/article.md @@ -79,7 +79,7 @@ setInterval(animate3, 20); Существует ещё одна вещь, про которую надо помнить: когда CPU перегружен или есть другие причины делать перерисовку реже (например, когда вкладка браузера скрыта), нам не следует делать её каждые `20ms`. -Но как нам узнать об этом в JavaScript? Спецификация [Animation timing](http://www.w3.org/TR/animation-timing/) описывает функцию `requestAnimationFrame`, которая решает все описанные проблемы и делает даже больше. +Но как нам узнать об этом в JavaScript? Спецификация [Animation timing](https://www.w3.org/TR/animation-timing/) описывает функцию `requestAnimationFrame`, которая решает все описанные проблемы и делает даже больше. Синтаксис: ```js diff --git a/9-regular-expressions/03-regexp-unicode/article.md b/9-regular-expressions/03-regexp-unicode/article.md index 0481939034..7a9a2e492d 100644 --- a/9-regular-expressions/03-regexp-unicode/article.md +++ b/9-regular-expressions/03-regexp-unicode/article.md @@ -36,7 +36,7 @@ alert('𝒳'.length); // 2 ```warn header="Не поддерживается в некоторых старых браузерах" Несмотря на то, что это часть стандарта с 2018 года, Юникодные свойства не поддерживаются в Firefox до 78 версии и в Edge до 79 версии. -Существует библиотека [XRegExp](http://xregexp.com), которая реализует "расширенные" регулярные выражения с кросс-браузерной поддержкой Юникодных свойств. +Существует библиотека [XRegExp](https://xregexp.com), которая реализует "расширенные" регулярные выражения с кросс-браузерной поддержкой Юникодных свойств. ``` Каждому символу в кодировке Юникод соответствует множество свойств. Они описывают к какой "категории" относится символ, содержат различную информацию о нём. diff --git a/9-regular-expressions/08-regexp-character-sets-and-ranges/article.md b/9-regular-expressions/08-regexp-character-sets-and-ranges/article.md index 5afd3f5f6a..4f4de4b591 100644 --- a/9-regular-expressions/08-regexp-character-sets-and-ranges/article.md +++ b/9-regular-expressions/08-regexp-character-sets-and-ranges/article.md @@ -93,7 +93,7 @@ alert( str.match(regexp) ); // H,i,你,好,1,2 Конечно, этот шаблон можно адаптировать: добавить Юникодные свойства или убрать. Более подробно о них было рассказано в главе . ```warn header="Юникодные свойства не работают в некоторых старых браузерах" -Поддержка Юникодных свойств `pattern:p{…}` была добавлена в Edge и Firefox относительно недавно. Если нужно реализовать поддержку `pattern:p{…}` для устаревших версий этих браузеров, можно использовать библиотеку [XRegExp](http://xregexp.com/). +Поддержка Юникодных свойств `pattern:p{…}` была добавлена в Edge и Firefox относительно недавно. Если нужно реализовать поддержку `pattern:p{…}` для устаревших версий этих браузеров, можно использовать библиотеку [XRegExp](https://xregexp.com/). Или же использовать диапазоны символов в интересующем нас языке, например `pattern:[а-я]` для кириллицы. ``` diff --git a/9-regular-expressions/15-regexp-catastrophic-backtracking/article.md b/9-regular-expressions/15-regexp-catastrophic-backtracking/article.md index d3338e42a8..f4b450d8ea 100644 --- a/9-regular-expressions/15-regexp-catastrophic-backtracking/article.md +++ b/9-regular-expressions/15-regexp-catastrophic-backtracking/article.md @@ -265,7 +265,7 @@ alert( "JavaScript".match(/(?=(\w+))\1Script/)); // null Внутрь `pattern:(?=(\w+))\1` можно вместо `pattern:\w` вставить и более сложное регулярное выражение, при поиске которого квантификатор `pattern:+` не должен делать возврат. ```smart -Больше о связи захватывающих квантификаторов и опережающей проверки вы можете найти в статьях [Regex: Emulate Atomic Grouping (and Possessive Quantifiers) with LookAhead](http://instanceof.me/post/52245507631/regex-emulate-atomic-grouping-with-lookahead) и [Mimicking Atomic Groups](http://blog.stevenlevithan.com/archives/mimic-atomic-groups). +Больше о связи захватывающих квантификаторов и опережающей проверки вы можете найти в статьях [Regex: Emulate Atomic Grouping (and Possessive Quantifiers) with LookAhead](https://instanceof.me/post/52245507631/regex-emulate-atomic-grouping-with-lookahead) и [Mimicking Atomic Groups](https://blog.stevenlevithan.com/archives/mimic-atomic-groups). ``` Перепишем исходный пример, используя опережающую проверку для запрета возврата: diff --git a/99-archive/004-unselectable/article.md b/99-archive/004-unselectable/article.md index cecb31bbad..cba7fdb58e 100755 --- a/99-archive/004-unselectable/article.md +++ b/99-archive/004-unselectable/article.md @@ -23,7 +23,7 @@ archive: Текст ``` -Чтобы избежать выделения, мы должны предотвратить действие браузера по умолчанию для события [selectstart](http://msdn.microsoft.com/en-us/library/ms536969%28VS.85%29.aspx) в IE и `mousedown` в других браузерах. +Чтобы избежать выделения, мы должны предотвратить действие браузера по умолчанию для события [selectstart](https://developer.mozilla.org/en-US/docs/Web/API/Document/selectstart_event) в IE и `mousedown` в других браузерах. Полный код элемента, который обрабатывает двойной клик без выделения: From f308437de366d18a442b55a413f9dbe2535b3a7e Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 13:49:12 +0600 Subject: [PATCH 0356/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1-calculate-capitalization/task.md | 2 +- 99-archive/005-events-change/article.md | 2 +- 99-archive/007-types-conversion/article.md | 2 +- 99-archive/009-pre-coding/article.md | 22 +++++++++---------- 99-archive/010-editor/article.md | 14 ++++++------ 99-archive/011-es-modern-usage/article.md | 4 ++-- 99-archive/012-set-map/article.md | 2 +- 99-archive/013-promise/article.md | 2 +- 99-archive/014-generator/article.md | 2 +- 99-archive/016-es-object/article.md | 2 +- .../article.md | 2 +- 99-archive/023-write-unmain-code/article.md | 4 ++-- 99-archive/024-testing/article.md | 12 +++++----- 99-archive/027-datetime/article.md | 4 ++-- 99-archive/031-closures/article.md | 2 +- 99-archive/033-closures-usage/article.md | 2 +- 99-archive/034-memory-management/article.md | 2 +- 99-archive/035-object-conversion/article.md | 4 ++-- 99-archive/038-call-apply/article.md | 2 +- 99-archive/039-decorators/article.md | 2 +- 99-archive/041-exception/article.md | 2 +- 21 files changed, 46 insertions(+), 46 deletions(-) diff --git a/99-archive/005-events-change/1-calculate-capitalization/task.md b/99-archive/005-events-change/1-calculate-capitalization/task.md index c8cf706c50..dc1d3b6f70 100755 --- a/99-archive/005-events-change/1-calculate-capitalization/task.md +++ b/99-archive/005-events-change/1-calculate-capitalization/task.md @@ -6,7 +6,7 @@ importance: 5 Создайте интерфейс для автоматического вычисления процентов по вкладу. -Ставка фиксирована: 12% годовых. При включённом поле "капитализация" -- проценты приплюсовываются к сумме вклада каждый месяц ([сложный процент](http://damoney.ru/finance/slozniy-procent.php)). +Ставка фиксирована: 12% годовых. При включённом поле "капитализация" -- проценты приплюсовываются к сумме вклада каждый месяц ([сложный процент](https://damoney.ru/finance/slozniy-procent.php)). Пример: diff --git a/99-archive/005-events-change/article.md b/99-archive/005-events-change/article.md index 1301d3dfb6..8bfd547354 100755 --- a/99-archive/005-events-change/article.md +++ b/99-archive/005-events-change/article.md @@ -9,7 +9,7 @@ archive: ## Событие change -Событие [change](http://www.w3.org/TR/html5/forms.html#event-input-change) происходит по окончании изменения значения элемента формы, когда это изменение зафиксировано. +Событие [change](https://html.spec.whatwg.org/multipage/indices.html#event-input-change) происходит по окончании изменения значения элемента формы, когда это изменение зафиксировано. Для текстовых элементов это означает, что событие произойдёт не при каждом вводе, а при потере фокуса. diff --git a/99-archive/007-types-conversion/article.md b/99-archive/007-types-conversion/article.md index c42f7103e2..9937381e66 100755 --- a/99-archive/007-types-conversion/article.md +++ b/99-archive/007-types-conversion/article.md @@ -108,7 +108,7 @@ alert( +" \n 123 \n \n" ); // 123 null0 -Это преобразование осуществляется при арифметических операциях и сравнениях `> >= < <=`, но не при проверке равенства `==`. Алгоритм проверки равенства для этих значений в спецификации прописан отдельно (пункт [11.9.3](http://es5.github.com/x11.html#x11.9.3)). В нём считается, что `null` и `undefined` равны `"=="` между собой, но эти значения не равны никакому другому значению. +Это преобразование осуществляется при арифметических операциях и сравнениях `> >= < <=`, но не при проверке равенства `==`. Алгоритм проверки равенства для этих значений в спецификации прописан отдельно (пункт [11.9.3](https://es5.github.io/x11.html#x11.9.3)). В нём считается, что `null` и `undefined` равны `"=="` между собой, но эти значения не равны никакому другому значению. Это ведёт к забавным последствиям. diff --git a/99-archive/009-pre-coding/article.md b/99-archive/009-pre-coding/article.md index 59db387f1a..9b56822de8 100755 --- a/99-archive/009-pre-coding/article.md +++ b/99-archive/009-pre-coding/article.md @@ -33,8 +33,8 @@ archive: 1. -- содержит подробную информацию по HTML/CSS/JavaScript. 2. -- справочник по JavaScript на русском языке, он содержит основную информацию по языку, без функций для работы с документом. К нему можно обращаться и по адресу, если знаете, что искать. Например, так: . -3. -- информация о браузерных несовместимостях. Этот ресурс сам по себе довольно старый и, в первую очередь, полезен для поддержки устаревших браузеров. Для поиска можно пользоваться комбинацией **"quirksmode onkeypress"** в Google. -4. -- ресурс о поддержке браузерами новейших возможностей HTML/CSS/JavaScript. Например, для поддержки функций криптографии: . +3. -- информация о браузерных несовместимостях. Этот ресурс сам по себе довольно старый и, в первую очередь, полезен для поддержки устаревших браузеров. Для поиска можно пользоваться комбинацией **"quirksmode onkeypress"** в Google. +4. -- ресурс о поддержке браузерами новейших возможностей HTML/CSS/JavaScript. Например, для поддержки функций криптографии: . 5. -- таблица с обзором поддержки спецификации ECMAScript различными платформами. ## Спецификации @@ -45,7 +45,7 @@ archive: ### Спецификация ECMAScript -Спецификация (формальное описание синтаксиса, базовых объектов и алгоритмов) языка JavaScript называется [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm). +Спецификация (формальное описание синтаксиса, базовых объектов и алгоритмов) языка JavaScript называется [ECMAScript](https://www.ecma-international.org/publications/standards/Ecma-262.htm). ```smart header="Почему не просто "JavaScript" ?" Вы можете спросить: "Почему спецификация для JavaScript не называется просто *"JavaScript"*, зачем существует какое-то отдельное название?" @@ -63,15 +63,15 @@ JavaScript -- язык общего назначения, поэтому в сп Главная организация, которая занимается HTML, CSS, XML и множеством других стандартов -- [Консорциум Всемирной паутины](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%BE%D1%80%D1%86%D0%B8%D1%83%D0%BC_%D0%92%D1%81%D0%B5%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B0%D1%83%D1%82%D0%B8%D0%BD%D1%8B) (World Wide Web Consortium, сокращённо W3C). -Информацию о них можно найти на сайте [w3.org](http://w3.org). К сожалению, найти в этой куче то, что нужно, может быть нелегко, особенно когда неизвестно в каком именно стандарте искать. Самый лучший способ -- попросить Google с указанием сайта. +Информацию о них можно найти на сайте [w3.org](https://w3.org). К сожалению, найти в этой куче то, что нужно, может быть нелегко, особенно когда неизвестно в каком именно стандарте искать. Самый лучший способ -- попросить Google с указанием сайта. Например, для поиска `document.cookie` набрать [document.cookie site:w3.org](https://www.google.com/search?q=document.cookie+site%3Aw3.org). -Последние версии стандартов расположены на домене [dev.w3.org](http://dev.w3.org). +Последние версии стандартов расположены на домене [dev.w3.org](https://dev.w3.org). Кроме того, в том, что касается HTML5 и DOM/CSS, W3C активно использует наработки другой организации -- [WhatWG](https://whatwg.org/). Поэтому самые актуальные версии спецификаций по этим темам обычно находятся на . -Иногда бывает так, что информация на сайте отличается от . В этом случае, как правило, следует руководствоваться . +Иногда бывает так, что информация на сайте отличается от . В этом случае, как правило, следует руководствоваться . ## Итого @@ -91,16 +91,16 @@ Google-комбо: `"RegExp site:javascript.ru"`. Спецификации содержат важнейшую информацию о том, как оно "должно работать": -- JavaScript, современный стандарт [ES5 (англ)](http://www.ecma-international.org/publications/standards/Ecma-262.htm), и предыдущий [ES3 (рус)](http://javascript.ru/ecma). -- HTML/DOM/CSS -- на сайте [http://w3.org](http://www.w3.org). +- JavaScript, современный стандарт [ES5 (англ)](https://www.ecma-international.org/publications/standards/Ecma-262.htm), и предыдущий [ES3 (рус)](http://javascript.ru/ecma). +- HTML/DOM/CSS -- на сайте [https://w3.org](https://www.w3.org). Google-комбо: `"document.cookie site:w3.org"`. -- ...А самые последние версии стандартов -- на и на [http://whatwg.org/specs/](https://whatwg.org/specs/). +- ...А самые последние версии стандартов -- на и на [https://whatwg.org/specs/](https://whatwg.org/specs/). То, как оно на самом деле работает и несовместимости: -- . Google-комбо: `"innerHeight quirksmode"`. +- . Google-комбо: `"innerHeight quirksmode"`. Поддержка современных и новейших возможностей браузерами: -- . Google-комбо: `"caniuse geolocation"`. +- . Google-комбо: `"caniuse geolocation"`. diff --git a/99-archive/010-editor/article.md b/99-archive/010-editor/article.md index e6d93333d3..a7d97606aa 100644 --- a/99-archive/010-editor/article.md +++ b/99-archive/010-editor/article.md @@ -21,11 +21,11 @@ archive: Если вы ещё не задумывались над выбором IDE, присмотритесь к следующим вариантам. -- Продукты IntelliJ: [WebStorm](http://www.jetbrains.com/webstorm/), а также в зависимости от дополнительного языка программирования [PHPStorm (PHP)](http://www.jetbrains.com/phpstorm/), [IDEA (Java)](http://www.jetbrains.com/idea/), [RubyMine (Ruby)](http://www.jetbrains.com/ruby/) и другие. +- Продукты IntelliJ: [WebStorm](https://www.jetbrains.com/webstorm/), а также в зависимости от дополнительного языка программирования [PHPStorm (PHP)](https://www.jetbrains.com/phpstorm/), [IDEA (Java)](https://www.jetbrains.com/idea/), [RubyMine (Ruby)](https://www.jetbrains.com/ruby/) и другие. - Visual Studio, в сочетании с разработкой под .NET (Win) - Продукты на основе Eclipse, в частности [Aptana](http://www.aptana.com/) и Zend Studio -- [Komodo IDE](http://www.activestate.com/komodo-ide) и его облегчённая версия [Komodo Edit](http://www.activestate.com/komodo-edit). -- [Netbeans](http://netbeans.org/) +- [Komodo IDE](https://www.activestate.com/komodo-ide) и его облегчённая версия [Komodo Edit](https://www.activestate.com/komodo-edit). +- [Netbeans](https://netbeans.apache.org/) Почти все они, за исключением Visual Studio, кросс-платформенные. @@ -46,16 +46,16 @@ archive: - [Sublime Text](http://www.sublimetext.com/) (кросс-платформенный, shareware). - [Visual Studio Code](https://code.visualstudio.com/) (кросс-платформенный, бесплатный). - [Atom](https://atom.io/) (кросс-платформенный, бесплатный). -- [Brackets](http://brackets.io/) (кросс-платформенный, бесплатный). -- [SciTe](http://www.scintilla.org/) -- простой, лёгкий и очень быстрый (Windows, бесплатный). +- [Brackets](https://brackets.io/) (кросс-платформенный, бесплатный). +- [SciTe](https://www.scintilla.org/) -- простой, лёгкий и очень быстрый (Windows, бесплатный). - [Notepad++](https://notepad-plus-plus.org/) (Windows, бесплатный). -- [Vim](http://www.vim.org/), [Emacs](http://www.gnu.org/software/emacs/). Если умеете их готовить. +- [Vim](https://www.vim.org/), [Emacs](http://www.gnu.org/software/emacs/). Если умеете их готовить. ## Мои редакторы Лично мои любимые редакторы: -- Как IDE -- редакторы от Jetbrains: для чистого JavaScript [WebStorm](http://www.jetbrains.com/webstorm/), если ещё какой-то язык, то в зависимости от языка: [PHPStorm (PHP)](http://www.jetbrains.com/phpstorm/), [IDEA (Java)](http://www.jetbrains.com/idea/), [RubyMine (Ruby)](http://www.jetbrains.com/ruby/). У них есть и другие редакторы под разные языки, но я ими не пользовался. +- Как IDE -- редакторы от Jetbrains: для чистого JavaScript [WebStorm](https://www.jetbrains.com/webstorm/), если ещё какой-то язык, то в зависимости от языка: [PHPStorm (PHP)](https://www.jetbrains.com/phpstorm/), [IDEA (Java)](https://www.jetbrains.com/idea/), [RubyMine (Ruby)](https://www.jetbrains.com/ruby/). У них есть и другие редакторы под разные языки, но я ими не пользовался. - Как быстрый редактор -- Sublime Text. - Иногда Visual Studio, если разработка идёт под платформу .NET (Win). diff --git a/99-archive/011-es-modern-usage/article.md b/99-archive/011-es-modern-usage/article.md index d924cac75d..4330e86adc 100755 --- a/99-archive/011-es-modern-usage/article.md +++ b/99-archive/011-es-modern-usage/article.md @@ -5,7 +5,7 @@ archive: # ES-2015 сейчас -[Стандарт ES-2015](http://www.ecma-international.org/publications/standards/Ecma-262.htm) был принят в июне 2015. Пока что большинство браузеров реализуют его частично, текущее состояние реализации различных возможностей можно посмотреть здесь: . +[Стандарт ES-2015](https://www.ecma-international.org/publications/standards/Ecma-262.htm) был принят в июне 2015. Пока что большинство браузеров реализуют его частично, текущее состояние реализации различных возможностей можно посмотреть здесь: . Когда стандарт будет более-менее поддерживаться во всех браузерах, то весь учебник будет обновлён в соответствии с ним. Пока же, как центральное место для "сбора" современных фич JavaScript, создан этот раздел. @@ -30,7 +30,7 @@ archive: На странице можно поэкспериментировать с транспайлером: слева вводится код в ES-2015, а справа появляется результат его преобразования в ES5. -Обычно Babel.JS работает на сервере в составе системы сборки JS-кода (например [webpack](http://webpack.github.io/) или [brunch](http://brunch.io/)) и автоматически переписывает весь код в ES5. +Обычно Babel.JS работает на сервере в составе системы сборки JS-кода (например [webpack](http://webpack.github.io/) или [brunch](https://brunch.io/)) и автоматически переписывает весь код в ES5. Настройка такой конвертации тривиальна, единственно -- нужно поднять саму систему сборки, а добавить к ней Babel легко, плагины есть к любой из них. diff --git a/99-archive/012-set-map/article.md b/99-archive/012-set-map/article.md index 96fb9ef918..207633f70c 100644 --- a/99-archive/012-set-map/article.md +++ b/99-archive/012-set-map/article.md @@ -79,7 +79,7 @@ alert( visitsCountMap.get(user) ); // 123 Использование объектов в качестве ключей -- как раз тот случай, когда `Map` сложно заменить обычными объектами `Object`. Ведь для обычных объектов ключ может быть только строкой. ```smart header="Как map сравнивает ключи" -Для проверки значений на эквивалентность используется алгоритм [SameValueZero](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevaluezero). Он аналогичен строгому равенству `===`, отличие -- в том, что `NaN` считается равным `NaN`. Поэтому значение `NaN` также может быть использовано в качестве ключа. +Для проверки значений на эквивалентность используется алгоритм [SameValueZero](https://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevaluezero). Он аналогичен строгому равенству `===`, отличие -- в том, что `NaN` считается равным `NaN`. Поэтому значение `NaN` также может быть использовано в качестве ключа. Этот алгоритм нельзя изменять или задавать свою функцию сравнения. ``` diff --git a/99-archive/013-promise/article.md b/99-archive/013-promise/article.md index 98c7a7af4f..51ca0bfb62 100644 --- a/99-archive/013-promise/article.md +++ b/99-archive/013-promise/article.md @@ -438,7 +438,7 @@ httpGet('/page-not-exists') ## Промисы в деталях -Самым основным источником информации по промисам является, разумеется, [стандарт](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects). +Самым основным источником информации по промисам является, разумеется, [стандарт](https://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise-objects). Чтобы наше понимание промисов было полным, и мы могли с лёгкостью разрешать сложные ситуации, посмотрим внимательнее, что такое промис и как он работает, но уже не в общих словах, а детально, в соответствии со стандартом ECMAScript. diff --git a/99-archive/014-generator/article.md b/99-archive/014-generator/article.md index d747fc92ff..ddc02d9148 100644 --- a/99-archive/014-generator/article.md +++ b/99-archive/014-generator/article.md @@ -468,7 +468,7 @@ co(function*() { }) ``` -Предполагается, что библиотека `co` подключена к странице , например, отсюда: . В примере выше `function*()` делает `yield` промиса с `setTimeout`, который через секунду возвращает `1`. +Предполагается, что библиотека `co` подключена к странице , например, отсюда: . В примере выше `function*()` делает `yield` промиса с `setTimeout`, который через секунду возвращает `1`. Вызов `co(…)` возвращает промис с результатом генератора. Если в примере выше `function*()` что-то возвратит, то это можно будет получить через `.then` в результате `co`: diff --git a/99-archive/016-es-object/article.md b/99-archive/016-es-object/article.md index 1d5de1481f..01d2652742 100644 --- a/99-archive/016-es-object/article.md +++ b/99-archive/016-es-object/article.md @@ -138,7 +138,7 @@ alert( Object.is(NaN, NaN) ); // true alert( NaN === NaN ); // false ``` -Отличия эти в большинстве ситуаций некритичны, так что не похоже, чтобы эта функция вытеснила обычную проверку `===`. Что интересно -- этот алгоритм сравнения, который называется [SameValue](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevalue), применяется во внутренних реализациях различных методов современного стандарта. +Отличия эти в большинстве ситуаций некритичны, так что не похоже, чтобы эта функция вытеснила обычную проверку `===`. Что интересно -- этот алгоритм сравнения, который называется [SameValue](https://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevalue), применяется во внутренних реализациях различных методов современного стандарта. ## Методы объекта diff --git a/99-archive/019-function-declaration-expression/article.md b/99-archive/019-function-declaration-expression/article.md index 8afb82739d..8619895428 100755 --- a/99-archive/019-function-declaration-expression/article.md +++ b/99-archive/019-function-declaration-expression/article.md @@ -239,7 +239,7 @@ ask( Здесь функции объявлены прямо внутри вызова `ask(...)`, даже без присвоения им имени. -**Функциональное выражение, которое не записывается в переменную, называют [анонимной функцией](http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F).** +**Функциональное выражение, которое не записывается в переменную, называют [анонимной функцией](https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F).** Действительно, зачем нам записывать функцию в переменную, если мы не собираемся вызывать её ещё раз? Можно просто объявить непосредственно там, где функция нужна. diff --git a/99-archive/023-write-unmain-code/article.md b/99-archive/023-write-unmain-code/article.md index 3524c221aa..cb986aa6a8 100755 --- a/99-archive/023-write-unmain-code/article.md +++ b/99-archive/023-write-unmain-code/article.md @@ -6,7 +6,7 @@ archive: # Как писать неподдерживаемый код? ```warn header="Познай свой код" -Эта статья представляет собой мой вольный перевод [How To Write Unmaintainable Code](http://mindprod.com/jgloss/unmain.html) ("как писать неподдерживаемый код") с дополнениями, актуальными для JavaScript. +Эта статья представляет собой мой вольный перевод [How To Write Unmaintainable Code](https://mindprod.com/jgloss/unmain.html) ("как писать неподдерживаемый код") с дополнениями, актуальными для JavaScript. Возможно, в каких-то из этих советов вам даже удастся узнать "этого парня в зеркале". ``` @@ -50,7 +50,7 @@ archive: Этот пример требует знаний jQuery/DOM, если пока их у вас нет -- пропустите его, ничего страшного, но обязательно вернитесь к нему позже. Подобное стоит многих часов отладки. ``` -Во фреймворке jQuery есть метод [wrap](http://api.jquery.com/wrap/), который обёртывает один элемент вокруг другого: +Во фреймворке jQuery есть метод [wrap](https://api.jquery.com/wrap/), который обёртывает один элемент вокруг другого: ```js var img = $(''); // создали новые элементы (jQuery-синтаксис) diff --git a/99-archive/024-testing/article.md b/99-archive/024-testing/article.md index 5511516c10..75c5c70815 100755 --- a/99-archive/024-testing/article.md +++ b/99-archive/024-testing/article.md @@ -25,7 +25,7 @@ archive: ## BDD -- поведенческие тесты кода -Мы рассмотрим методику тестирования, которая входит в [BDD](http://en.wikipedia.org/wiki/Behavior-driven_development) -- Behavior Driven Development. Подход BDD давно и с успехом используется во многих проектах. +Мы рассмотрим методику тестирования, которая входит в [BDD](https://en.wikipedia.org/wiki/Behavior-driven_development) -- Behavior Driven Development. Подход BDD давно и с успехом используется во многих проектах. BDD -- это не просто тесты. Это гораздо больше. @@ -72,7 +72,7 @@ describe("pow", function() { 1. Пишется спецификация, которая описывает самую базовую функциональность. 2. Делается начальная реализация. -3. Для проверки соответствия спецификации мы задействуем фреймворк (в нашем случае [Mocha](http://mochajs.org/)). Фреймворк запускает все тесты `it` и выводит ошибки, если они возникнут. При ошибках вносятся исправления. +3. Для проверки соответствия спецификации мы задействуем фреймворк (в нашем случае [Mocha](https://mochajs.org/)). Фреймворк запускает все тесты `it` и выводит ошибки, если они возникнут. При ошибках вносятся исправления. 4. Спецификация расширяется, в неё добавляются возможности, которые пока, возможно, не поддерживаются реализацией. 5. Идём на пункт 2, делаем реализацию. И так "до победного конца". @@ -86,9 +86,9 @@ describe("pow", function() { Мы будем использовать: -- [Mocha](http://mochajs.org/) -- эта библиотека содержит общие функции для тестирования, включая `describe` и `it`. -- [Chai](http://chaijs.com) -- библиотека поддерживает разнообразные функции для проверок. Есть разные "стили" проверки результатов, с которыми мы познакомимся позже, на текущий момент мы будем использовать лишь `assert.equal`. -- [Sinon](http://sinonjs.org/) -- для эмуляции и хитрой подмены функций "заглушками", понадобится позднее. +- [Mocha](https://mochajs.org/) -- эта библиотека содержит общие функции для тестирования, включая `describe` и `it`. +- [Chai](https://chaijs.com) -- библиотека поддерживает разнообразные функции для проверок. Есть разные "стили" проверки результатов, с которыми мы познакомимся позже, на текущий момент мы будем использовать лишь `assert.equal`. +- [Sinon](https://sinonjs.org/) -- для эмуляции и хитрой подмены функций "заглушками", понадобится позднее. Эти библиотеки позволяют тестировать JS не только в браузере, но и на сервере Node.JS. Здесь мы рассмотрим браузерный вариант, серверный использует те же функции. @@ -360,7 +360,7 @@ describe("pow", function() { - `assert.notEqual`, `assert.notStrictEqual` -- проверки, обратные двум предыдущим. - `assert.isTrue(value)` -- проверяет, что `value === true` - `assert.isFalse(value)` -- проверяет, что `value === false` -- ...более полный список -- в [документации](http://chaijs.com/api/assert/) +- ...более полный список -- в [документации](https://chaijs.com/api/assert/) В нашем случае хорошо бы использовать проверку `assert.isNaN`, и такой метод существует, но сейчас мы рассматриваем самый общий метод `assert(...)`. В этом случае для того, чтобы сделать сообщение об ошибке понятнее, желательно добавить к `assert` описание. diff --git a/99-archive/027-datetime/article.md b/99-archive/027-datetime/article.md index 7fbd282848..2434d8e2b7 100644 --- a/99-archive/027-datetime/article.md +++ b/99-archive/027-datetime/article.md @@ -357,7 +357,7 @@ console.timeEnd("All Benchmarks"); ## Форматирование и вывод дат -Во всех браузерах, кроме IE10-, поддерживается новый стандарт [Ecma 402](http://www.ecma-international.org/publications/standards/Ecma-402.htm), который добавляет специальные методы для форматирования дат. +Во всех браузерах, кроме IE10-, поддерживается новый стандарт [Ecma 402](https://www.ecma-international.org/publications/standards/Ecma-402.htm), который добавляет специальные методы для форматирования дат. Это делается вызовом `date.toLocaleString(локаль, опции)`, в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку. @@ -407,7 +407,7 @@ var d = new Date(); alert( d.toISOString() ); // вывод, похожий на '2011-01-26T13:51:50.417Z' ``` -Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например [Moment.JS](http://momentjs.com/) или написать свою функцию форматирования. +Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например [Moment.JS](https://momentjs.com/) или написать свою функцию форматирования. ## Разбор строки, Date.parse diff --git a/99-archive/031-closures/article.md b/99-archive/031-closures/article.md index 804477b825..f1d9f25320 100755 --- a/99-archive/031-closures/article.md +++ b/99-archive/031-closures/article.md @@ -369,7 +369,7 @@ alert( counter() ); // 5 ## Итого: замыкания -[Замыкание](http://en.wikipedia.org/wiki/Closure_(computer_science)) -- это функция вместе со всеми внешними переменными, которые ей доступны. +[Замыкание](https://en.wikipedia.org/wiki/Closure_(computer_science)) -- это функция вместе со всеми внешними переменными, которые ей доступны. Таково стандартное определение, которое есть в Wikipedia и большинстве серьёзных источников по программированию. То есть, замыкание -- это функция + внешние переменные. diff --git a/99-archive/033-closures-usage/article.md b/99-archive/033-closures-usage/article.md index 5e0ceaf9b8..2b23b4cbda 100755 --- a/99-archive/033-closures-usage/article.md +++ b/99-archive/033-closures-usage/article.md @@ -116,7 +116,7 @@ alert( counter() ); // 5 Красиво, не правда ли? Получился полноценный объект, который можно вдобавок ещё и вызывать. -Этот трюк часто используется при разработке JavaScript-библиотек. Например, популярная библиотека [jQuery](http://jquery.com) предоставляет глобальную переменную с именем [jQuery](http://api.jquery.com/jQuery/) (доступна также под коротким именем `$`), которая с одной стороны является функцией и может вызываться как `jQuery(...)`, а с другой -- у неё есть различные методы, например `jQuery.type(123)` возвращает тип аргумента. +Этот трюк часто используется при разработке JavaScript-библиотек. Например, популярная библиотека [jQuery](https://jquery.com) предоставляет глобальную переменную с именем [jQuery](https://api.jquery.com/jQuery/) (доступна также под коротким именем `$`), которая с одной стороны является функцией и может вызываться как `jQuery(...)`, а с другой -- у неё есть различные методы, например `jQuery.type(123)` возвращает тип аргумента. Далее вы найдёте различные задачи на понимание замыканий. Рекомендуется их сделать самостоятельно. diff --git a/99-archive/034-memory-management/article.md b/99-archive/034-memory-management/article.md index 9d865cf5ba..ff64ec40c6 100755 --- a/99-archive/034-memory-management/article.md +++ b/99-archive/034-memory-management/article.md @@ -147,7 +147,7 @@ function showTime() { } ``` -Если вы знаете низкоуровневые языки программирования, то более подробно об организации сборки мусора в V8 можно почитать, например, в статье [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). +Если вы знаете низкоуровневые языки программирования, то более подробно об организации сборки мусора в V8 можно почитать, например, в статье [A tour of V8: Garbage Collection](https://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection). ```` ## Замыкания diff --git a/99-archive/035-object-conversion/article.md b/99-archive/035-object-conversion/article.md index 754a20136c..c217511dac 100644 --- a/99-archive/035-object-conversion/article.md +++ b/99-archive/035-object-conversion/article.md @@ -119,7 +119,7 @@ alert( +new Date() ); // valueOf: кол-во миллисекунд, проше ```` ```smart header="Детали спецификации" -Если посмотреть в стандарт, то в пункте [15.2.4.4](http://es5.github.com/x15.2.html#x15.2.4.4) говорится о том, что `valueOf` есть у любых объектов. Но он ничего не делает, просто возвращает сам объект (непримитивное значение!), а потому игнорируется. +Если посмотреть в стандарт, то в пункте [15.2.4.4](https://es5.github.io/x15.2.html#x15.2.4.4) говорится о том, что `valueOf` есть у любых объектов. Но он ничего не делает, просто возвращает сам объект (непримитивное значение!), а потому игнорируется. ``` ## Две стадии преобразования @@ -234,7 +234,7 @@ if (value) { - При строковом преобразовании объекта используется его метод `toString`. Он должен возвращать примитивное значение, причём не обязательно именно строку. - Для численного преобразования используется метод `valueOf`, который также может возвратить любое примитивное значение. У большинства объектов `valueOf` не работает (возвращает сам объект и потому игнорируется), при этом для численного преобразования используется `toString`. -Полный алгоритм преобразований есть в спецификации ECMAScript, смотрите пункты [11.8.5](http://es5.github.com/x11.html#x11.8.5), [11.9.3](http://es5.github.com/x11.html#x11.9.3), а также [9.1](http://es5.github.com/x9.html#x9.1) и [9.3](http://es5.github.com/x9.html#x9.3). +Полный алгоритм преобразований есть в спецификации ECMAScript, смотрите пункты [11.8.5](https://es5.github.io/x11.html#x11.8.5), [11.9.3](https://es5.github.io/x11.html#x11.9.3), а также [9.1](https://es5.github.io/x9.html#x9.1) и [9.3](https://es5.github.io/x9.html#x9.3). Заметим, для полноты картины, что некоторые тесты знаний в интернет предлагают вопросы типа: ```js no-beautify diff --git a/99-archive/038-call-apply/article.md b/99-archive/038-call-apply/article.md index f8a5f13b64..6366f02ed3 100644 --- a/99-archive/038-call-apply/article.md +++ b/99-archive/038-call-apply/article.md @@ -99,7 +99,7 @@ printArgs(1, 2, 3); ````smart header="Почему вызов сработает?" Здесь метод join массива скопирован и вызван в контексте `arguments`. Не произойдёт ли что-то плохое от того, что `arguments` -- не массив? Почему он, вообще, сработал? -Ответ на эти вопросы простой. В соответствии [со спецификацией](http://es5.github.com/x15.4.html#x15.4.4.5), внутри `join` реализован примерно так: +Ответ на эти вопросы простой. В соответствии [со спецификацией](https://es5.github.io/x15.4.html#x15.4.4.5), внутри `join` реализован примерно так: ```js function join(separator) { diff --git a/99-archive/039-decorators/article.md b/99-archive/039-decorators/article.md index 109c8e9221..f8fbf243d1 100755 --- a/99-archive/039-decorators/article.md +++ b/99-archive/039-decorators/article.md @@ -9,7 +9,7 @@ JavaScript предоставляет удивительно гибкие воз Конечно, этим нужно уметь пользоваться. В этой главе, чтобы более глубоко понимать работу с функциями, мы рассмотрим создание функций-обёрток или, иначе говоря, "декораторов". -[Декоратор](http://en.wikipedia.org/wiki/Decorator_pattern) -- приём программирования, который позволяет взять существующую функцию и изменить/расширить её поведение. +[Декоратор](https://en.wikipedia.org/wiki/Decorator_pattern) -- приём программирования, который позволяет взять существующую функцию и изменить/расширить её поведение. *Декоратор* получает функцию и возвращает обёртку, которая делает что-то своё "вокруг" вызова основной функции. diff --git a/99-archive/041-exception/article.md b/99-archive/041-exception/article.md index beb57c405d..4f0158ae9a 100644 --- a/99-archive/041-exception/article.md +++ b/99-archive/041-exception/article.md @@ -519,7 +519,7 @@ alert( func() ); // сначала finally, потом 1 Как правило, роль `window.onerror` заключается не в том, чтобы оживить скрипт -- скорее всего, это уже невозможно, а в том, чтобы отослать сообщение об ошибке на сервер, где разработчики о ней узнают. -Существуют даже специальные веб-сервисы, которые предоставляют скрипты для отлова и аналитики таких ошибок, например: или . +Существуют даже специальные веб-сервисы, которые предоставляют скрипты для отлова и аналитики таких ошибок, например: или . ## Итого From 5d1b14c3613155d3456f33316c9f4efc929b42ab Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 14:29:08 +0600 Subject: [PATCH 0357/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../042-internal-external-interface/article.md | 2 +- 99-archive/043-getters-setters/article.md | 2 +- 99-archive/048-multi-insert/insertAdjacentFF.js | 2 +- 99-archive/050-metrics/article.md | 2 +- 99-archive/054-traversing-dom/article.md | 2 +- .../article.md | 10 +++++----- 99-archive/056-events-and-timing-depth/article.md | 4 ++-- 99-archive/058-event-bubbling/article.md | 2 +- 99-archive/063-css-transitions/article.md | 10 +++++----- 99-archive/064-bezier/article.md | 12 ++++++------ 99-archive/065-websockets/article.md | 10 +++++----- 99-archive/067-xhr-resume/article.md | 2 +- 99-archive/068-xhr-onprogress/article.md | 4 ++-- 99-archive/069-xhr-crossdomain/article.md | 4 ++-- 99-archive/070-xhr-forms/article.md | 2 +- 99-archive/071-ajax-xmlhttprequest/article.md | 6 +++--- 99-archive/072-ajax-intro/article.md | 2 +- 99-archive/073-webcomponent-build/article.md | 6 +++--- 99-archive/074-css-scoping/article.md | 4 ++-- 99-archive/078-drag-and-drop/article.md | 2 +- .../079-range-textrange-selection/article.md | 8 ++++---- 99-archive/080-external-script/article.md | 2 +- 99-archive/085-ajax-nodejs/article.md | 4 ++-- 99-archive/088-es-string/article.md | 2 +- 99-archive/090-closures-module/article.md | 2 +- 99-archive/092-about-oop/article.md | 8 ++++---- 99-archive/098-drag-and-drop-plus/article.md | 2 +- 99-archive/103-memory-leaks/article.md | 2 +- 99-archive/104-memory-leaks-jquery/article.md | 6 +++--- .../106-gcc-advanced-optimization/article.md | 2 +- 99-archive/107-gcc-check-types/article.md | 2 +- 99-archive/109-tools-browser-extensions/article.md | 2 +- 99-archive/110-fiddler/article.md | 8 ++++---- 99-archive/111-ie-http-analyzer/article.md | 2 +- 99-archive/113-mousewheel/article.md | 2 +- 99-archive/115-widgets-markup/article.md | 2 +- 99-archive/116-template-lodash/article.md | 14 +++++++------- 99-archive/117-what-next/article.md | 6 +++--- 99-archive/122-minification/article.md | 2 +- 39 files changed, 84 insertions(+), 84 deletions(-) diff --git a/99-archive/042-internal-external-interface/article.md b/99-archive/042-internal-external-interface/article.md index 71dd717324..ad0be46fdf 100755 --- a/99-archive/042-internal-external-interface/article.md +++ b/99-archive/042-internal-external-interface/article.md @@ -299,7 +299,7 @@ coffeeMachine.run(); Итак, мы сделали кофеварку с публичными и приватными методами и заставили их корректно работать. -В терминологии ООП отделение и защита внутреннего интерфейса называется [инкапсуляция](http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29). +В терминологии ООП отделение и защита внутреннего интерфейса называется [инкапсуляция](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29). Кратко перечислим бонусы, которые она даёт: diff --git a/99-archive/043-getters-setters/article.md b/99-archive/043-getters-setters/article.md index 4c548362d2..e6e3583138 100755 --- a/99-archive/043-getters-setters/article.md +++ b/99-archive/043-getters-setters/article.md @@ -152,7 +152,7 @@ alert( coffeeMachine.waterAmount() ); // 450 */!* ``` -Единый геттер-сеттер используется реже, чем две отдельные функции, но в некоторых JavaScript-библиотеках, например [jQuery](http://jquery.com) и [D3](http://d3js.org), подобный подход принят на уровне концепта. +Единый геттер-сеттер используется реже, чем две отдельные функции, но в некоторых JavaScript-библиотеках, например [jQuery](https://jquery.com) и [D3](https://d3js.org), подобный подход принят на уровне концепта. ## Итого diff --git a/99-archive/048-multi-insert/insertAdjacentFF.js b/99-archive/048-multi-insert/insertAdjacentFF.js index 5d619e44bb..c4324b6358 100755 --- a/99-archive/048-multi-insert/insertAdjacentFF.js +++ b/99-archive/048-multi-insert/insertAdjacentFF.js @@ -1,4 +1,4 @@ -// http://learn.javascript.ru/files/tutorial/browser/dom/insertAdjacentFF.js +// https://learn.javascript.ru/files/tutorial/browser/dom/insertAdjacentFF.js // Добавляет поддержку insertAdjacent* в Firefox if (typeof HTMLElement != "undefined" && !HTMLElement.prototype.insertAdjacentElement) { diff --git a/99-archive/050-metrics/article.md b/99-archive/050-metrics/article.md index c6c3ad8a58..15fb1edc5e 100755 --- a/99-archive/050-metrics/article.md +++ b/99-archive/050-metrics/article.md @@ -82,7 +82,7 @@ archive: Когда браузер рисует страницу, то он высчитывает дерево расположения элементов, иначе говоря "дерево геометрии" или "дерево рендеринга", которое содержит всю информацию о размерах. -При этом одни элементы естественным образом рисуются внутри других. Но, к примеру, если у элемента стоит `position:absolute`, то его расположение вычисляется уже не относительно непосредственного родителя `parentNode`, а относительно ближайшего позиционированного элемента (т.е. свойство `position` которого не равно `static`), или `BODY`, если такой отсутствует. +При этом одни элементы естественным образом рисуются внутри других. Но, к примеру, если у элемента стоит `position:absolute`, то его расположение вычисляется уже не относительно непосредственного родителя `parentNode`, а относительно ближайшего позиционированного элемента (т.е. свойство `position` которого не равно `static`), или `BODY`, если такой отсутствует. Получается, что элемент имеет в дополнение к обычному родителю в DOM -- ещё одного "родителя по позиционированию", то есть относительно которого он рисуется. Этот элемент и будет в свойстве `offsetParent`. diff --git a/99-archive/054-traversing-dom/article.md b/99-archive/054-traversing-dom/article.md index 992d9ea1ff..4cc77026e6 100755 --- a/99-archive/054-traversing-dom/article.md +++ b/99-archive/054-traversing-dom/article.md @@ -318,7 +318,7 @@ alert( table.*!*rows[0].cells[0]*/!*.innerHTML ) // "один" ``` -Спецификация: [HTML5: tabular data](http://www.w3.org/TR/html5/tabular-data.html). +Спецификация: [HTML5: tabular data](https://html.spec.whatwg.org/multipage/tables.html). Даже если эти свойства не нужны вам прямо сейчас, имейте их в виду на будущее, когда понадобится пройтись по таблице. diff --git a/99-archive/055-attributes-and-custom-properties/article.md b/99-archive/055-attributes-and-custom-properties/article.md index fa80569ddc..480b82118f 100755 --- a/99-archive/055-attributes-and-custom-properties/article.md +++ b/99-archive/055-attributes-and-custom-properties/article.md @@ -63,7 +63,7 @@ document.body.sayHi(); // BODY, выполнилась с правильным t Эти методы работают со значением, которое находится в HTML. -Также все атрибуты элемента можно получить с помощью свойства `elem.attributes`, которое содержит псевдо-массив объектов типа [Attr](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024). +Также все атрибуты элемента можно получить с помощью свойства `elem.attributes`, которое содержит псевдо-массив объектов типа [Attr](https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024). В отличие от свойств, атрибуты: @@ -110,9 +110,9 @@ document.body.sayHi(); // BODY, выполнилась с правильным t Когда браузер читает HTML и создаёт DOM-модель, то он создаёт свойства для всех *стандартных* атрибутов. -Например, свойства тега `'A'` описаны в спецификации DOM: HTMLAnchorElement. +Например, свойства тега `'A'` описаны в спецификации DOM: HTMLAnchorElement. -Например, у него есть свойство `"href"`. Кроме того, он имеет `"id"` и другие свойства, общие для всех элементов, которые описаны в спецификации в HTMLElement. +Например, у него есть свойство `"href"`. Кроме того, он имеет `"id"` и другие свойства, общие для всех элементов, которые описаны в спецификации в HTMLElement. Все стандартные свойства DOM синхронизируются с атрибутами, однако не всегда такая синхронизация происходит 1-в-1, поэтому иногда нам нужно значение именно из HTML, то есть атрибут. @@ -137,7 +137,7 @@ document.body.sayHi(); // BODY, выполнилась с правильным t ``` -Это происходит потому, что атрибут может быть любым, а свойство `href`, в соответствии со спецификацией W3C, должно быть полной ссылкой. +Это происходит потому, что атрибут может быть любым, а свойство `href`, в соответствии со спецификацией W3C, должно быть полной ссылкой. Стало быть, если мы хотим именно то, что в HTML, то нужно обращаться через атрибут. @@ -373,7 +373,7 @@ div.classList.add('order-state-canceled'); ``` -[Стандарт HTML5](http://www.w3.org/TR/2010/WD-html5-20101019/elements.html#embedding-custom-non-visible-data-with-the-data-attributes) специально разрешает атрибуты `data-*` и резервирует их для пользовательских данных. +[Стандарт HTML5](https://www.w3.org/TR/2010/WD-html5-20101019/elements.html#embedding-custom-non-visible-data-with-the-data-attributes) специально разрешает атрибуты `data-*` и резервирует их для пользовательских данных. При этом во всех браузерах, кроме IE10-, к таким атрибутам можно обратиться не только как к атрибутам, но и как к свойствам, при помощи специального свойства `dataset`: diff --git a/99-archive/056-events-and-timing-depth/article.md b/99-archive/056-events-and-timing-depth/article.md index 5e80466cc0..21d7031b91 100755 --- a/99-archive/056-events-and-timing-depth/article.md +++ b/99-archive/056-events-and-timing-depth/article.md @@ -22,7 +22,7 @@ archive: ``` ```smart header="Web Workers" -Существует спецификация Web Workers, которая позволяет запускать дополнительные JavaScript-процессы(workers). +Существует спецификация Web Workers, которая позволяет запускать дополнительные JavaScript-процессы(workers). Они могут обмениваться сообщениями с главным процессом, но у них свои переменные, и работают они также сами по себе. @@ -166,7 +166,7 @@ archive: ## Итого -- JavaScript выполняется в едином потоке. Современные браузеры позволяют порождать подпроцессы Web Workers, они выполняются параллельно и могут отправлять/принимать сообщения, но не имеют доступа к DOM. +- JavaScript выполняется в едином потоке. Современные браузеры позволяют порождать подпроцессы Web Workers, они выполняются параллельно и могут отправлять/принимать сообщения, но не имеют доступа к DOM. - Обычно события становятся в очередь и обрабатываются в порядке поступления, асинхронно, независимо друг от друга. - Синхронными являются вложенные события, инициированные из кода. - Чтобы сделать событие гарантированно асинхронным, используется вызов через `setTimeout(func, 0)`. diff --git a/99-archive/058-event-bubbling/article.md b/99-archive/058-event-bubbling/article.md index 7f72123884..4e7168ee8b 100755 --- a/99-archive/058-event-bubbling/article.md +++ b/99-archive/058-event-bubbling/article.md @@ -126,7 +126,7 @@ archive: 2. Событие достигло целевого элемента. Это -- *"стадия цели"* (target stage). 3. После этого событие начинает всплывать. Это -- *"стадия всплытия"* (bubbling stage). -В [стандарте DOM Events 3](http://www.w3.org/TR/DOM-Level-3-Events/) это продемонстрировано так: +В [стандарте DOM Events 3](https://www.w3.org/TR/DOM-Level-3-Events/) это продемонстрировано так: ![](eventflow.png) diff --git a/99-archive/063-css-transitions/article.md b/99-archive/063-css-transitions/article.md index be92fdc96b..44159658e2 100644 --- a/99-archive/063-css-transitions/article.md +++ b/99-archive/063-css-transitions/article.md @@ -5,7 +5,7 @@ archive: # CSS-анимации -Все современные браузеры, кроме IE9- поддерживают CSS transitions и CSS animations, которые позволяют реализовать анимацию средствами CSS, без привлечения JavaScript. +Все современные браузеры, кроме IE9- поддерживают [CSS transitions](href="https://www.w3.org/TR/css3-transitions/) и [CSS animations](https://www.w3.org/TR/css3-animations/), которые позволяют реализовать анимацию средствами CSS, без привлечения JavaScript. Однако, как мы увидим далее, для более тонкого контроля анимации JavaScript вовсе не будет лишним. @@ -79,11 +79,11 @@ growing.onclick = function() { Список свойств, которые будут анимироваться, например: `left`, `margin-left`, `height`, `color`. -Анимировать можно не все свойства, но [многие](http://www.w3.org/TR/css3-transitions/#animatable-properties-). Значение `all` означает "анимировать все свойства". +Анимировать можно не все свойства, но [многие](https://www.w3.org/TR/css3-transitions/#animatable-properties-). Значение `all` означает "анимировать все свойства". ## transition-duration -Продолжительность анимации, задаётся в формате [CSS time](http://www.w3.org/TR/css3-values/#time), то есть в секундах `s` или `ms`. +Продолжительность анимации, задаётся в формате [CSS time](https://www.w3.org/TR/css3-values/#time), то есть в секундах `s` или `ms`. ## transition-delay @@ -243,7 +243,7 @@ CSS для анимации: Это, конечно, "мягкий" вариант. Если поставить значения `y` порядка `-99`, `99`, то поезд будет куда более сильно выпрыгивать за диапазон. -Итак, кривая Безье позволяет задавать "плавное"" течение анимации. Подобрать кривую Безье вручную можно на сайте . +Итак, кривая Безье позволяет задавать "плавное"" течение анимации. Подобрать кривую Безье вручную можно на сайте . ### Шаги steps @@ -401,7 +401,7 @@ CSS-анимации позволяют плавно или не очень ме Ограничения и достоинства CSS-анимаций по сравнению с JavaScript: ```compare -- Временная функция может быть задана кривой Безье или через шаги. Более сложные анимации, состоящие из нескольких кривых, реализуются их комбинацией при помощи [CSS animations](http://www.w3.org/TR/css3-animations/), но JavaScript-функции всегда гибче. +- Временная функция может быть задана кривой Безье или через шаги. Более сложные анимации, состоящие из нескольких кривых, реализуются их комбинацией при помощи [CSS animations](https://www.w3.org/TR/css3-animations/), но JavaScript-функции всегда гибче. - CSS-анимации касаются только свойств, а в JavaScript можно делать всё, что угодно, удалять элементы, создавать новые. - Отсутствует поддержка в IE9- + Простые вещи делаются просто. diff --git a/99-archive/064-bezier/article.md b/99-archive/064-bezier/article.md index 6e5723090c..bb387790b8 100755 --- a/99-archive/064-bezier/article.md +++ b/99-archive/064-bezier/article.md @@ -13,7 +13,7 @@ archive: ## Виды кривых Безье -[Кривая Безье](http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%91%D0%B5%D0%B7%D1%8C%D0%B5) задаётся опорными точками. +[Кривая Безье](https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%91%D0%B5%D0%B7%D1%8C%D0%B5) задаётся опорными точками. Их может быть две, три, четыре или больше. Например: @@ -34,7 +34,7 @@ archive: 1. **Точки не всегда на кривой.** Это совершенно нормально, как именно строится кривая мы рассмотрим чуть позже. 2. **Степень кривой равна числу точек минус один**. Для двух точек -- это линейная кривая (т.е. прямая), для трёх точек -- квадратическая кривая (парабола), для четырёх -- кубическая. -3. **Кривая всегда находится внутри [выпуклой оболочки](http://ru.wikipedia.org/wiki/%D0%92%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D0%B0%D1%8F_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B0), образованной опорными точками:** +3. **Кривая всегда находится внутри [выпуклой оболочки](https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D0%BF%D1%83%D0%BA%D0%BB%D0%B0%D1%8F_%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B0), образованной опорными точками:** ![](bezier4-e.png) ![](bezier3-e.png) @@ -85,7 +85,7 @@ archive: ## Рисование "де Кастельжо" -[Метод де Кастельжо](http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B5_%D0%9A%D0%B0%D1%81%D1%82%D0%B5%D0%BB%D1%8C%D0%B6%D0%BE) идентичен математическому определению кривой и наглядно показывает, как она строится. +[Метод де Кастельжо](https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B4%D0%B5_%D0%9A%D0%B0%D1%81%D1%82%D0%B5%D0%BB%D1%8C%D0%B6%D0%BE) идентичен математическому определению кривой и наглядно показывает, как она строится. Посмотрим его на примере трёх точек (точки можно двигать). Нажатие на кнопку "play" запустит демонстрацию. @@ -153,11 +153,11 @@ archive: ```smart header="Как провести кривую Безье *через* нужные точки?" В задаче построения кривой Безье используются "опорные точки". Они, как можно видеть из примеров выше, не лежат на кривой. Точнее говоря, только первая и последняя лежат на кривой, а промежуточные -- нет. -Иногда возникает другая задача: провести кривую именно *через нужные точки*, чтобы все они лежали на некой плавной кривой, удовлетворяющей определённым требованиям. Такая задача называется [интерполяцией](http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D1%8F), и здесь мы её не рассматриваем. +Иногда возникает другая задача: провести кривую именно *через нужные точки*, чтобы все они лежали на некой плавной кривой, удовлетворяющей определённым требованиям. Такая задача называется [интерполяцией](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D1%8F), и здесь мы её не рассматриваем. -Существуют математические формулы для таких построений, например [многочлен Лагранжа](http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD_%D0%9B%D0%B0%D0%B3%D1%80%D0%B0%D0%BD%D0%B6%D0%B0). +Существуют математические формулы для таких построений, например [многочлен Лагранжа](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D0%BE%D0%BB%D1%8F%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%87%D0%BB%D0%B5%D0%BD_%D0%9B%D0%B0%D0%B3%D1%80%D0%B0%D0%BD%D0%B6%D0%B0). -Как правило, в компьютерной графике для построения плавных кривых, проходящих через несколько точек, используют кубические кривые, плавно переходящие одна в другую. Это называется [интерполяция сплайнами](http://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%B1%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BF%D0%BB%D0%B0%D0%B9%D0%BD). +Как правило, в компьютерной графике для построения плавных кривых, проходящих через несколько точек, используют кубические кривые, плавно переходящие одна в другую. Это называется [интерполяция сплайнами](https://ru.wikipedia.org/wiki/%D0%9A%D1%83%D0%B1%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BF%D0%BB%D0%B0%D0%B9%D0%BD). ``` ## Итого diff --git a/99-archive/065-websockets/article.md b/99-archive/065-websockets/article.md index 528169c36d..afe770dfcc 100755 --- a/99-archive/065-websockets/article.md +++ b/99-archive/065-websockets/article.md @@ -5,7 +5,7 @@ archive: # WebSocket -Протокол `WebSocket` (стандарт [RFC 6455](http://tools.ietf.org/html/rfc6455)) предназначен для решения любых задач и снятия ограничений обмена данными между браузером и сервером. +Протокол `WebSocket` (стандарт [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455)) предназначен для решения любых задач и снятия ограничений обмена данными между браузером и сервером. Он позволяет пересылать любые данные, на любой домен, безопасно и почти без лишнего сетевого трафика. @@ -96,7 +96,7 @@ Origin : Протокол, домен и порт, откуда отправлен запрос. Sec-WebSocket-Key -: Случайный ключ, который генерируется браузером: 16 байт в кодировке [Base64](http://ru.wikipedia.org/wiki/Base64). +: Случайный ключ, который генерируется браузером: 16 байт в кодировке [Base64](https://ru.wikipedia.org/wiki/Base64). Sec-WebSocket-Version : Версия протокола. Текущая версия: 13. @@ -130,7 +130,7 @@ Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g= - Заголовок `Sec-WebSocket-Extensions: deflate-frame` означает, что браузер поддерживает модификацию протокола, обеспечивающую сжатие данных. Это говорит не о самих данных, а об улучшении способа их передачи. Браузер сам формирует этот заголовок. -- Заголовок `Sec-WebSocket-Protocol: soap, wamp` говорит о том, что по WebSocket браузер собирается передавать не просто какие-то данные, а данные в протоколах [SOAP](http://ru.wikipedia.org/wiki/SOAP) или WAMP ("The WebSocket Application Messaging Protocol"). Стандартные подпротоколы регистрируются в специальном каталоге [IANA](http://www.iana.org/assignments/websocket/websocket.xml). +- Заголовок `Sec-WebSocket-Protocol: soap, wamp` говорит о том, что по WebSocket браузер собирается передавать не просто какие-то данные, а данные в протоколах [SOAP](https://ru.wikipedia.org/wiki/SOAP) или WAMP ("The WebSocket Application Messaging Protocol"). Стандартные подпротоколы регистрируются в специальном каталоге [IANA](https://www.iana.org/assignments/websocket/websocket.xml). Этот заголовок браузер поставит, если указать второй необязательный параметр `WebSocket`: @@ -185,7 +185,7 @@ Sec-WebSocket-Protocol: soap ## Формат данных -Полное описание протокола содержится в [RFC 6455](http://tools.ietf.org/html/rfc6455). +Полное описание протокола содержится в [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455). Здесь представлено частичное описание с комментариями самых важных его частей. Если вы хотите понять стандарт, то рекомендуется сначала прочитать это описание. @@ -481,6 +481,6 @@ WebSocket -- современное средство коммуникации. Есть и готовые библиотеки, реализующие функциональность COMET с использованием сразу нескольких транспортов, из которых вебсокет имеет приоритет. Как правило, библиотеки состоят из двух частей: клиентской и серверной. -Например, для Node.JS одной из самых известных библиотек является [Socket.IO](http://socket.io). +Например, для Node.JS одной из самых известных библиотек является [Socket.IO](https://socket.io). К недостаткам библиотек следует отнести то, что некоторые продвинутые возможности WebSocket, такие как двухсторонний обмен бинарными данными, в них недоступны. С другой -- в большинстве случаев стандартного текстового обмена вполне достаточно. diff --git a/99-archive/067-xhr-resume/article.md b/99-archive/067-xhr-resume/article.md index 429841cc87..e6b9c4bb25 100755 --- a/99-archive/067-xhr-resume/article.md +++ b/99-archive/067-xhr-resume/article.md @@ -17,7 +17,7 @@ archive: Есть же `xhr.upload.onprogress` -- ставим на него обработчик, по свойству `loaded` события `onprogress` смотрим, сколько байт загрузилось. А при обрыве -- возобновляем загрузку с последнего байта. -К счастью, отослать на сервер не весь файл, а только нужную часть его -- не проблема, [File API](http://www.w3.org/TR/FileAPI/) позволяет прочитать выбранный участок из файла и отправить его. +К счастью, отослать на сервер не весь файл, а только нужную часть его -- не проблема, [File API](https://www.w3.org/TR/FileAPI/) позволяет прочитать выбранный участок из файла и отправить его. Примерно так: diff --git a/99-archive/068-xhr-onprogress/article.md b/99-archive/068-xhr-onprogress/article.md index 84762039d2..3cb60ec83c 100755 --- a/99-archive/068-xhr-onprogress/article.md +++ b/99-archive/068-xhr-onprogress/article.md @@ -62,7 +62,7 @@ xhr.onprogress = function(event) { Современный `XMLHttpRequest` позволяет отправить на сервер всё, что угодно. Текст, файл, форму. -Мы, для примера, рассмотрим загрузку файла с индикацией прогресса. Это требует от браузера поддержки [File API](http://www.w3.org/TR/FileAPI/), то есть исключает IE9-. +Мы, для примера, рассмотрим загрузку файла с индикацией прогресса. Это требует от браузера поддержки [File API](https://www.w3.org/TR/FileAPI/), то есть исключает IE9-. File API позволяет получить доступ к содержимому файла, который перенесён в браузер при помощи Drag'n'Drop или выбран в поле формы, и отправить его при помощи `XMLHttpRequest`. @@ -152,7 +152,7 @@ function upload(file) { - **Событие происходит при каждом полученном/отправленном байте, но не чаще чем раз в 50 мс.** - Это обозначено в [спецификации progress notifications](http://www.w3.org/TR/XMLHttpRequest/#make-progress-notifications). + Это обозначено в [спецификации progress notifications](https://www.w3.org/TR/XMLHttpRequest/#make-progress-notifications). - **В процессе получения данных, ещё до их полной передачи, доступен `xhr.responseText`, но он не обязательно содержит корректную строку.** Можно до окончания запроса заглянуть в него и прочитать текущие полученные данные. Важно, что при пересылке строки в кодировке UTF-8 кириллические символы, как, впрочем, и многие другие, кодируются 2 байтами. Возможно, что в конце одного пакета данных окажется первая половинка символа, а в начале следующего -- вторая. Поэтому полагаться на то, что до окончания запроса в `responseText` находится корректная строка нельзя. Она может быть обрезана посередине символа. diff --git a/99-archive/069-xhr-crossdomain/article.md b/99-archive/069-xhr-crossdomain/article.md index 523075c3fc..c3728ac5b4 100755 --- a/99-archive/069-xhr-crossdomain/article.md +++ b/99-archive/069-xhr-crossdomain/article.md @@ -7,7 +7,7 @@ archive: Обычно запрос `XMLHttpRequest` может делать запрос только в рамках текущего сайта. При попытке использовать другой домен/порт/протокол -- браузер выдаёт ошибку. -Существует современный стандарт [XMLHttpRequest](http://www.w3.org/TR/XMLHttpRequest/), он ещё в состоянии черновика, но предусматривает кросс-доменные запросы и многое другое. +Существует современный стандарт [XMLHttpRequest](https://www.w3.org/TR/XMLHttpRequest/), он ещё в состоянии черновика, но предусматривает кросс-доменные запросы и многое другое. Большинство возможностей этого стандарта уже поддерживаются всеми браузерами, но увы, не в IE9-. @@ -145,7 +145,7 @@ Access-Control-Allow-Origin: http://javascript.ru - Нельзя включить передачу кук и данных HTTP-авторизации. - В IE8 в режиме просмотра InPrivate кросс-доменные запросы не работают. -Современный стандарт [XMLHttpRequest](http://www.w3.org/TR/XMLHttpRequest/) предусматривает средства для преодоления этих ограничений, но на момент выхода IE8 они ещё не были проработаны, поэтому их не реализовали. А IE9 исправил некоторые ошибки, но в общем не добавил ничего нового. +Современный стандарт [XMLHttpRequest](https://www.w3.org/TR/XMLHttpRequest/) предусматривает средства для преодоления этих ограничений, но на момент выхода IE8 они ещё не были проработаны, поэтому их не реализовали. А IE9 исправил некоторые ошибки, но в общем не добавил ничего нового. Поэтому на сайтах, которые хотят поддерживать IE9-, то на практике кросс-доменные запросы редко используют, предпочитая другие способы кросс-доменной коммуникации. Например, динамически создаваемый тег `SCRIPT` или вспомогательный `IFRAME` с другого домена. Мы разберём эти подходы в последующих главах. diff --git a/99-archive/070-xhr-forms/article.md b/99-archive/070-xhr-forms/article.md index 9815aec2a4..0b5ca85dbb 100644 --- a/99-archive/070-xhr-forms/article.md +++ b/99-archive/070-xhr-forms/article.md @@ -129,7 +129,7 @@ xhr.send(body); ## Кодировка multipart/form-data -Кодировка urlencoded за счёт замены символов на `%код` может сильно "раздуть" общий объём пересылаемых данных. Поэтому для пересылки файлов используется другая кодировка: [multipart/form-data](http://ru.wikipedia.org/wiki/Multipart_form-data). +Кодировка urlencoded за счёт замены символов на `%код` может сильно "раздуть" общий объём пересылаемых данных. Поэтому для пересылки файлов используется другая кодировка: [multipart/form-data](https://ru.wikipedia.org/wiki/Multipart_form-data). В этой кодировке поля пересылаются одно за другим, через строку-разделитель. diff --git a/99-archive/071-ajax-xmlhttprequest/article.md b/99-archive/071-ajax-xmlhttprequest/article.md index d135fc655f..231e1824a8 100755 --- a/99-archive/071-ajax-xmlhttprequest/article.md +++ b/99-archive/071-ajax-xmlhttprequest/article.md @@ -177,7 +177,7 @@ button.disabled = true; В примере выше мы использовали только состояние `4` (запрос завершён), но есть и другие. -Все состояния, по [спецификации](http://www.w3.org/TR/XMLHttpRequest/#states): +Все состояния, по [спецификации](https://www.w3.org/TR/XMLHttpRequest/#states): ```js const unsigned short UNSENT = 0; // начальное состояние @@ -219,7 +219,7 @@ const unsigned short DONE = 4; // запрос завершён ``` ```warn header="Ограничения на заголовки" -Нельзя установить заголовки, которые контролирует браузер, например `Referer` или `Host` и ряд других (полный список [тут](http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method)). +Нельзя установить заголовки, которые контролирует браузер, например `Referer` или `Host` и ряд других (полный список [тут](https://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method)). Это ограничение существует в целях безопасности и для контроля корректности запроса. ``` @@ -281,7 +281,7 @@ xhr.ontimeout = function() { ## Полный список событий -Современная [спецификация](http://www.w3.org/TR/XMLHttpRequest/#events) предусматривает следующие события по ходу обработки запроса: +Современная [спецификация](https://www.w3.org/TR/XMLHttpRequest/#events) предусматривает следующие события по ходу обработки запроса: - `loadstart` -- запрос начат. - `progress` -- браузер получил очередной пакет данных, можно прочитать текущие полученные данные в `responseText`. diff --git a/99-archive/072-ajax-intro/article.md b/99-archive/072-ajax-intro/article.md index be1c684ba1..7198e3fab4 100755 --- a/99-archive/072-ajax-intro/article.md +++ b/99-archive/072-ajax-intro/article.md @@ -75,7 +75,7 @@ AJAX (аббревиатура от "Asynchronous J` (он же `this`) и отдаём библиотеке. Она делает всю работу. +2. Используя jQuery UI, слайдер создаётся вызовом [jQuery UI методом slider](https://jqueryui.com/slider/), который имеет вид `$elem.slider({...параметры...});`. Параметры получаем из атрибутов `` (он же `this`) и отдаём библиотеке. Она делает всю работу. 3. Параметр `slide` задаёт функцию-колбэк, которая вызывается при передвижении слайдера и будет генерировать DOM-событие на элементе, на которое можно будет поставить обработчик при помощи `addEventListener`. В его деталях мы указываем новое значение слайдера. Полный код с примером: @@ -254,7 +254,7 @@ Object.defineProperty(SliderProto, 'value', { Чтобы понять, почему это происходит, я заглянул в исходники jQuery UI и, после отладки происходящего, натолкнулся на проблемный код. -Он был в методе [offset](http://api.jquery.com/offset/), который предназначен для того, чтобы определять координаты элемента. Этот метод не срабатывал, поскольку в нём есть проверка, которая выглядит примерно так: +Он был в методе [offset](https://api.jquery.com/offset/), который предназначен для того, чтобы определять координаты элемента. Этот метод не срабатывал, поскольку в нём есть проверка, которая выглядит примерно так: ```js var box = { diff --git a/99-archive/074-css-scoping/article.md b/99-archive/074-css-scoping/article.md index 92189a61af..2e5ba66d00 100755 --- a/99-archive/074-css-scoping/article.md +++ b/99-archive/074-css-scoping/article.md @@ -6,7 +6,7 @@ archive: # Стили и селекторы -Стилизация Shadow DOM покрывается более общей спецификацией ["CSS Scoping"](http://drafts.csswg.org/css-scoping/). +Стилизация Shadow DOM покрывается более общей спецификацией ["CSS Scoping"](https://drafts.csswg.org/css-scoping/). По умолчанию стили внутри Shadow DOM относятся только к его содержимому. @@ -273,7 +273,7 @@ elems[1].createShadowRoot().appendChild( tmpl.content.cloneNode(true) ); Текст внутри `

    ` -- зелёный и подчёркнутый одновременно, но стилизуется именно тот ``, который показан в ``, а тот, который просто в Shadow DOM -- нет. -Приоритет селекторов рассчитывается по [обычным правилам специфичности](http://www.w3.org/TR/css3-selectors/#specificity), если же приоритеты стилей на странице и в Shadow DOM равны, то, как описано в секции [Cascading](http://dev.w3.org/csswg/css-scoping/#cascading), побеждает страница, а для `!important`-стиля побеждает Shadow DOM. +Приоритет селекторов рассчитывается по [обычным правилам специфичности](https://www.w3.org/TR/selectors-3/#specificity), если же приоритеты стилей на странице и в Shadow DOM равны, то, как описано в секции [Cascading](https://drafts.csswg.org/css-scoping/#cascading), побеждает страница, а для `!important`-стиля побеждает Shadow DOM. ## Итого diff --git a/99-archive/078-drag-and-drop/article.md b/99-archive/078-drag-and-drop/article.md index 43ff009242..3093a4776a 100644 --- a/99-archive/078-drag-and-drop/article.md +++ b/99-archive/078-drag-and-drop/article.md @@ -11,7 +11,7 @@ Drag'n'Drop -- это возможность захватить мышью эл ## Отличия от HTML5 Drag'n'Drop -В современном стандарте HTML5 есть поддержка Drag'n'Drop при помощи [специальных событий](http://www.html5rocks.com/en/tutorials/dnd/basics/). +В современном стандарте HTML5 есть поддержка Drag'n'Drop при помощи [специальных событий](https://web.dev/drag-and-drop/). Эти события поддерживаются всеми современными браузерами, и у них есть свои интересные особенности, например, можно перетащить файл в браузер, так что JS получит доступ к его содержимому. Они заслуживают отдельного рассмотрения. diff --git a/99-archive/079-range-textrange-selection/article.md b/99-archive/079-range-textrange-selection/article.md index c6407a0817..16398c5284 100644 --- a/99-archive/079-range-textrange-selection/article.md +++ b/99-archive/079-range-textrange-selection/article.md @@ -11,7 +11,7 @@ archive: ## Range -`Range` -- это объект, соответствующий фрагменту документа, который может включать узлы и участки текста из этого документа. Наиболее подробно объект `Range` описан в спецификации [DOM Range](http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html). +`Range` -- это объект, соответствующий фрагменту документа, который может включать узлы и участки текста из этого документа. Наиболее подробно объект `Range` описан в спецификации [DOM Range](https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html). Чтобы понять о чем речь, обратимся к самому простому случаю `Range`, который будет подробно рассмотрен ниже -- к выделениям. В приводимом ниже примере выделите несколько слов в предложении. Будет выводиться текстовое содержимое выделяемой области: @@ -33,7 +33,7 @@ archive: Если контейнер является текстовым узлом, то смещение определяется в символах от начала DOM-узла. Если контейнер является элементом (`Document`, `DocumentFragment`, `Element`...), то смещение определяется в дочерних узлах. -Смотрим на иллюстрацию ([источник](http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint)): +Смотрим на иллюстрацию ([источник](https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#td-boundarypoint)): ![|alt="Пример Range"](56.gif) @@ -80,7 +80,7 @@ HTML: [iframe border="1" src="domRangeCreate" edit link] -Рассмотрим вкратце [свойства и методы Range](http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Interface): +Рассмотрим вкратце [свойства и методы Range](https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Interface): - Свойство `commonAncestorContainer` вернёт ссылку на наиболее вложенный корневой контейнер. - Свойство `startContainer` (`endContainer`) вернёт ссылку на контейнер верхней (нижней) граничной точки. @@ -361,7 +361,7 @@ function clearSelection() { ## Итого -- В современных браузерах поддерживается стандартный объект [Range](http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html) +- В современных браузерах поддерживается стандартный объект [Range](https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html) - В IE8- поддерживается только собственный объект [TextRange](http://help.dottoro.com/ljgbbkjf.php). Есть библиотеки, которые "исправляют" объект `TextRange`, добавляя ему нужные свойства из `Range`. diff --git a/99-archive/080-external-script/article.md b/99-archive/080-external-script/article.md index 2b4ab634fa..815751e778 100755 --- a/99-archive/080-external-script/article.md +++ b/99-archive/080-external-script/article.md @@ -34,7 +34,7 @@ archive: ```smart Как правило, в HTML пишут только самые простые скрипты, а сложные выносят в отдельный файл. -Браузер скачает его только первый раз и в дальнейшем, при правильной настройке сервера, будет брать из своего [кеша](http://ru.wikipedia.org/wiki/%D0%9A%D1%8D%D1%88). +Браузер скачает его только первый раз и в дальнейшем, при правильной настройке сервера, будет брать из своего [кеша](https://ru.wikipedia.org/wiki/%D0%9A%D1%8D%D1%88). Благодаря этому один и тот же большой скрипт, содержащий, к примеру, библиотеку функций, может использоваться на разных страницах без полной перезагрузки с сервера. ``` diff --git a/99-archive/085-ajax-nodejs/article.md b/99-archive/085-ajax-nodejs/article.md index eb6e3b4086..0e1ca4990c 100755 --- a/99-archive/085-ajax-nodejs/article.md +++ b/99-archive/085-ajax-nodejs/article.md @@ -7,7 +7,7 @@ archive: В этом разделе предлагаются задачи по теме AJAX. -Конечно же, они требуют взаимодействия с сервером. Мы будем использовать серверную часть, написанную на JavaScript, на Node.JS. +Конечно же, они требуют взаимодействия с сервером. Мы будем использовать серверную часть, написанную на JavaScript, на Node.JS. Если вы не использовали Node.JS ранее -- не беспокойтесь. Здесь нашей целью является преимущественно клиентская часть, поэтому прямо сейчас изучать Node.JS не обязательно. Серверные скрипты уже готовы. Нужно только поставить Node.JS и модули, чтобы их запускать. @@ -19,7 +19,7 @@ archive: Если у вас Unix-система -- рекомендуется собрать последнюю версию из исходников, а также NPM. Вы справитесь. - Если Windows -- посетите сайт http://nodejs.org или скачайте установщик (32 или 64-битный) с расширением `.msi` из http://nodejs.org/dist/latest/. + Если Windows -- посетите сайт [https://nodejs.org](https://nodejs.org) или скачайте установщик (32 или 64-битный) с расширением `.msi` из [https://nodejs.org/dist/latest/](https://nodejs.org/dist/latest/). 2. Выберите директорию, в которой будете решать задачи. Запустите в ней: ``` diff --git a/99-archive/088-es-string/article.md b/99-archive/088-es-string/article.md index 7942b771a6..0347999996 100644 --- a/99-archive/088-es-string/article.md +++ b/99-archive/088-es-string/article.md @@ -279,7 +279,7 @@ alert( "S\u0307\u0323" == "S\u0323\u0307" ); // false alert( "S\u0307\u0323".normalize() == "S\u0323\u0307".normalize() ); // true ``` -Забавно, что в данной конкретной ситуации `normalize()` приведёт последовательность из трёх символов к одному: [\u1e68 (S с двумя точками)](http://www.fileformat.info/info/unicode/char/1e68/index.htm). +Забавно, что в данной конкретной ситуации `normalize()` приведёт последовательность из трёх символов к одному: [\u1e68 (S с двумя точками)](https://www.fileformat.info/info/unicode/char/1e68/index.htm). ```js run alert( "S\u0307\u0323".normalize().length ); // 1, нормализовало в один символ diff --git a/99-archive/090-closures-module/article.md b/99-archive/090-closures-module/article.md index ee9b3eb051..0a585f168a 100644 --- a/99-archive/090-closures-module/article.md +++ b/99-archive/090-closures-module/article.md @@ -152,7 +152,7 @@ function work() { Ведь что такое библиотека? Это полезные функции, ради которых её подключают, плюс временные переменные и вспомогательные функции, которые библиотека использует внутри себя. -Посмотрим, к примеру, на библиотеку [Lodash](http://lodash.com/), хотя могли бы и [jQuery](http://jquery.com/), там почти то же самое. +Посмотрим, к примеру, на библиотеку [Lodash](https://lodash.com/), хотя могли бы и [jQuery](https://jquery.com/), там почти то же самое. Если её подключить, то появится специальная переменная `lodash` (короткое имя `_`), которую можно использовать как функцию, и кроме того в неё записаны различные полезные свойства, например: diff --git a/99-archive/092-about-oop/article.md b/99-archive/092-about-oop/article.md index fc4ff34935..89677c727e 100755 --- a/99-archive/092-about-oop/article.md +++ b/99-archive/092-about-oop/article.md @@ -5,9 +5,9 @@ archive: # Введение -На протяжении долгого времени в программировании применялся [процедурный подход](http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5). При этом программа состоит из функций, вызывающих друг друга. +На протяжении долгого времени в программировании применялся [процедурный подход](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5). При этом программа состоит из функций, вызывающих друг друга. -Гораздо позже появилось [объектно-ориентированное программирование](http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) (ООП), которое позволяет группировать функции и данные в единой сущности -- "объекте". +Гораздо позже появилось [объектно-ориентированное программирование](https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) (ООП), которое позволяет группировать функции и данные в единой сущности -- "объекте". При объектно-ориентированной разработке мы описываем происходящее на уровне объектов, которые создаются, меняют свои свойства, взаимодействуют друг с другом и (в случае браузера) со страницей, в общем, живут. @@ -48,9 +48,9 @@ vasya.sayHi(); // пользователь умеет говорить "Прив По приёмам объектно-ориентированной разработки пишут книги, к примеру: -- Объектно-ориентированный анализ и проектирование с примерами приложений. +- Объектно-ориентированный анализ и проектирование с примерами приложений. Гради Буч и др.. -- Приёмы объектно-ориентированного проектирования. Паттерны проектирования. +- Приёмы объектно-ориентированного проектирования. Паттерны проектирования. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Здесь мы не имеем возможности углубиться в теорию ООП, поэтому чтение таких книг рекомендуется. Хотя основные принципы, как использовать ООП правильно, мы, всё же, затронем. \ No newline at end of file diff --git a/99-archive/098-drag-and-drop-plus/article.md b/99-archive/098-drag-and-drop-plus/article.md index c423ba515a..f871f53efe 100755 --- a/99-archive/098-drag-and-drop-plus/article.md +++ b/99-archive/098-drag-and-drop-plus/article.md @@ -40,7 +40,7 @@ libs: : Зона-цель, на которую можно положить. В процессе переноса аватара над ней умеет рисовать на себе предполагаемое "место приземления". Обрабатывает окончание переноса. `dragManager` -: Единый объект, который стоит над всеми ними, ставит обработчики `mousedown/mousemove/mouseup` и управляет процессом. В терминах ООП, это не класс, а [объект-синглтон](http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29), поэтому он с маленькой буквы. +: Единый объект, который стоит над всеми ними, ставит обработчики `mousedown/mousemove/mouseup` и управляет процессом. В терминах ООП, это не класс, а [объект-синглтон](https://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29), поэтому он с маленькой буквы. На макете страницы ниже возможен перенос студентов из левого списка -- вправо, в одну из команд или в "корзину": diff --git a/99-archive/103-memory-leaks/article.md b/99-archive/103-memory-leaks/article.md index b73ffc929a..87456685b2 100644 --- a/99-archive/103-memory-leaks/article.md +++ b/99-archive/103-memory-leaks/article.md @@ -139,7 +139,7 @@ function empty(elem) { Если идёт доступ к табличным коллекциям и регулярное обновление таблиц при помощи DOM-методов -- утечка в IE8 будет расти. -Более подробно вы можете почитать об этой утечке в статье [Утечки памяти в IE8, или страшная сказка со счастливым концом](http://habrahabr.ru/post/141451/). +Более подробно вы можете почитать об этой утечке в статье [Утечки памяти в IE8, или страшная сказка со счастливым концом](https://habr.com/ru/post/141451/). ### Утечка через XmlHttpRequest в IE8- diff --git a/99-archive/104-memory-leaks-jquery/article.md b/99-archive/104-memory-leaks-jquery/article.md index b3b1f91841..e76785a42b 100644 --- a/99-archive/104-memory-leaks-jquery/article.md +++ b/99-archive/104-memory-leaks-jquery/article.md @@ -6,7 +6,7 @@ archive: # Утечки памяти при использовании jQuery -В jQuery для хранения обработчиков событий и других вспомогательных данных, связанных с DOM-элементами, используется внутренний объект, который в jQuery 1 доступен через $.data. +В jQuery для хранения обработчиков событий и других вспомогательных данных, связанных с DOM-элементами, используется внутренний объект, который в jQuery 1 доступен через [$.data](https://api.jquery.com/jQuery.data/). В jQuery 2 доступ к нему закрыт через замыкание, он стал локальной переменной внутри jQuery с именем `data_priv`, но в остальном всё работает точно так, как описано, и с теми же последствиями. @@ -107,7 +107,7 @@ function leak() { Чтобы избежать утечек, описанных выше, для удаления элементов используйте функции jQuery API, а не чистый JavaScript. -Методы remove(), empty() и html() проверяют дочерние элементы на наличие данных и очищают их. Это несколько замедляет процедуру удаления, но зато освобождается память. +Методы remove(), empty() и html() проверяют дочерние элементы на наличие данных и очищают их. Это несколько замедляет процедуру удаления, но зато освобождается память. К счастью обнаружить такие утечки легко. Проверьте размер `$.cache`. Если он большой и растёт, то изучите кэш, посмотрите, какие записи остаются и почему. @@ -123,7 +123,7 @@ function leak() { Но jQuery-то об этом не знает! -Чтобы "грязно" удалить элемент, без чистки, мы можем сделать это через "обычные" DOM-вызовы или воспользоваться методом detach(). Его официальное назначение -- в том, чтобы убрать элемент из DOM, но сохранить возможность для вставки (и, соответственно, оставить на нём все данные). А неофициальное -- быстро убрать элемент из DOM, без чистки. +Чтобы "грязно" удалить элемент, без чистки, мы можем сделать это через "обычные" DOM-вызовы или воспользоваться методом detach(). Его официальное назначение -- в том, чтобы убрать элемент из DOM, но сохранить возможность для вставки (и, соответственно, оставить на нём все данные). А неофициальное -- быстро убрать элемент из DOM, без чистки. Возможен и промежуточный вариант: никто не мешает сделать `elem.detach()` и поместить вызов `elem.remove()` в `setTimeout`. В результате очистка будет происходить асинхронно и незаметно. diff --git a/99-archive/106-gcc-advanced-optimization/article.md b/99-archive/106-gcc-advanced-optimization/article.md index 294ac22937..be4660c1c2 100755 --- a/99-archive/106-gcc-advanced-optimization/article.md +++ b/99-archive/106-gcc-advanced-optimization/article.md @@ -510,7 +510,7 @@ Google Closure Compiler не только разобрался в структу Отказ от сохранения внешней ссылочной целостности с одной стороны позволяет увеличить уровень сжатия, но требует поддержки со стороны разработчика. -Основная проблема этого сжатия -- усложнение разработки. Добавляется дополнительный уровень возможных проблем: сжатие. Конечно, можно отлаживать и сжатый код, для этого придуманы [Source Maps](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/), но клиентская разработка и без того достаточно сложна. +Основная проблема этого сжатия -- усложнение разработки. Добавляется дополнительный уровень возможных проблем: сжатие. Конечно, можно отлаживать и сжатый код, для этого придуманы [Source Maps](https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/), но клиентская разработка и без того достаточно сложна. Поэтому его используют редко. diff --git a/99-archive/107-gcc-check-types/article.md b/99-archive/107-gcc-check-types/article.md index 17e3e5d114..7e5819b123 100755 --- a/99-archive/107-gcc-check-types/article.md +++ b/99-archive/107-gcc-check-types/article.md @@ -178,4 +178,4 @@ required: (Object|null|undefined) С ней аннотации, документирующие типы и параметры, становятся не просто украшением, а реальным средством проверки, уменьшающим количество ошибок на production. -Очень подробно проверка типов описана в книге [Closure: The Definitive Guide](http://www.ozon.ru/context/detail/id/6089988/), автора Michael Bolin. +Очень подробно проверка типов описана в книге [Closure: The Definitive Guide](https://www.ozon.ru/context/detail/id/6089988/), автора Michael Bolin. diff --git a/99-archive/109-tools-browser-extensions/article.md b/99-archive/109-tools-browser-extensions/article.md index 816a492fb0..9b32418fb6 100755 --- a/99-archive/109-tools-browser-extensions/article.md +++ b/99-archive/109-tools-browser-extensions/article.md @@ -51,7 +51,7 @@ FireQuery Firebug Autocompleter : Включает автодополнение для консоли, когда она в многострочном режиме. -[CSS-X-Fire](http://code.google.com/p/css-x-fire/) +[CSS-X-Fire](https://code.google.com/p/css-x-fire/) : Позволяет редактировать CSS в Firebug и сохранять изменения, интегрировано с редакторами от JetBrains (IntelliJ IDEA и другие). ## JsonView (FF,Ch) diff --git a/99-archive/110-fiddler/article.md b/99-archive/110-fiddler/article.md index 3182bfd061..aaed4b5374 100755 --- a/99-archive/110-fiddler/article.md +++ b/99-archive/110-fiddler/article.md @@ -32,7 +32,7 @@ Fiddler можно расширять с помощью скриптов на я Чтобы сделать возможной подключение внешних браузеров, нужно включить настройках Fiddler: Tools -> Fiddler Options -> Connections(вкладка) галочку "Allow remote clients to connect". После этого Fiddler станет доступен как прокси на интерфейсе `0.0.0.0`, так что можно будет браузеру из внешней ОС указать в качестве прокси виртуальную машину. И пользоваться Fiddler. -Если вы так захотите поступить, то вдобавок возьмите удобный переключатель прокси, например Elite Proxy Switcher под Firefox или [Proxy Pick](http://www.bayden.com/ietoys/) для IE, чтобы переключение на прокси осуществлялось в один клик. +Если вы так захотите поступить, то вдобавок возьмите удобный переключатель прокси, например Elite Proxy Switcher под Firefox или [Proxy Pick](https://www.bayden.com/ietoys/) для IE, чтобы переключение на прокси осуществлялось в один клик. ## Операции над запросами @@ -91,8 +91,8 @@ Fiddler является прокси, а HTTPS шифруется от брау ## Скачать -Fiddler можно бесплатно скачать с сайта разработчика. Там же доступна документация и видео. +Fiddler можно бесплатно скачать с [сайта разработчика](http://www.fiddler2.com/fiddler2/). Там же доступна [документация и видео](http://www.fiddler2.com/Fiddler/help/). -К фиддлеру прилагается галерея расширений http://www.fiddlertool.com/fiddler2/extensions.asp. +К фиддлеру прилагается галерея расширений [http://www.fiddlertool.com/fiddler2/extensions.asp](http://www.fiddlertool.com/fiddler2/extensions.asp). -Примеры скриптов для Fiddler, которые дают общее представление о том, на что он может быть способен: http://www.fiddlertool.com/fiddler/dev/scriptsamples.asp. \ No newline at end of file +Примеры скриптов для Fiddler, которые дают общее представление о том, на что он может быть способен: [http://www.fiddlertool.com/fiddler/dev/scriptsamples.asp](http://www.fiddlertool.com/fiddler/dev/scriptsamples.asp). \ No newline at end of file diff --git a/99-archive/111-ie-http-analyzer/article.md b/99-archive/111-ie-http-analyzer/article.md index b016ad2eb9..d8331bae0f 100755 --- a/99-archive/111-ie-http-analyzer/article.md +++ b/99-archive/111-ie-http-analyzer/article.md @@ -44,4 +44,4 @@ IE HTTP Analyzer -- платный, и имеет две ипостаси. Программа платная. -Живёт на http://www.ieinspector.com/httpanalyzer/. \ No newline at end of file +Живёт на [https://www.ieinspector.com/httpanalyzer/](https://www.ieinspector.com/httpanalyzer/). \ No newline at end of file diff --git a/99-archive/113-mousewheel/article.md b/99-archive/113-mousewheel/article.md index ecb3b6100b..9c5b3962a1 100755 --- a/99-archive/113-mousewheel/article.md +++ b/99-archive/113-mousewheel/article.md @@ -20,7 +20,7 @@ archive: ## Зоопарк wheel в разных браузерах -Событие `wheel` появилось в [стандарте](http://www.w3.org/TR/DOM-Level-3-Events/#event-type-wheel) не так давно. Оно поддерживается Chrome 31+, IE9+, Firefox 17+. +Событие `wheel` появилось в [стандарте](https://www.w3.org/TR/DOM-Level-3-Events/#event-type-wheel) не так давно. Оно поддерживается Chrome 31+, IE9+, Firefox 17+. До него браузеры обрабатывали прокрутку при помощи событий [mousewheel](http://msdn.microsoft.com/en-us/library/ie/ms536951.aspx) (все кроме Firefox) и [DOMMouseScroll](https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/DOMMouseScroll), [MozMousePixelScroll](https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/MozMousePixelScroll) (только Firefox). diff --git a/99-archive/115-widgets-markup/article.md b/99-archive/115-widgets-markup/article.md index 2085f649fa..2bbfa4bb35 100755 --- a/99-archive/115-widgets-markup/article.md +++ b/99-archive/115-widgets-markup/article.md @@ -194,7 +194,7 @@ HTML-разметка и названия CSS-классов должны отр Можно как взять часть идеологии, например систему именования классов, так и полностью перейти на инструментарий БЭМ, который даёт инструменты сборки для HTML/JS/CSS, описанных по БЭМ-методу. -Более подробное описание основ БЭМ можно почитать в статье , а о системе вообще -- на сайте . +Более подробное описание основ БЭМ можно почитать в статье , а о системе вообще -- на сайте . ## Итого diff --git a/99-archive/116-template-lodash/article.md b/99-archive/116-template-lodash/article.md index f184603cca..7b85b9d8cc 100755 --- a/99-archive/116-template-lodash/article.md +++ b/99-archive/116-template-lodash/article.md @@ -83,7 +83,7 @@ function Menu(options) { Как видно, это обычный HTML, с вставками вида `<% ... %>`. -Для работы с таким шаблоном используется специальная функция `_.template`, которая предоставляется фреймворком [LoDash](http://lodash.com/docs#template), её синтаксис мы подробно посмотрим далее. +Для работы с таким шаблоном используется специальная функция `_.template`, которая предоставляется фреймворком [Lodash](https://lodash.com/docs#template), её синтаксис мы подробно посмотрим далее. Пример использования `_.template` для генерации HTML с шаблоном выше: @@ -473,7 +473,7 @@ function(obj) { } ``` -Как видно, она один-в-один повторяет код и вставляет текст в переменную `__p`. При этом выражение в `<%-...%>` обёрнуто в вызов [_.escape](http://lodash.com/docs#escape), который заменяет спецсимволы HTML на их текстовые варианты. +Как видно, она один-в-один повторяет код и вставляет текст в переменную `__p`. При этом выражение в `<%-...%>` обёрнуто в вызов [_.escape](https://lodash.com/docs#escape), который заменяет спецсимволы HTML на их текстовые варианты. ## Отладка шаблонов @@ -516,7 +516,7 @@ function(obj) { Библиотека LoDash пытается нам помочь, подсказать, в каком именно шаблоне произошла ошибка. Ведь из функции это может быть неочевидно. -Для этого она добавляет к шаблонам специальный идентификатор [sourceURL](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl), который служит аналогом "имени файла". На картинке он отмечен красным. +Для этого она добавляет к шаблонам специальный идентификатор [sourceURL](https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl), который служит аналогом "имени файла". На картинке он отмечен красным. По умолчанию `sourceURL` имеет вид `/lodash/template/source[N]`, где `N` -- постоянно увеличивающийся номер шаблона. В данном случае мы можем понять, что эта функция получена при самой первой компиляции. @@ -553,13 +553,13 @@ var compiled = _.template(tmpl, {sourceURL: '/template/menu-template'}); Шаблонных систем много. Многие основаны на схожем принципе -- генерации функции из строки, например: - [EJS](http://www.embeddedjs.com/) -- [Jade](http://jade-lang.com/) -- [Handlebars](http://handlebarsjs.com/) +- [Jade](https://jade-lang.com/) +- [Handlebars](https://handlebarsjs.com/) Есть и альтернативный подход -- шаблонная система получает "образец" DOM-узла и клонирует его вызовом `cloneNode(true)`, каждый раз изменяя что-то внутри. В отличие от подхода, описанного выше, это будет работать не с произвольной строкой текста, а только и именно с DOM-узлами. Но в некоторых ситуациях у него есть преимущество. Такой подход используется во фреймворках: -- [AngularJS](http://angularjs.org) -- [Knockout.JS](http://knockoutjs.com/) +- [AngularJS](https://angular.io/) +- [Knockout.JS](https://knockoutjs.com/) diff --git a/99-archive/117-what-next/article.md b/99-archive/117-what-next/article.md index 395b52c0ce..99dce729c3 100755 --- a/99-archive/117-what-next/article.md +++ b/99-archive/117-what-next/article.md @@ -13,9 +13,9 @@ archive: Примеры удачных фреймворков, которые можно изучить: -- [Angular.JS](http://angularjs.org) -- [React.JS](http://facebook.github.io/react/) + [Flux](http://facebook.github.io/flux/) -- [Backbone.JS](http://backbonejs.org/) + [Marionette](http://marionettejs.com/) +- [Angular.JS](https://angular.io/) +- [React.JS](https://reactjs.org/) + [Flux](http://facebook.github.io/flux/) +- [Backbone.JS](http://backbonejs.org/) + [Marionette](https://marionettejs.com/) Также для работы с браузерами понадобятся различные [API](https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9), в частности: diff --git a/99-archive/122-minification/article.md b/99-archive/122-minification/article.md index 4a1ffed547..ff40f63ec2 100644 --- a/99-archive/122-minification/article.md +++ b/99-archive/122-minification/article.md @@ -27,7 +27,7 @@ archive: Для GCC: -1. Убедиться, что стоит [Java](http://java.oracle.com) +1. Убедиться, что стоит [Java](https://www.oracle.com/java/technologies/) 2. Скачать и распаковать , нам нужен файл `compiler.jar`. 3. Сжать файл `my.js`: `java -jar compiler.jar --charset UTF-8 --js my.js --js_output_file my.min.js` From c7d4db7654192f50c687fe65419e3473f56d257a Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Tue, 7 Jun 2022 14:38:36 +0600 Subject: [PATCH 0358/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 99-archive/107-gcc-check-types/article.md | 2 +- 99-archive/122-minification/article.md | 6 +++--- 99-archive/124-books/article.md | 24 +++++++++++------------ 99-archive/125-templates/article.md | 20 +++++++++---------- 99-archive/126-csrf/article.md | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/99-archive/107-gcc-check-types/article.md b/99-archive/107-gcc-check-types/article.md index 7e5819b123..a7192a85ce 100755 --- a/99-archive/107-gcc-check-types/article.md +++ b/99-archive/107-gcc-check-types/article.md @@ -170,7 +170,7 @@ required: (Object|null|undefined) Из нескольких примеров, которые мы рассмотрели, должна быть понятна общая логика проверки типов. -Соответствующие различным типам и ограничениям на типы аннотации вы можете найти в Документации Google. В частности, возможно указание нескольких возможных типов, типа undefined и т.п. +Соответствующие различным типам и ограничениям на типы аннотации вы можете найти в [Документации Google](http://code.google.com/intl/ru/closure/compiler/docs/js-for-compiler.html). В частности, возможно указание нескольких возможных типов, типа undefined и т.п. Также можно указывать количество и тип параметров функции, ключевого слова this, объявлять классы, приватные методы и интерфейсы. diff --git a/99-archive/122-minification/article.md b/99-archive/122-minification/article.md index ff40f63ec2..de9777115f 100644 --- a/99-archive/122-minification/article.md +++ b/99-archive/122-minification/article.md @@ -33,11 +33,11 @@ archive: Обратите внимание на флаг `--charset` для GCC. Без него русские буквы будут закодированы во что-то типа `\u1234`. -Google Closure Compiler также содержит [песочницу](http://closure-compiler.appspot.com/home) для тестирования сжатия и [веб-сервис](https://developers.google.com/closure/compiler/docs/gettingstarted_api?hl=ru), на который код можно отправлять для сжатия. Но скачать файл обычно гораздо проще, поэтому его редко где используют. +Google Closure Compiler также содержит [песочницу](https://closure-compiler.appspot.com/home) для тестирования сжатия и [веб-сервис](https://developers.google.com/closure/compiler/docs/gettingstarted_api?hl=ru), на который код можно отправлять для сжатия. Но скачать файл обычно гораздо проще, поэтому его редко где используют. Для UglifyJS: -1. Убедиться, что стоит [Node.js](http://nodejs.org) +1. Убедиться, что стоит [Node.js](https://nodejs.org) 2. Поставить `npm install -g uglify-js`. 3. Сжать файл `my.js`: `uglifyjs my.js -o my.min.js` @@ -57,7 +57,7 @@ Google Closure Compiler также содержит [песочницу](http:// Для GCC есть даже способ вывести его: -1. Сначала сгенерируем дерево в формате [DOT](http://en.wikipedia.org/wiki/DOT_language): +1. Сначала сгенерируем дерево в формате [DOT](https://en.wikipedia.org/wiki/DOT_language): ``` java -jar compiler.jar --js my.js --use_only_custom_externs --print_tree >my.dot diff --git a/99-archive/124-books/article.md b/99-archive/124-books/article.md index 21fd14a40f..626a9afe84 100755 --- a/99-archive/124-books/article.md +++ b/99-archive/124-books/article.md @@ -15,27 +15,27 @@ P.S. Скачать книги здесь нельзя. Эта страница CSS стоит изучать по одной из этих книг. Можно сразу по обеим. -- Большая книга CSS3. +- Большая книга CSS3. Дэвид Макфарланд. -- CSS. Каскадные таблицы стилей. Подробное руководство. +- CSS. Каскадные таблицы стилей. Подробное руководство. Эрик Мейер -Конечно, [стандарты](http://www.w3.org/Style/CSS/) тоже будут полезны. Подчас их точность куда проще, чем много страниц разъяснений. +Конечно, [стандарты](https://www.w3.org/Style/CSS/) тоже будут полезны. Подчас их точность куда проще, чем много страниц разъяснений. ## JavaScript Полезное чтение о языке, встроенных методах и конструкциях JavaScript: -- JavaScript. Подробное руководство. +- JavaScript. Подробное руководство. Дэвид Флэнаган. -- JavaScript. Шаблоны. +- JavaScript. Шаблоны. Стоян Стефанов. ## jQuery -Кроме [документации](http://api.jquery.com/): +Кроме [документации](https://api.jquery.com/): -- jQuery. Подробное руководство по продвинутому JavaScript. +- jQuery. Подробное руководство по продвинутому JavaScript. Бер Бибо, Иегуда Кац. ## Объектно-ориентированное программирование [#books-oop] @@ -44,28 +44,28 @@ CSS стоит изучать по одной из этих книг. Можно Умение создавать объект, конструктор, вызывать методы -- это основные, самые базовые "кирпичики". Их следует освоить первыми, например используя этот учебник. Затем, когда основы более-менее освоены, стоит уделить внимание теории объектно-ориентированной разработки: -- Объектно-ориентированный анализ и проектирование с примерами приложений. +- Объектно-ориентированный анализ и проектирование с примерами приложений. Гради Буч и др.. -- Приёмы объектно-ориентированного проектирования. Паттерны проектирования. +- Приёмы объектно-ориентированного проектирования. Паттерны проектирования. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. ## Регулярные выражения -- Регулярные выражения. +- Регулярные выражения. Джеффри Фридл. Эта книга описывает более широкий класс регэкспов, по сравнению с текущим JavaScript. С одной стороны, какая-то информация будет лишней, с другой -- регулярные выражения вообще очень важная и полезная тема. ## Алгоритмы и структуры данных -- Алгоритмы. Построение и анализ. +- Алгоритмы. Построение и анализ. Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн. Есть и другая классика, например "Искусство программирования", Дональд Кнут, но она требует более серьёзной математической подготовки. Будьте готовы читать и вникать долго и упорно. Результат -- апгрейд мозговых извилин и общего умения программировать. ## Разработка и организация кода -- Совершенный код. +- Совершенный код. Стив Макконнелл. Это желательно изучать уже после получения какого-то опыта в программировании. diff --git a/99-archive/125-templates/article.md b/99-archive/125-templates/article.md index ab421d3dd3..0afc84946c 100644 --- a/99-archive/125-templates/article.md +++ b/99-archive/125-templates/article.md @@ -76,7 +76,7 @@ libs: То есть, можно заранее, до выкладывания сайта на "боевой сервер", обработать шаблоны, создать из них JS-функции, объединить их в единый файл и далее, в "боевом окружении" использовать уже их. -Современные системы сборки ([brunch](http://brunch.io/), [grunt](http://gruntjs.com/) с плагинами и другие) позволяют делать это удобно, а также хранить шаблоны в разных файлах, каждый -- в нужной директории с JS-кодом для виджета. +Современные системы сборки ([brunch](https://brunch.io/), [grunt](https://gruntjs.com/) с плагинами и другие) позволяют делать это удобно, а также хранить шаблоны в разных файлах, каждый -- в нужной директории с JS-кодом для виджета. ## Хелперы и фильтры @@ -119,7 +119,7 @@ JavaScript-вставки не всегда просты и элегантны. Например: - [Mustache](http://mustache.github.com/) -- [Handlebars](http://handlebarsjs.com/) +- [Handlebars](https://handlebarsjs.com/) - [Closure Templates](https://developers.google.com/closure/templates/docs/javascript_usage) - ...тысячи их... @@ -152,7 +152,7 @@ var result = compiled({ }); ``` -Библиотека шаблонизации [Handlebars](http://handlebarsjs.com/) "понимает" этот язык. Вызов `Handlebars.compile` принимает строку шаблона, разбивает по разделителям и, аналогично предыдущему виду шаблонов, делает JavaScript-функцию, которая затем по данным выдаёт строку-результат. +Библиотека шаблонизации [Handlebars](https://handlebarsjs.com/) "понимает" этот язык. Вызов `Handlebars.compile` принимает строку шаблона, разбивает по разделителям и, аналогично предыдущему виду шаблонов, делает JavaScript-функцию, которая затем по данным выдаёт строку-результат. ### Запрет на встроенный JS @@ -180,7 +180,7 @@ var result = compiled({ - Можно автоматически назначать обработчики из методов компонента. - Можно запомнить, какие данные относятся к каким элементам и в дальнейшем, при изменении данных автоматически обновлять DOM ("привязка данных" -- англ. data binding). -Одной из первых систем шаблонизации, которая поддерживает подобные возможности была [Knockout.JS](http://knockoutjs.com). +Одной из первых систем шаблонизации, которая поддерживает подобные возможности была [Knockout.JS](https://knockoutjs.com). Попробуйте поменять значение `` в примере ниже и вы увидите двухстороннюю привязку данных в действии: @@ -215,7 +215,7 @@ ko.applyBindings(user, document.body); Привязка осуществляется в две стороны: -1. Во-первых, библиотека ставит на `input` свой обработчик `oninput` (можно выбрать другие события, см. [документацию](http://knockoutjs.com/documentation/value-binding.html)), который будет обновлять `user.name`. То есть, изменение `input` автоматически меняет `user.name` +1. Во-первых, библиотека ставит на `input` свой обработчик `oninput` (можно выбрать другие события, см. [документацию](https://knockoutjs.com/documentation/value-binding.html)), который будет обновлять `user.name`. То есть, изменение `input` автоматически меняет `user.name` 2. Во-вторых, свойство `user.name` создано как `ko.observable(...)`. Технически, `ko.observable(value)` -- это функция-обёртка вокруг значения: геттер-сеттер, который умеет рассылать события при изменении. Например: @@ -251,7 +251,7 @@ ko.applyBindings(user, document.body); **Вызов `ko.applyBindings` можно делать внутри компоненты, и таким образом устанавливать соответствия между её объектом и DOM.** -Библиотека также поддерживает хранение шаблонов в ` From e5216b290b2ccca862332f2bc8c1af12819e623f Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 27 Jul 2022 21:33:03 +0600 Subject: [PATCH 0428/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/02-localstorage/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index cef71000eb..5dfc81277c 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -202,7 +202,7 @@ alert( sessionStorage.getItem('test') ); // после обновления: 1 ```js run // срабатывает при обновлениях, сделанных в том же хранилище из других документов -window.onstorage = event => { +window.onstorage = event => { // можно также использовать window.addEventListener('storage', event => { if (event.key != 'now') return; alert(event.key + ':' + event.newValue + " at " + event.url); }; From 785fe7d3c04f2f1bc58697ff24be271435cd0634 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 27 Jul 2022 21:35:13 +0600 Subject: [PATCH 0429/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6-data-storage/02-localstorage/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/6-data-storage/02-localstorage/article.md b/6-data-storage/02-localstorage/article.md index 5dfc81277c..9531362cb8 100644 --- a/6-data-storage/02-localstorage/article.md +++ b/6-data-storage/02-localstorage/article.md @@ -128,17 +128,17 @@ for(let key of keys) { Если мы используем любой другой тип, например число или объект, то он автоматически преобразуется в строку: ```js run -sessionStorage.user = {name: "John"}; -alert(sessionStorage.user); // [object Object] +localStorage.user = {name: "John"}; +alert(localStorage.user); // [object Object] ``` Мы можем использовать `JSON` для хранения объектов: ```js run -sessionStorage.user = JSON.stringify({name: "John"}); +localStorage.user = JSON.stringify({name: "John"}); -// немного позже -let user = JSON.parse( sessionStorage.user ); +// sometime later +let user = JSON.parse( localStorage.user ); alert( user.name ); // John ``` From eb6f222a1727bb2211f6233cf0fd7b97162a9ac8 Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Wed, 27 Jul 2022 21:46:28 +0600 Subject: [PATCH 0430/1128] =?UTF-8?q?=F0=9F=91=BE=20smth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/99-js-misc/01-proxy/article.md | 1 - 2-ui/1-document/03-dom-navigation/article.md | 2 +- 2-ui/5-loading/01-onload-ondomcontentloaded/article.md | 4 ++-- 6-data-storage/02-localstorage/article.md | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/1-js/99-js-misc/01-proxy/article.md b/1-js/99-js-misc/01-proxy/article.md index 950f5b96e8..1c1e77c3e6 100644 --- a/1-js/99-js-misc/01-proxy/article.md +++ b/1-js/99-js-misc/01-proxy/article.md @@ -454,7 +454,6 @@ user = { Впрочем, приватные свойства имеют свои недостатки. В частности, они не наследуются. ``` - ## "В диапазоне" с ловушкой "has" Давайте посмотрим ещё примеры. diff --git a/2-ui/1-document/03-dom-navigation/article.md b/2-ui/1-document/03-dom-navigation/article.md index ae7e533532..58bdbea209 100644 --- a/2-ui/1-document/03-dom-navigation/article.md +++ b/2-ui/1-document/03-dom-navigation/article.md @@ -201,7 +201,7 @@ DOM-коллекции, и даже более -- *все* навигацион Например: -```js +```js run // родителем является alert( document.body.parentNode === document.documentElement ); // выведет true diff --git a/2-ui/5-loading/01-onload-ondomcontentloaded/article.md b/2-ui/5-loading/01-onload-ondomcontentloaded/article.md index 22098adcc3..c7d41ae0fb 100644 --- a/2-ui/5-loading/01-onload-ondomcontentloaded/article.md +++ b/2-ui/5-loading/01-onload-ondomcontentloaded/article.md @@ -85,7 +85,7 @@ document.addEventListener("DOMContentLoaded", ready); Но здесь есть подводный камень. Если после стилей у нас есть скрипт, то этот скрипт должен дождаться, пока загрузятся стили: -```html +```html run ``` -Здесь `/path/to/script.js` - это абсолютный путь до скрипта от корня сайта. Также можно указать относительный путь от текущей страницы. Например, `src="script.js"` или `src="./script.js"` будет означать, что файл `"script.js"` находится в текущей папке. +Здесь `/path/to/script.js` - это абсолютный путь от корневой папки до необходимого файла. Корневой папкой может являться корень диска или корень сайта, в зависимости от условий работы сайта. Также можно указать относительный путь от текущей страницы. Например, `src="script.js"` или `src="./script.js"` будет означать, что файл `"script.js"` находится в текущей папке. Можно указать и полный URL-адрес. Например: From eac6c7b329121a1e589b29fb826a6c5715d72ccf Mon Sep 17 00:00:00 2001 From: Lavrentiy Rubtsov Date: Fri, 26 Aug 2022 20:50:21 +0600 Subject: [PATCH 0473/1128] Update 1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js Co-authored-by: Alexandre888 --- .../01-spy-decorator/_js.view/solution.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js b/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js index aca5b352e3..cdd9851be8 100644 --- a/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js +++ b/1-js/06-advanced-functions/09-call-apply-decorators/01-spy-decorator/_js.view/solution.js @@ -1,7 +1,7 @@ function spy(func) { function wrapper(...args) { - // мы используем ...args вместо аргументов для хранения "реального" массива в wrapper.calls + // мы используем ...args вместо arguments для хранения "реального" массива в wrapper.calls wrapper.calls.push(args); return func.apply(this, args); } From 40bed5c9514f7c86e97580f749bb29e743f86194 Mon Sep 17 00:00:00 2001 From: Alexey Chilipenko <5251053+chilipenko@users.noreply.github.com> Date: Fri, 26 Aug 2022 18:24:28 +0300 Subject: [PATCH 0474/1128] yo fix --- 1-js/02-first-steps/05-types/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/05-types/article.md b/1-js/02-first-steps/05-types/article.md index 37458f2a7d..6ba6cb39fa 100644 --- a/1-js/02-first-steps/05-types/article.md +++ b/1-js/02-first-steps/05-types/article.md @@ -68,7 +68,7 @@ n = 12.345; ## BigInt -В JavaScript тип "number" не может безопасно работать с числами большими чем (253-1) (т. е. `9007199254740991`) или меньшими чем -(253-1) для отрицательных чисел. Технически, тип "number" может хранить и гораздо большие значения (вплоть до 1.7976931348623157 * 10308), однако за пределами безопасного диапазона ±(253-1) многие из чисел не могут быть представлены с помощью этого типа данных из-за ограничений, вызванных внутренним представлением чисел в двоичной форме. Например, нечетные числа большие чем (253-1) невозможно хранить при помощи типа "number", они с разной точностью будут автоматически округляться до четных значений. В то же время некоторые четные числа большие чем (253-1) при помощи типа "number" хранить технически возможно (однако не стоит этого делать во избежание дальнейших ошибок). +В JavaScript тип "number" не может безопасно работать с числами большими чем (253-1) (т. е. `9007199254740991`) или меньшими чем -(253-1) для отрицательных чисел. Технически, тип "number" может хранить и гораздо большие значения (вплоть до 1.7976931348623157 * 10308), однако за пределами безопасного диапазона ±(253-1) многие из чисел не могут быть представлены с помощью этого типа данных из-за ограничений, вызванных внутренним представлением чисел в двоичной форме. Например, нечётные числа большие чем (253-1) невозможно хранить при помощи типа "number", они с разной точностью будут автоматически округляться до чётных значений. В то же время некоторые чётные числа большие чем (253-1) при помощи типа "number" хранить технически возможно (однако не стоит этого делать во избежание дальнейших ошибок). Для большинства случаев достаточно безопасного диапазона чисел от -(253-1) до (253-1). Но иногда нам нужен диапазон действительно гигантских целых чисел без каких-либо ограничений или пропущенных значений внутри него. Например, в криптографии или при использовании метки времени ("timestamp") с микросекундами. From ea5ae9aa16b2421490dd62ce34d00ce2edfa0872 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Fri, 26 Aug 2022 23:48:36 +0300 Subject: [PATCH 0475/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=20"=D0=90=D0=BB=D1=8C=D1=82=D0=B5=D1=80=D0=BD=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B5=20=D0=BF=D0=B0=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D1=80=D1=8B=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен подраздел "Альтернативные параметры по умолчанию" в статью "Функции", в соответствии с английской версией учебника. --- .../15-function-basics/article.md | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/1-js/02-first-steps/15-function-basics/article.md b/1-js/02-first-steps/15-function-basics/article.md index 951a728392..75e45984b1 100644 --- a/1-js/02-first-steps/15-function-basics/article.md +++ b/1-js/02-first-steps/15-function-basics/article.md @@ -222,7 +222,9 @@ function showMessage(from, text = anotherFunction()) { ```smart header="Вычисление параметров по умолчанию" В JavaScript параметры по умолчанию вычисляются каждый раз, когда функция вызывается без соответствующего параметра. -В примере выше `anotherFunction()` будет вызываться каждый раз, когда `showMessage()` вызывается без параметра `text`. +В приведённом выше примере, функция `anotherFunction()` не будет вызвана вообще, если указан параметр `text`. + +С другой стороны, функция будет независимо вызываться каждый раз, когда `text` отсутствует. ``` ````smart header="Использование параметров по умолчанию в ранних версиях JavaScript" @@ -254,6 +256,46 @@ function showMessage(from, text) { ``` ```` +### Альтернативные параметры по умолчанию + +Иногда имеет смысл присваивать значения по умолчанию для параметров не в объявлении функции, а на более позднем этапе. + +Во время выполнения функции мы можем проверить, передан ли параметр, сравнив его с `undefined`: + +```js run +function showMessage(text) { + // ... +*!* + if (text === undefined) { // если параметр отсутствует + text = 'пустое сообщение'; + } +*/!* + alert(text); +} +showMessage(); // пустое сообщение +``` + +...Или мы можем использовать оператор `||`: + +```js +function showMessage(text) { + // если значение text ложно или равняется undefined, тогда присвоить text значение 'пусто' + text = text || 'пусто'; + ... +} +``` + +Современные движки JavaScript поддерживают [оператор нулевого слияния](info:nullish-coalescing-operator) `??`. Его использование будет лучшей практикой, в случае, если большинство ложных значений, таких как `0`, следует расценивать как "нормальные". + +```js run +function showCount(count) { + // если count равен undefined или null, показать "неизвестно" + alert(count ?? "неизвестно"); +} +showCount(0); // 0 +showCount(null); // неизвестно +showCount(); // неизвестно +``` ## Возврат значения From 47670a3a394ce642ed1ced9005368653c8123338 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 00:06:05 +0300 Subject: [PATCH 0476/1128] Update 1-js/02-first-steps/03-strict-mode/article.md --- 1-js/02-first-steps/03-strict-mode/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/03-strict-mode/article.md b/1-js/02-first-steps/03-strict-mode/article.md index 4e46b07998..df82646a06 100644 --- a/1-js/02-first-steps/03-strict-mode/article.md +++ b/1-js/02-first-steps/03-strict-mode/article.md @@ -63,7 +63,7 @@ alert("some code"); В большинстве браузеров, включая Chrome и Firefox, это работает. -Если этого не происходит, например, в старом браузере, есть некрасивый, но надежный способ обеспечить `use strict`. Поместите его в такую обертку: +Если этого не происходит, например, в старом браузере, есть некрасивый, но надежный способ обеспечить `use strict`. Поместите его в следующую обёртку: ```js (function() { From 8d1585798c47e228f976bd43c1d1c7abd4ddcf16 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 01:13:34 +0300 Subject: [PATCH 0477/1128] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BF=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=82=D0=BE=D1=87=D0=BA=D0=B0=20`.`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/5-loading/01-onload-ondomcontentloaded/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/5-loading/01-onload-ondomcontentloaded/article.md b/2-ui/5-loading/01-onload-ondomcontentloaded/article.md index c7d41ae0fb..9f3eaecc75 100644 --- a/2-ui/5-loading/01-onload-ondomcontentloaded/article.md +++ b/2-ui/5-loading/01-onload-ondomcontentloaded/article.md @@ -108,7 +108,7 @@ Firefox, Chrome и Opera автоматически заполняют поля ## window.onload [#window-onload] -Событие `load` на объекте `window` наступает, когда загрузилась вся страница, включая стили, картинки и другие ресурсы. Это событие доступно через свойство `onload` +Событие `load` на объекте `window` наступает, когда загрузилась вся страница, включая стили, картинки и другие ресурсы. Это событие доступно через свойство `onload`. В примере ниже правильно показаны размеры картинки, потому что `window.onload` дожидается всех изображений: From fb1f96d0f9539798b848643d8409a972615f19e1 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 14:19:53 +0300 Subject: [PATCH 0478/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D0=B0=D1=8F=20=D1=81=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TRANSLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATION.md b/TRANSLATION.md index cb399bb23b..f221940b53 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -65,7 +65,7 @@ document.querySelector('.hello').innerHTML = text; - _Вы_ и его производные пишите с маленькой буквы - Используйте букву `ё` ([этот npm-пакет](https://github.com/hcodes/eyo) может проверить текст и вставить её, где нужно) -- Не знаете, как перевести термин? [Словарь «Веб-стандартов»](https://github.com/web-standards-ru/dictionary/blob/master/dictionary.md) поможет! +- Не знаете, как перевести термин? [Словарь «Веб-стандартов»](https://github.com/web-standards-ru/dictionary/blob/main/dictionary.md) поможет! - Названия компаний (Google), библиотек (Jest) и аббревиатуры (DOM) не переводятся. - **importance: n** встречающееся в начале задач - служебное поле, перевод не требуется. From c0103a263fdb88b610383dae06dc9d5a450a7e40 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:27:40 +0300 Subject: [PATCH 0479/1128] Update 1-js/05-data-types/05-array-methods/12-reduce-object/task.md --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index fa4ab98081..45eb133505 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -6,7 +6,7 @@ importance: 4 Допустим, мы получили массив пользователей в виде `{id:..., name:..., age:... }`. -Создайте функцию `groupById(arr)`, которая создаёт из неё объект с `id` в качестве ключа и элементами массива в качестве значений. +Создайте функцию `groupById(arr)`, которая создаст из него объект с `id` в качестве ключа и элементами массива в качестве значений. Например: From d24c439c663816a0a3731b73aafbd9dfd8b8be52 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:27:48 +0300 Subject: [PATCH 0480/1128] Update 1-js/05-data-types/05-array-methods/12-reduce-object/task.md --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index 45eb133505..5f0f4eec93 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -30,7 +30,7 @@ usersById = { */ ``` -Такая функция действительно удобна при работе с серверными данными. +Такая функция очень удобна при работе с данными, которые приходят с сервера. В этой задаче мы предполагаем, что `id` уникален. Не может быть двух элементов массива с одинаковым `id`. From 6fab35697d5feeab5cc088a13e2d4f0a41774acc Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:27:56 +0300 Subject: [PATCH 0481/1128] Update 1-js/05-data-types/05-array-methods/12-reduce-object/task.md --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index 5f0f4eec93..5c0a76070e 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -34,4 +34,4 @@ usersById = { В этой задаче мы предполагаем, что `id` уникален. Не может быть двух элементов массива с одинаковым `id`. -Используйте метод array `.reduce` в решении. +Используйте метод `.reduce` в решении. From ab410128ccb28efbff793afb78c78956936ee548 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:28:52 +0300 Subject: [PATCH 0482/1128] Update 1-js/05-data-types/05-array-methods/2-filter-range/task.md --- 1-js/05-data-types/05-array-methods/2-filter-range/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/2-filter-range/task.md b/1-js/05-data-types/05-array-methods/2-filter-range/task.md index a0c15a79fe..3fb9dd3be9 100644 --- a/1-js/05-data-types/05-array-methods/2-filter-range/task.md +++ b/1-js/05-data-types/05-array-methods/2-filter-range/task.md @@ -4,7 +4,7 @@ importance: 4 # Фильтрация по диапазону -Напишите функцию `filterRange(arr, a, b)`, которая принимает массив `arr`, ищет элементы со значениями выше или равными `a` и ниже или равными `b` и возвращает результат в виде массива. +Напишите функцию `filterRange(arr, a, b)`, которая принимает массив `arr`, ищет элементы со значениями больше или равными `a` и меньше или равными `b` и возвращает результат в виде массива. Функция должна возвращать новый массив и не изменять исходный. From 260f94d27e5f0e422693ed8d1ce8abaf99c947ee Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:29:06 +0300 Subject: [PATCH 0483/1128] Update 1-js/05-data-types/05-array-methods/article.md --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 5fb04d9411..77bb49d29a 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -182,7 +182,7 @@ let arrayLike = { alert( arr.concat(arrayLike) ); // 1,2,[object Object] ``` -...Но если объект, подобный массиву, имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается как массив с помощью `concat`: вместо него добавляются его элементы: +...Но если массивоподобный объект имеет специальное свойство `Symbol.isConcatSpreadable`, то он обрабатывается как массив, с помощью `concat`: вместо него добавляются его элементы: ```js run let arr = [1, 2]; From 353fc378242ab00f649dda299dc1e0a29eb0937e Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:29:12 +0300 Subject: [PATCH 0484/1128] Update 1-js/05-data-types/05-array-methods/article.md --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 77bb49d29a..5d042ab23c 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -458,7 +458,7 @@ arr.sort( (a, b) => a - b ); ```` ````smart header="Используйте `localeCompare` для строк" -Помните алгоритм сравнения [строк](info:string#correct-comparisons)? По умолчанию он сравнивает буквы по их кодам. +Помните алгоритм сравнения [строк](info:string#correct-comparisons)? По умолчанию, он сравнивает буквы по их кодам. Для многих алфавитов лучше использовать метод `str.localeCompare` для правильной сортировки букв, таких как `Ö`. From d54fcdd8a796b7d417f5692e8ffc8c2c201f86fb Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:29:59 +0300 Subject: [PATCH 0485/1128] Update 1-js/05-data-types/05-array-methods/article.md --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 5d042ab23c..1372392e3d 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -741,7 +741,7 @@ alert(soldiers[1].age); // 23 Функция `fn` вызывается для каждого элемента массива аналогично `map`. Если какие-либо/все результаты вызовов являются `true`, то метод возвращает `true`, иначе `false`. - Эти методы ведут себя примерно как операторы `||` и `&&`: если `fn` возвращает истинное значение, `arr.some()` немедленно возвращает `true` и останавливает перебор остальных элементов; если `fn` возвращает ложное значение, `arr.every()` немедленно возвращает `false` и также прекращает перебор остальных элементов. + Эти методы ведут себя примерно так же, как операторы `||` и `&&`: если `fn` возвращает истинное значение, `arr.some()` немедленно возвращает `true` и останавливает перебор остальных элементов; если `fn` возвращает ложное значение, `arr.every()` немедленно возвращает `false` и также прекращает перебор остальных элементов. Мы можем использовать `every` для сравнения массивов: From 9568a544b4b911b3f8737d34cfc70da2e09817a3 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:30:07 +0300 Subject: [PATCH 0486/1128] Update 1-js/05-data-types/05-array-methods/article.md --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 1372392e3d..74bde1689a 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -460,7 +460,7 @@ arr.sort( (a, b) => a - b ); ````smart header="Используйте `localeCompare` для строк" Помните алгоритм сравнения [строк](info:string#correct-comparisons)? По умолчанию, он сравнивает буквы по их кодам. -Для многих алфавитов лучше использовать метод `str.localeCompare` для правильной сортировки букв, таких как `Ö`. +Для многих алфавитов лучше использовать метод `str.localeCompare`, для правильной сортировки букв, таких как `Ö`. Например, давайте отсортируем несколько стран по-немецки: From 32c85ff9a28d1ad58d1d296629f02c0a693ba770 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:30:13 +0300 Subject: [PATCH 0487/1128] Update 1-js/05-data-types/05-array-methods/article.md --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 74bde1689a..81e5efc69b 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -462,7 +462,7 @@ arr.sort( (a, b) => a - b ); Для многих алфавитов лучше использовать метод `str.localeCompare`, для правильной сортировки букв, таких как `Ö`. -Например, давайте отсортируем несколько стран по-немецки: +Например, давайте отсортируем несколько стран на немецком языке: ```js run let countries = ['Österreich', 'Andorra', 'Vietnam']; From 1f4122bcd86eb7eb497942619a06a48c17818cc4 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:30:20 +0300 Subject: [PATCH 0488/1128] Update 1-js/05-data-types/05-array-methods/article.md --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index 81e5efc69b..d9ecd11ab0 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -469,7 +469,7 @@ let countries = ['Österreich', 'Andorra', 'Vietnam']; alert( countries.sort( (a, b) => a > b ? 1 : -1) ); // Andorra, Vietnam, Österreich (неправильно) -alert( countries.sort( (a, b) => a.localeCompare(b) ) ); // Andorra,Österreich,Vietnam (верно!) +alert( countries.sort( (a, b) => a.localeCompare(b) ) ); // Andorra,Österreich,Vietnam (правильно!) ``` ```` From 6bad1727fa0518d01c2e2c5ff8b3f52fc9119630 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:36:55 +0300 Subject: [PATCH 0489/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From d0bb9fddf2d1385aebb0efb1d70b500902f75023 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:42:39 +0300 Subject: [PATCH 0490/1128] Update task.md --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 1 - 1 file changed, 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index 5c0a76070e..ffeedd76fa 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -1,5 +1,4 @@ importance: 4 - --- # Создайте объект с ключами из массива From 9a524344ba62ceb0bf5fb1749dd96ad2f3375add Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:43:36 +0300 Subject: [PATCH 0491/1128] Update task.md --- 1-js/05-data-types/05-array-methods/12-reduce-object/task.md | 1 + 1 file changed, 1 insertion(+) diff --git a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md index ffeedd76fa..5c0a76070e 100644 --- a/1-js/05-data-types/05-array-methods/12-reduce-object/task.md +++ b/1-js/05-data-types/05-array-methods/12-reduce-object/task.md @@ -1,4 +1,5 @@ importance: 4 + --- # Создайте объект с ключами из массива From d6a4397b3d4cd8013678011236489c186ebc6d05 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 16:49:12 +0300 Subject: [PATCH 0492/1128] Update task.md From dfd7e6d58d6961ad53313d22bb68dbc7e2519335 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 17:11:24 +0300 Subject: [PATCH 0493/1128] Update task.md --- 1-js/05-data-types/05-array-methods/11-array-unique/task.md | 1 + 1 file changed, 1 insertion(+) diff --git a/1-js/05-data-types/05-array-methods/11-array-unique/task.md b/1-js/05-data-types/05-array-methods/11-array-unique/task.md index 9b49312e4f..ddfdae46c5 100644 --- a/1-js/05-data-types/05-array-methods/11-array-unique/task.md +++ b/1-js/05-data-types/05-array-methods/11-array-unique/task.md @@ -21,3 +21,4 @@ let strings = ["кришна", "кришна", "харе", "харе", alert( unique(strings) ); // кришна, харе, :-O ``` + From 76accf4ed82d776da0d911e3093d94b07d588521 Mon Sep 17 00:00:00 2001 From: Alexandre888 Date: Sat, 27 Aug 2022 20:26:26 +0300 Subject: [PATCH 0494/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B5=D0=B0=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D1=81=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0,=20=D0=BF=D0=B5=D1=80=D0=B5=D1=84=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8-web-components/2-custom-elements/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/8-web-components/2-custom-elements/article.md b/8-web-components/2-custom-elements/article.md index 71d8db3173..aa381526ce 100644 --- a/8-web-components/2-custom-elements/article.md +++ b/8-web-components/2-custom-elements/article.md @@ -393,4 +393,4 @@ customElements.define('hello-button', HelloButton, {extends: 'button'}); /* From d5904c4908bb3ebd8dbd79dd3d13083c0584d26c Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Mon, 14 Aug 2023 18:44:58 +0300 Subject: [PATCH 0904/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/99-ui-misc/01-mutation-observer/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/99-ui-misc/01-mutation-observer/article.md b/2-ui/99-ui-misc/01-mutation-observer/article.md index 1990c01de2..664144ec97 100644 --- a/2-ui/99-ui-misc/01-mutation-observer/article.md +++ b/2-ui/99-ui-misc/01-mutation-observer/article.md @@ -48,7 +48,7 @@ observer.observe(node, config); Для примера возьмём `
    ` с атрибутом `contentEditable`. Этот атрибут позволяет нам сфокусироваться на элементе, например, кликнув, и отредактировать содержимое. -```html run +```html run untrusted
    Отредактируй меня, пожалуйста
    ``` -Здесь `/path/to/script.js` - это абсолютный путь от корневой папки до необходимого файла. Корневой папкой может являться корень диска или корень сайта, в зависимости от условий работы сайта. Также можно указать относительный путь от текущей страницы. Например, `src="script.js"` или `src="./script.js"` будет означать, что файл `"script.js"` находится в текущей папке. +Здесь `/path/to/script.js` - это абсолютный путь от корневой папки до необходимого файла. Корневой папкой может быть корень диска или корень сайта, в зависимости от условий работы сайта. Также можно указать относительный путь от текущей страницы. Например, `src="script.js"` или `src="./script.js"` будет означать, что файл `"script.js"` находится в текущей папке. Можно указать и полный URL-адрес. Например: From 1a08882cd937a1099606008f766854a25930627b Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 22:08:13 +0300 Subject: [PATCH 0911/1128] =?UTF-8?q?=D0=98=D0=BD=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=20scrollX/scrollY?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=B0=D0=BD=D0=B3=D0=BB.=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/1-document/10-size-and-scroll-window/article.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 4f45dcfe9b..c9bc8c87d9 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -75,6 +75,12 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset); Эти свойства доступны только для чтения. +```smart header="В качестве свойств объекта `window` также доступны `scrollX` и `scrollY`" +По историческим причинам существует два аналога `window.pageXOffset` и `window.pageYOffset`: +- `window.pageXOffset` -- то же самое, что и `window.scrollX`. +- `window.pageYOffset` -- то же самое, что и `window.scrollY`. +``` + ## Прокрутка: scrollTo, scrollBy, scrollIntoView [#window-scroll] ```warn From cd954a4e267ea7eb3d0290be5406f2b5f79ae135 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 22:23:47 +0300 Subject: [PATCH 0912/1128] =?UTF-8?q?=D0=9E=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/04-variables/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/04-variables/article.md b/1-js/02-first-steps/04-variables/article.md index 7974475c99..b1bdebc933 100644 --- a/1-js/02-first-steps/04-variables/article.md +++ b/1-js/02-first-steps/04-variables/article.md @@ -18,7 +18,7 @@ JavaScript-приложению обычно нужно работать с ин let message; ``` -Теперь можно поместить (или *определить*) в неё данные, используя оператор присваивания `=`: +Теперь можно поместить в неё данные (другими словами, *определить переменную*), используя оператор присваивания `=`: ```js let message; From 164f0d8e8272e7bb5678a139c95023d965d9660e Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 22:43:21 +0300 Subject: [PATCH 0913/1128] Update 9-regular-expressions/01-regexp-introduction/article.md Co-authored-by: Sergei Fomin --- 9-regular-expressions/01-regexp-introduction/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/01-regexp-introduction/article.md b/9-regular-expressions/01-regexp-introduction/article.md index eb99b3422a..57066f38f2 100644 --- a/9-regular-expressions/01-regexp-introduction/article.md +++ b/9-regular-expressions/01-regexp-introduction/article.md @@ -62,7 +62,7 @@ let regexp = new RegExp(`<${tag}>`); // то же, что /

    / при отв : Режим поиска на конкретной позиции в тексте (описан в главе ) `pattern:d` -: С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Этот флаг никак не меняет поведение регулярного выражения, он лишь предоставляет дополнительную информацию +: С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Он никак не меняет поведение регулярного выражения, а лишь предоставляет дополнительную информацию ```smart header="Цветовые обозначения" Здесь и далее в тексте используется следующая цветовая схема: From 3793d46bf361580f7e9d97f306a08567dc4c3ac2 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 22:54:17 +0300 Subject: [PATCH 0914/1128] Update 9-regular-expressions/01-regexp-introduction/article.md --- 9-regular-expressions/01-regexp-introduction/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/01-regexp-introduction/article.md b/9-regular-expressions/01-regexp-introduction/article.md index 57066f38f2..c1c58f952d 100644 --- a/9-regular-expressions/01-regexp-introduction/article.md +++ b/9-regular-expressions/01-regexp-introduction/article.md @@ -62,7 +62,7 @@ let regexp = new RegExp(`<${tag}>`); // то же, что /

    / при отв : Режим поиска на конкретной позиции в тексте (описан в главе ) `pattern:d` -: С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Он никак не меняет поведение регулярного выражения, а лишь предоставляет дополнительную информацию +: С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Этот флаг не меняет поведение регулярного выражения, а лишь предоставляет дополнительную информацию ```smart header="Цветовые обозначения" Здесь и далее в тексте используется следующая цветовая схема: From 0201a4639acdc016fa7fc308b5a0fae454b9a12d Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 22:54:23 +0300 Subject: [PATCH 0915/1128] Update 9-regular-expressions/01-regexp-introduction/article.md --- 9-regular-expressions/01-regexp-introduction/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/01-regexp-introduction/article.md b/9-regular-expressions/01-regexp-introduction/article.md index c1c58f952d..73db1b8b77 100644 --- a/9-regular-expressions/01-regexp-introduction/article.md +++ b/9-regular-expressions/01-regexp-introduction/article.md @@ -59,7 +59,7 @@ let regexp = new RegExp(`<${tag}>`); // то же, что /

    / при отв : Включает полную поддержку Юникода. Флаг разрешает корректную обработку суррогатных пар (подробнее об этом в главе ). `pattern:y` -: Режим поиска на конкретной позиции в тексте (описан в главе ) +: Режим поиска на конкретной позиции в тексте (описан в главе ). `pattern:d` : С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Этот флаг не меняет поведение регулярного выражения, а лишь предоставляет дополнительную информацию From 7d79dcd0ce0ae6313d15259dc21b56549d644893 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 22:55:11 +0300 Subject: [PATCH 0916/1128] =?UTF-8?q?=D0=9E=D1=82=D1=81=D1=83=D1=82=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D1=83=D0=B5=D1=82=20=D1=82=D0=BE=D1=87=D0=BA=D0=B0?= =?UTF-8?q?=20`.`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9-regular-expressions/01-regexp-introduction/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9-regular-expressions/01-regexp-introduction/article.md b/9-regular-expressions/01-regexp-introduction/article.md index 73db1b8b77..6ab3dceaa2 100644 --- a/9-regular-expressions/01-regexp-introduction/article.md +++ b/9-regular-expressions/01-regexp-introduction/article.md @@ -62,7 +62,7 @@ let regexp = new RegExp(`<${tag}>`); // то же, что /

    / при отв : Режим поиска на конкретной позиции в тексте (описан в главе ). `pattern:d` -: С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Этот флаг не меняет поведение регулярного выражения, а лишь предоставляет дополнительную информацию +: С этим флагом результат регулярного выражения помещается в массив, который содержит дополнительную информацию о регулярном выражении, например индексы начала и конца подстрок. Этот флаг не меняет поведение регулярного выражения, а лишь предоставляет дополнительную информацию. ```smart header="Цветовые обозначения" Здесь и далее в тексте используется следующая цветовая схема: From 54e71380b8342d75f83ef7d62f5067e30cd77afa Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Wed, 16 Aug 2023 23:44:34 +0300 Subject: [PATCH 0917/1128] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 9-regular-expressions/01-regexp-introduction/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/9-regular-expressions/01-regexp-introduction/article.md b/9-regular-expressions/01-regexp-introduction/article.md index 6ab3dceaa2..5b15083777 100644 --- a/9-regular-expressions/01-regexp-introduction/article.md +++ b/9-regular-expressions/01-regexp-introduction/article.md @@ -39,9 +39,9 @@ let regexp = new RegExp(`<${tag}>`); // то же, что /

    / при отв ## Флаги -Регулярные выражения могут иметь флаги, которые влияют на поиск. +Регулярные выражения могут иметь флаги, которые влияют на поиск или предоставляют дополнительную информацию. -В JavaScript их всего шесть: +В JavaScript их всего семь: `pattern:i` : С этим флагом поиск не зависит от регистра: нет разницы между `A` и `a` (см. пример ниже). @@ -173,7 +173,7 @@ alert( regexp.test(str) ); // true ## Итого -- Регулярное выражение состоит из шаблона и необязательных флагов: `pattern:g`, `pattern:i`, `pattern:m`, `pattern:u`, `pattern:s`, `pattern:y`. +- Регулярное выражение состоит из шаблона и необязательных флагов: `pattern:g`, `pattern:i`, `pattern:m`, `pattern:u`, `pattern:s`, `pattern:y`, `pattern:d`. - Без флагов и специальных символов, которые мы изучим позже, поиск по регулярному выражению аналогичен поиску подстроки. - Метод `str.match(regexp)` ищет совпадения: все, если есть флаг `pattern:g`, иначе только первое. - Метод `str.replace(regexp, replacement)` заменяет совпадения с `regexp` на `replacement`: все, если у регулярного выражения есть флаг `pattern:g`, иначе только первое. From d4a55f9daa92ac1e460b655d5bc5fe737c31a956 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 17 Aug 2023 00:33:32 +0300 Subject: [PATCH 0918/1128] `??, ??=` => `'??', '??='` --- 1-js/02-first-steps/12-nullish-operators/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/12-nullish-operators/article.md b/1-js/02-first-steps/12-nullish-operators/article.md index 9ae0290134..96a6301a73 100644 --- a/1-js/02-first-steps/12-nullish-operators/article.md +++ b/1-js/02-first-steps/12-nullish-operators/article.md @@ -1,4 +1,4 @@ -# Операторы нулевого слияния и присваивания: ??, ??= +# Операторы нулевого слияния и присваивания: '??', '??=' [recent browser="new"] From 9031688b78a5e540486f371a8b6a8896d3229c9d Mon Sep 17 00:00:00 2001 From: Yulia Khavaeva Date: Thu, 17 Aug 2023 09:27:06 +0300 Subject: [PATCH 0919/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=BE=D0=B1=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B5=20options=20=D0=B2=20scrollTo,=20scrollBy,=20scrol?= =?UTF-8?q?lIntoView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../10-size-and-scroll-window/article.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index c9bc8c87d9..c0a2d8cde1 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -111,6 +111,23 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset); Эти методы одинаково работают для всех браузеров. +scrollTo/scrollBy могут иметь options, как аргумент: +element.scrollTo(options). + +options - объект с тремя свойствами: + +```js +element.scrollTo({` + top: 100, + left: 100, + behavior: "smooth" +}); +``` + +где behavior: "smooth" означает плавную прокрутку. Принимает значения "auto" или "smooth". По умолчанию "auto" - то есть, без плавной прокрутки. + +Не поддерживается только в IE. + ## scrollIntoView Для полноты картины давайте рассмотрим ещё один метод: [elem.scrollIntoView(top)](mdn:api/Element/scrollIntoView). @@ -131,6 +148,22 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset); ``` +scrollIntoView также может иметь options, как аргумент: +element.scrollIntoView(options). + +options - объект с тремя свойствами: + +- behavior - Анимация прокрутки. Принимает значения "auto" или "smooth". По умолчанию "auto". +- block - Вертикальное выравнивание. Одно из значений: "start", "center", "end" или "nearest". По умолчанию "start". +- inline - Горизонтальное выравнивание. Одно из значений: "start", "center", "end" или "nearest". По умолчанию "nearest". + +```js +elem.scrollIntoView({block: "center", behavior: "smooth"}); +``` + +behavior: "smooth" не поддерживается в IE и Safari, но начиная с версии 16.0 в Safari появилась поддержка behavior: +"smooth". + ## Запретить прокрутку Иногда нам нужно сделать документ "непрокручиваемым". Например, при показе большого диалогового окна над документом – чтобы посетитель мог прокручивать это окно, но не документ. From b0f45951e3fb95f9c350c4dc12cc3ee59db2c2bd Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Fri, 18 Aug 2023 01:06:16 +0300 Subject: [PATCH 0920/1128] rebase --- .../10-size-and-scroll-window/article.md | 48 ++++++++++++------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index c0a2d8cde1..3b43edf8f0 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -109,24 +109,36 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset); ``` -Эти методы одинаково работают для всех браузеров. +В обоих методах вместо координат также может использоваться объект `options`, как аргумент: -scrollTo/scrollBy могут иметь options, как аргумент: -element.scrollTo(options). +```js +window.scrollTo(options); +window.scrollBy(options); +``` -options - объект с тремя свойствами: +`options` поддерживает три свойства: ```js -element.scrollTo({` +window.scrollTo({ top: 100, - left: 100, + left: 0, behavior: "smooth" }); ``` -где behavior: "smooth" означает плавную прокрутку. Принимает значения "auto" или "smooth". По умолчанию "auto" - то есть, без плавной прокрутки. +- `top` -- то же самое, что `y`/`pageY` +- `left` -- то же самое, что `x`/`pageX` +- `behavior` -- определяет, каким образом будет прокручиваться страница: + + - `"smooth"` -- плавно (не поддерживается в Safari) + - `"instant"` -- мгновенно + - `"auto"` -- определяется браузером (зависит от CSS-свойства [scroll-behavior](https://developer.mozilla.org/ru/docs/Web/CSS/scroll-behavior)) + +```online +Демонстрация плавной прокрутки страницы (в Safari прокрутка будет мгновенной): -Не поддерживается только в IE. + +``` ## scrollIntoView @@ -148,22 +160,22 @@ element.scrollTo({` ``` -scrollIntoView также может иметь options, как аргумент: -element.scrollIntoView(options). +Как и `scrollTo`/`scrollBy`, `scrollIntoView` также принимает объект `options` как аргумент (он немного отличается): -options - объект с тремя свойствами: +```js +this.scrollIntoView(options). +``` -- behavior - Анимация прокрутки. Принимает значения "auto" или "smooth". По умолчанию "auto". -- block - Вертикальное выравнивание. Одно из значений: "start", "center", "end" или "nearest". По умолчанию "start". -- inline - Горизонтальное выравнивание. Одно из значений: "start", "center", "end" или "nearest". По умолчанию "nearest". +`options` поддерживает три свойства: ```js -elem.scrollIntoView({block: "center", behavior: "smooth"}); +this.scrollIntoView({ + behavior: "smooth", + block: "end", + inline: "nearest" +}); ``` -behavior: "smooth" не поддерживается в IE и Safari, но начиная с версии 16.0 в Safari появилась поддержка behavior: -"smooth". - ## Запретить прокрутку Иногда нам нужно сделать документ "непрокручиваемым". Например, при показе большого диалогового окна над документом – чтобы посетитель мог прокручивать это окно, но не документ. From df2cd5ba702cc55dec7108d634db1da2bf75f5ca Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 01:06:47 +0300 Subject: [PATCH 0921/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=82=D0=B5=D1=80=D0=BC=D0=B8=D0=BD=20=C2=AB?= =?UTF-8?q?=E2=80=9Cshort-circuit=E2=80=9D=20evaluation=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TRANSLATION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TRANSLATION.md b/TRANSLATION.md index f221940b53..2730bc7a7e 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -88,6 +88,7 @@ document.querySelector('.hello').innerHTML = text; | More in / Details in | Подробнее в | | Nullish coalescing operator | Оператор нулевого слияния | | Script | Скрипт | +| “Short-circuit” evaluation | Сокращённое вычисление | Statement | Инструкция | | Summary | Итого | From c37912cc536668c654c27faadd817ac7b9ee9218 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 01:59:41 +0300 Subject: [PATCH 0922/1128] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D0=B8=20?= =?UTF-8?q?=C2=AB=D0=9B=D0=BE=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../11-logical-operators/article.md | 75 +++++++------------ 1 file changed, 28 insertions(+), 47 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 9781a4c365..273d9dc762 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -89,8 +89,8 @@ result = value1 || value2 || value3; Например: ```js run -alert( 1 || 0 ); // 1 -alert( true || 'no matter what' ); // true +alert( 1 || 0 ); // 1 (1 - истинное значение) +alert( true || 'какая-то строка' ); // true alert( null || 1 ); // 1 (первое истинное значение) alert( null || 0 || 1 ); // 1 (первое истинное значение) @@ -101,53 +101,37 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в 1. **Получение первого истинного значения из списка переменных или выражений.** - Представим, что у нас имеется ряд переменных, которые могут содержать данные или быть `null/undefined`. Как мы можем найти первую переменную с данными? + Например, у нас есть переменные `firstName`, `lastName` и `nickName`, все они необязательные (т.е. они могут быть неопределенными или иметь ложные значения). - С помощью `||`: + Давайте воспользуемся оператором ИЛИ `||`, чтобы выбрать ту переменную, в которой есть данные, и показать её (или "Аноним", если ни в одной переменной данных нет): ```js run - let currentUser = null; - let defaultUser = "John"; - - *!* - let name = currentUser || defaultUser || "unnamed"; - */!* - - alert( name ); // выбирается "John" – первое истинное значение + let firstName = ""; + let lastName = ""; + let nickName = "Суперкодер"; + + *!*alert( firstName || lastName || nickName || "Аноним"); // Суперкодер*/!* ``` - Если бы и `currentUser`, и `defaultUser` были ложными, в качестве результата мы бы наблюдали `"unnamed"`. + Если бы все переменные были ложными, в качестве результата мы бы наблюдали `"Аноним"`. 2. **Сокращённое вычисление.** - Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ `||` вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется "сокращённым вычислением", поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения. - - Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной. - - В приведённом ниже примере `x` не изменяется: - - ```js run no-beautify - let x; - - *!*true*/!* || (x = 1); - - alert(x); // undefined, потому что (x = 1) не вычисляется - ``` + Ещё одной отличительной особенностью оператора ИЛИ `||` является так называемое «сокращённое вычисление». - Если бы первый аргумент имел значение `false`, то `||` приступил бы к вычислению второго и выполнил операцию присваивания: + Это означает, что ИЛИ `||` обрабатывает свои операнды до тех пор, пока не будет достигнуто первое истинностное значение, и затем это значение сразу же возвращается, даже не затрагивая другие операнды. - ```js run no-beautify - let x; + Важность этой особенности становится очевидной, если операнд -- это не просто значение, а выражение с сопутствующим эффектом, как, например, присваивание переменной или вызов функции. - *!*false*/!* || (x = 1); + В приведенном ниже примере срабатывает только второй `alert`: - alert(x); // 1 + ```js run + *!*true*/!* || alert("никогда не сработает"); + *!*false*/!* || alert("сработает"); ``` - Присваивание - лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт. - - Как мы видим, этот вариант использования `||` является "аналогом `if`". Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго. + В первой строке оператор ИЛИ `||` останавливает выполнение сразу после того, как сталкивается с истинным значением (`true`), поэтому сообщение не показывается. - В большинстве случаев лучше использовать "обычный" `if`, чтобы облегчить понимание кода, но иногда это может быть удобно. + Иногда люди используют эту возможность для выполнения инструкций только в том случае, если условие в левой части является ложным. ## && (И) @@ -236,32 +220,29 @@ alert( 1 && 2 && 3 ); // 3 Таким образом, код `a && b || c && d` по существу такой же, как если бы выражения `&&` были в круглых скобках: `(a && b) || (c && d)`. ```` -Как и оператор ИЛИ `||`, И `&&` иногда может заменять `if`. +````warn header="Не заменяйте `if` на `||` или `&&`" +Иногда люди используют оператор И `&&` как «более короткий способ записи if-выражения». -К примеру: +Например: ```js run let x = 1; -(x > 0) && alert( 'Greater than zero!' ); +(x > 0) && alert( 'x больше нуля!' ); ``` -Действие в правой части `&&` выполнится только в том случае, если до него дойдут вычисления. То есть, `alert` сработает, если в левой части (`x > 0)` будет `true`. +Инструкция в правой части `&&` будет выполнена только в том случае, если вычисление дойдет до нее. То есть, только если `(x > 0)` истинно. - -Получился аналог: +Таким образом, мы имеем аналог для следующего кода: ```js run let x = 1; -if (x > 0) { - alert( 'Greater than zero!' ); -} +if (x > 0) alert( 'x больше нуля!' ); ``` -Однако, как правило, вариант с `if` лучше читается и воспринимается. - -Он более очевиден, поэтому лучше использовать его. +Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ. +```` ## ! (НЕ) From fc7fab11c56c53a11b622263f2634193ae5d7aff Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 02:08:53 +0300 Subject: [PATCH 0923/1128] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/11-logical-operators/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 273d9dc762..7c56dc1429 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -221,7 +221,7 @@ alert( 1 && 2 && 3 ); // 3 ```` ````warn header="Не заменяйте `if` на `||` или `&&`" -Иногда люди используют оператор И `&&` как «более короткий способ записи if-выражения». +Иногда люди используют оператор И `&&` как «более короткий способ записи `if`-выражения». Например: From 941651683a2ce0db78c2ad4426c246dc906c7964 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 02:24:30 +0300 Subject: [PATCH 0924/1128] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/11-logical-operators/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 7c56dc1429..bea4528a78 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -35,7 +35,7 @@ alert( false || false ); // false ```js run if (1 || 0) { // работает как if( true || false ) - alert( 'truthy!' ); + alert( 'истинно!' ); } ``` @@ -157,7 +157,7 @@ let hour = 12; let minute = 30; if (hour == 12 && minute == 30) { - alert( 'The time is 12:30' ); + alert( 'Время 12:30' ); } ``` @@ -199,7 +199,7 @@ alert( 1 && 5 ); // 5 // Если первый операнд ложный, // И возвращает его. Второй операнд игнорируется alert( null && 5 ); // null -alert( 0 && "no matter what" ); // 0 +alert( 0 && "какая-то строка" ); // 0 ``` Можно передать несколько значений подряд. В таком случае возвратится первое "ложное" значение, на котором остановились вычисления. @@ -269,7 +269,7 @@ alert( !0 ); // true В частности, двойное НЕ `!!` используют для преобразования значений к логическому типу: ```js run -alert( !!"non-empty string" ); // true +alert( !!"не пустая строка" ); // true alert( !!null ); // false ``` @@ -278,7 +278,7 @@ alert( !!null ); // false Есть немного более подробный способ сделать то же самое - встроенная функция `Boolean`: ```js run -alert( Boolean("non-empty string") ); // true +alert( Boolean("не пустая строка") ); // true alert( Boolean(null) ); // false ``` From b58e2be8857c0a54193bf44bd10dfdaa529123f2 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 02:27:53 +0300 Subject: [PATCH 0925/1128] =?UTF-8?q?=D0=9E=D1=80=D1=84=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=84=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/11-logical-operators/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index bea4528a78..4b2eba2fbf 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -269,7 +269,7 @@ alert( !0 ); // true В частности, двойное НЕ `!!` используют для преобразования значений к логическому типу: ```js run -alert( !!"не пустая строка" ); // true +alert( !!"непустая строка" ); // true alert( !!null ); // false ``` @@ -278,7 +278,7 @@ alert( !!null ); // false Есть немного более подробный способ сделать то же самое - встроенная функция `Boolean`: ```js run -alert( Boolean("не пустая строка") ); // true +alert( Boolean("непустая строка") ); // true alert( Boolean(null) ); // false ``` From 1b7cc7a983f0f2dd45ef1bf444ee26f87448e162 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 02:47:28 +0300 Subject: [PATCH 0926/1128] =?UTF-8?q?=D0=9B=D0=B8=D1=88=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B1=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/04-array/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index d670492d33..0229729c0c 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -110,7 +110,7 @@ alert( fruits[fruits.length-1] ); // Plum Немного громоздко, не так ли? Нам нужно дважды написать имя переменной. -К счастью, есть более короткий синтаксис: `fruits.at (-1)`: +К счастью, есть более короткий синтаксис: `fruits.at(-1)`: ```js run let fruits = ["Apple", "Orange", "Plum"]; From d02b5d711fb67efd26ab69bd3f85bf337b45df31 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 20:30:40 +0300 Subject: [PATCH 0927/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2:=20`||=3D`,=20`&&=3D?= =?UTF-8?q?`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../11-logical-operators/article.md | 130 +++++++++++++++++- 1 file changed, 127 insertions(+), 3 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 4b2eba2fbf..051711e500 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -1,6 +1,16 @@ # Логические операторы -В JavaScript есть четыре логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ), `??` (Оператор нулевого слияния). Здесь мы рассмотрим первые три, оператор `??` будет в следующей статье. +В JavaScript есть семь логических операторов: + +- `||` (ИЛИ) + - `||=` (Оператор логического присваивания ИЛИ) +- `&&` (И) + - `&&=` (Оператор логического присваивания И) +- `!` (НЕ) +- `??` (Оператор нулевого слияния) + - `??=` (Оператор нулевого присваивания) + +Здесь мы рассмотрим первые пять, операторы `??` и `??=` будет в следующей статье. Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип. @@ -64,7 +74,7 @@ if (hour < 10 || hour > 18 || isWeekend) { } ``` -## ИЛИ "||" находит первое истинное значение [#or-finds-the-first-truthy-value] +### ИЛИ "||" находит первое истинное значение [#or-finds-the-first-truthy-value] Описанная выше логика соответствует традиционной. Теперь давайте поработаем с "дополнительными" возможностями JavaScript. @@ -133,6 +143,76 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в Иногда люди используют эту возможность для выполнения инструкций только в том случае, если условие в левой части является ложным. +## ||= (Логическое присваивание ИЛИ) + +[recent browser="new"] + +Оператор логического присваивания ИЛИ `||=` записывается как обычный ИЛИ `||` с добавлением символа приваивания `=`. Такая запись не случайна, так как результат выполнения данного оператора напрямую зависит от действий уже известного нам `||`. + +Вот его синтаксис: + +```js +a ||= b; +``` + +Оператор `||=` принимает два операнда и выполняет следующие действия: + +- Вычисляет операнды слева направо. +- Конвертирует `a` в логическое значение. +- Если `a` ложно, присваивает `a` значение `b`. + +Концепция оператора `||=` заключается в «сокращённом вычислении», принцип работы которого мы разобрали ранее. + +Теперь давайте перепишем `a ||= b` под вид «сокращённого вычисления»: + +```js +a || (a = b); +``` + +Мы уже знаем, что ИЛИ `||` возвращает *первое истинное значение*, поэтому, если `a` является таковым, вычисление до правой части выражения не дойдёт. + +Вот пример с очевидным использованием оператора `||=`: + +```js run +let johnHasCar = false; + +johnHasCar ||= "У Джона нет машины!"; // то же самое, что false || (johnHasCar = "...") + +alert( johnHasCar ); // "У Джона нет машины!" +``` + +...А здесь происходит преобразование к логическому значению: + +```js run +let manufacturer = ""; // оператор ||= преобразует пустую строку "" к логическому значению false + +manufacturer ||= "Неизвестный производитель"; // то же самое, что false || (manufacturer = "...") + +alert( manufacturer ); // "Неизвестный производитель" +``` + +Оператор логического присваивания ИЛИ `||=` -- это «[синтаксический сахар](https://ru.wikipedia.org/wiki/Синтаксический_сахар)», добавленный в язык в качестве более короткого варианта записи `if`-выражений с присваиванием. + +Мы можем переписать приведённые выше примеры с использованием обычного `if`: + +```js run +let johnHasCar = false; + +if (johnHasCar == false) { + johnHasCar = "У Джона нет машины!"; +} + +alert(johnHasCar); // "У Джона нет машины!" + +let manufacturer = ""; + +if (manufacturer == false) { + manufacturer = "Неизвестный производитель"; +} + +alert(manufacturer); // "Неизвестный производитель" +``` + ## && (И) Оператор И пишется как два амперсанда `&&`: @@ -170,7 +250,7 @@ if (1 && 0) { // вычисляется как true && false ``` -## И "&&" находит первое ложное значение +### И "&&" находит первое ложное значение При нескольких подряд операторах И: @@ -244,6 +324,50 @@ if (x > 0) alert( 'x больше нуля!' ); Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ. ```` +## &&= (Логическое присваивание И) + +[recent browser="new"] + +Оператор логического присваивания И `&&=` записывается как два амперсанда `&&` и символ присваивания `=`. + +Вот его синтаксис: + +```js +a &&= b; +``` + +Принцип действия `&&=` практически такой же, как и у оператора логического присваивания ИЛИ `||=`. Единственное отличие заключается в том, что `&&=` присвоит `a` значение `b` только в том случае, если `a` *истинно*. + +Концепция оператора логического присваивания И `&&=` также основывается на «сокращённом вычислении»: + +```js +a && (a = b); +``` + +Пример использования: + +```js run +let greeting = "Привет"; // строка непустая, поэтому будет преобразована к логическому значению true оператором &&= + +greeting &&= greeting + ", пользователь!"; // то же самое, что true && (greeting = greeting + "...") + +alert( greeting ) // "Привет, пользователь!" +``` + +Так как оператор логического присваивания И `&&=` также как и `||=` является «синтаксическим сахаром», мы можем без проблем переписать пример выше с использованием привычного для нас `if`: + +```js run +let greeting = "Привет"; + +if (greeting) { + greeting = greeting + ", пользователь!" +} + +alert( greeting ) // "Привет, пользователь!" +``` + +На практике, в отличие от `||=`, оператор `&&=` используется достаточно редко -- обычно, в комбинации с более сложными языковыми конструкциями, о которых мы будем говорить позже. Подобрать контекст для применения данного оператора -- довольно непростая задача. + ## ! (НЕ) Оператор НЕ представлен восклицательным знаком `!`. From 4e66e8a646fabf223ecc1b4f294f6e3c71d0487c Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Sat, 19 Aug 2023 22:42:02 +0300 Subject: [PATCH 0928/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=20`||=3D`,=20`&&=3D`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ifelse_task.svg | 0 .../solution.md | 0 .../{9-check-login => 10-check-login}/task.md | 0 .../solution.md | 30 +++++++++++++++++++ .../task.md | 18 +++++++++++ .../solution.md | 0 .../task.md | 0 .../solution.md | 0 .../task.md | 0 .../solution.md | 0 .../{8-if-question => 9-if-question}/task.md | 0 11 files changed, 48 insertions(+) rename 1-js/02-first-steps/11-logical-operators/{9-check-login => 10-check-login}/ifelse_task.svg (100%) rename 1-js/02-first-steps/11-logical-operators/{9-check-login => 10-check-login}/solution.md (100%) rename 1-js/02-first-steps/11-logical-operators/{9-check-login => 10-check-login}/task.md (100%) create mode 100644 1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md create mode 100644 1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/task.md rename 1-js/02-first-steps/11-logical-operators/{6-check-if-in-range => 7-check-if-in-range}/solution.md (100%) rename 1-js/02-first-steps/11-logical-operators/{6-check-if-in-range => 7-check-if-in-range}/task.md (100%) rename 1-js/02-first-steps/11-logical-operators/{7-check-if-out-range => 8-check-if-out-range}/solution.md (100%) rename 1-js/02-first-steps/11-logical-operators/{7-check-if-out-range => 8-check-if-out-range}/task.md (100%) rename 1-js/02-first-steps/11-logical-operators/{8-if-question => 9-if-question}/solution.md (100%) rename 1-js/02-first-steps/11-logical-operators/{8-if-question => 9-if-question}/task.md (100%) diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg b/1-js/02-first-steps/11-logical-operators/10-check-login/ifelse_task.svg similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/9-check-login/ifelse_task.svg rename to 1-js/02-first-steps/11-logical-operators/10-check-login/ifelse_task.svg diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/solution.md b/1-js/02-first-steps/11-logical-operators/10-check-login/solution.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/9-check-login/solution.md rename to 1-js/02-first-steps/11-logical-operators/10-check-login/solution.md diff --git a/1-js/02-first-steps/11-logical-operators/9-check-login/task.md b/1-js/02-first-steps/11-logical-operators/10-check-login/task.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/9-check-login/task.md rename to 1-js/02-first-steps/11-logical-operators/10-check-login/task.md diff --git a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md new file mode 100644 index 0000000000..f7b6e00039 --- /dev/null +++ b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md @@ -0,0 +1,30 @@ +Ответ: `30`. + +```js run +let value = NaN; + +value &&= 10; +value ||= 20; +value &&= 30; +value ||= 40; + +alert(value); +``` + +Порядок выполнения данного кода: +1. `value &&= 10` + - `value=NaN` + - `NaN` конвертируется в логическое значение `false` + - `value` ложно, поэтому присваивание *не* срабатывает +2. `value ||= 20` + - `value=NaN` + - `NaN` конвертируется в логическое значение `false` + - `value` ложно, поэтому присваивание *срабатывает* +3. `value &&= 30` + - `value=20` + - `20` конвертируется в логическое значение `true` + - `value` истинно, поэтому присваивание *срабатывает* +4. `value ||= 40` + - `value=30` + - `30` конвертируется в логическое значение `true` + - `value` истинно, поэтому присваивание *не* срабатывает \ No newline at end of file diff --git a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/task.md b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/task.md new file mode 100644 index 0000000000..eb1e29ee3d --- /dev/null +++ b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/task.md @@ -0,0 +1,18 @@ +importance: 2 + +--- + +# Что выведет этот код (||=, &&=)? + +Что выведет код ниже? + +```js +let value = NaN; + +value &&= 10; +value ||= 20; +value &&= 30; +value ||= 40; + +alert(value); +``` \ No newline at end of file diff --git a/1-js/02-first-steps/11-logical-operators/6-check-if-in-range/solution.md b/1-js/02-first-steps/11-logical-operators/7-check-if-in-range/solution.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/6-check-if-in-range/solution.md rename to 1-js/02-first-steps/11-logical-operators/7-check-if-in-range/solution.md diff --git a/1-js/02-first-steps/11-logical-operators/6-check-if-in-range/task.md b/1-js/02-first-steps/11-logical-operators/7-check-if-in-range/task.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/6-check-if-in-range/task.md rename to 1-js/02-first-steps/11-logical-operators/7-check-if-in-range/task.md diff --git a/1-js/02-first-steps/11-logical-operators/7-check-if-out-range/solution.md b/1-js/02-first-steps/11-logical-operators/8-check-if-out-range/solution.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/7-check-if-out-range/solution.md rename to 1-js/02-first-steps/11-logical-operators/8-check-if-out-range/solution.md diff --git a/1-js/02-first-steps/11-logical-operators/7-check-if-out-range/task.md b/1-js/02-first-steps/11-logical-operators/8-check-if-out-range/task.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/7-check-if-out-range/task.md rename to 1-js/02-first-steps/11-logical-operators/8-check-if-out-range/task.md diff --git a/1-js/02-first-steps/11-logical-operators/8-if-question/solution.md b/1-js/02-first-steps/11-logical-operators/9-if-question/solution.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/8-if-question/solution.md rename to 1-js/02-first-steps/11-logical-operators/9-if-question/solution.md diff --git a/1-js/02-first-steps/11-logical-operators/8-if-question/task.md b/1-js/02-first-steps/11-logical-operators/9-if-question/task.md similarity index 100% rename from 1-js/02-first-steps/11-logical-operators/8-if-question/task.md rename to 1-js/02-first-steps/11-logical-operators/9-if-question/task.md From 46a09867c4173d1da2d8a1bed00a420edb11722f Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Sat, 19 Aug 2023 22:52:36 +0300 Subject: [PATCH 0929/1128] =?UTF-8?q?=D0=AD=D1=81=D1=82=D0=B5=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6-alert-or-assignment-and-assignment/solution.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md index f7b6e00039..7546c90b13 100644 --- a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md +++ b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md @@ -12,19 +12,27 @@ alert(value); ``` Порядок выполнения данного кода: + 1. `value &&= 10` + - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *не* срабатывает + 2. `value ||= 20` + - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *срабатывает* + 3. `value &&= 30` + - `value=20` - `20` конвертируется в логическое значение `true` - `value` истинно, поэтому присваивание *срабатывает* + 4. `value ||= 40` + - `value=30` - `30` конвертируется в логическое значение `true` - `value` истинно, поэтому присваивание *не* срабатывает \ No newline at end of file From 13a436e120f025e266a5459f9ad20b0a5b8ad296 Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Sat, 19 Aug 2023 22:55:40 +0300 Subject: [PATCH 0930/1128] =?UTF-8?q?Revert=20"=D0=AD=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 46a09867c4173d1da2d8a1bed00a420edb11722f. --- .../6-alert-or-assignment-and-assignment/solution.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md index 7546c90b13..f7b6e00039 100644 --- a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md +++ b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md @@ -12,27 +12,19 @@ alert(value); ``` Порядок выполнения данного кода: - 1. `value &&= 10` - - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *не* срабатывает - 2. `value ||= 20` - - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *срабатывает* - 3. `value &&= 30` - - `value=20` - `20` конвертируется в логическое значение `true` - `value` истинно, поэтому присваивание *срабатывает* - 4. `value ||= 40` - - `value=30` - `30` конвертируется в логическое значение `true` - `value` истинно, поэтому присваивание *не* срабатывает \ No newline at end of file From 384e317150452e44692ba299ebafceb97f15c441 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 19 Aug 2023 23:17:41 +0300 Subject: [PATCH 0931/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6-alert-or-assignment-and-assignment/solution.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md index f7b6e00039..c3177b4294 100644 --- a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md +++ b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md @@ -13,18 +13,19 @@ alert(value); Порядок выполнения данного кода: 1. `value &&= 10` + - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *не* срабатывает -2. `value ||= 20` +3. `value ||= 20` - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *срабатывает* -3. `value &&= 30` +4. `value &&= 30` - `value=20` - `20` конвертируется в логическое значение `true` - `value` истинно, поэтому присваивание *срабатывает* -4. `value ||= 40` +5. `value ||= 40` - `value=30` - `30` конвертируется в логическое значение `true` - - `value` истинно, поэтому присваивание *не* срабатывает \ No newline at end of file + - `value` истинно, поэтому присваивание *не* срабатывает From 8fb8a51bb1a27f4406b5a4abab0c6dfe2c86a3f2 Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Sat, 19 Aug 2023 23:24:26 +0300 Subject: [PATCH 0932/1128] =?UTF-8?q?Revert=20"=D0=98=D1=81=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 384e317150452e44692ba299ebafceb97f15c441. --- .../6-alert-or-assignment-and-assignment/solution.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md index c3177b4294..f7b6e00039 100644 --- a/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md +++ b/1-js/02-first-steps/11-logical-operators/6-alert-or-assignment-and-assignment/solution.md @@ -13,19 +13,18 @@ alert(value); Порядок выполнения данного кода: 1. `value &&= 10` - - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *не* срабатывает -3. `value ||= 20` +2. `value ||= 20` - `value=NaN` - `NaN` конвертируется в логическое значение `false` - `value` ложно, поэтому присваивание *срабатывает* -4. `value &&= 30` +3. `value &&= 30` - `value=20` - `20` конвертируется в логическое значение `true` - `value` истинно, поэтому присваивание *срабатывает* -5. `value ||= 40` +4. `value ||= 40` - `value=30` - `30` конвертируется в логическое значение `true` - - `value` истинно, поэтому присваивание *не* срабатывает + - `value` истинно, поэтому присваивание *не* срабатывает \ No newline at end of file From 875ec11606b2fb349ce4283690ba681925deb03e Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 00:50:46 +0300 Subject: [PATCH 0933/1128] Update 2-ui/1-document/10-size-and-scroll-window/article.md --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 3b43edf8f0..25ca353a28 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -130,7 +130,7 @@ window.scrollTo({ - `left` -- то же самое, что `x`/`pageX` - `behavior` -- определяет, каким образом будет прокручиваться страница: - - `"smooth"` -- плавно (не поддерживается в Safari) + - `"smooth"` -- плавно (не поддерживается в IE и в старых версиях Safari) - `"instant"` -- мгновенно - `"auto"` -- определяется браузером (зависит от CSS-свойства [scroll-behavior](https://developer.mozilla.org/ru/docs/Web/CSS/scroll-behavior)) From c51c15c4e44e4a1d489caca5e35f36841309924c Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 00:50:51 +0300 Subject: [PATCH 0934/1128] Update 2-ui/1-document/10-size-and-scroll-window/article.md --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 25ca353a28..96f7e07595 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -137,7 +137,7 @@ window.scrollTo({ ```online Демонстрация плавной прокрутки страницы (в Safari прокрутка будет мгновенной): - + ``` ## scrollIntoView From 0af28f5f8df2f0578b07cf15379572ffa68e7286 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 00:50:56 +0300 Subject: [PATCH 0935/1128] Update 2-ui/1-document/10-size-and-scroll-window/article.md --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 96f7e07595..a6cecf8935 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -135,7 +135,7 @@ window.scrollTo({ - `"auto"` -- определяется браузером (зависит от CSS-свойства [scroll-behavior](https://developer.mozilla.org/ru/docs/Web/CSS/scroll-behavior)) ```online -Демонстрация плавной прокрутки страницы (в Safari прокрутка будет мгновенной): +Демонстрация плавной прокрутки страницы: ``` From 5d6254465245ff0053309698b96608e750253e70 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:00:31 +0300 Subject: [PATCH 0936/1128] Update 2-ui/1-document/10-size-and-scroll-window/article.md --- 2-ui/1-document/10-size-and-scroll-window/article.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index a6cecf8935..43d0ed3718 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -176,6 +176,9 @@ this.scrollIntoView({ }); ``` +- `behavior` -- анимация прокрутки (`smooth`, `instant`, `auto`) +- `block` -- вертикальное выравнивание (`start`, `center`, `end`, `nearest`). Значение по умолчанию: `start` +- `inline` -- горизонтальное выравнивание (`start`, `center`, `end`, `nearest`). Значение по умолчанию: `nearest` ## Запретить прокрутку Иногда нам нужно сделать документ "непрокручиваемым". Например, при показе большого диалогового окна над документом – чтобы посетитель мог прокручивать это окно, но не документ. From bfe9c15a47759423e94afe5964bc304054447d54 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:01:06 +0300 Subject: [PATCH 0937/1128] Update 2-ui/1-document/10-size-and-scroll-window/article.md --- 2-ui/1-document/10-size-and-scroll-window/article.md | 1 + 1 file changed, 1 insertion(+) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 43d0ed3718..89fa24cd96 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -179,6 +179,7 @@ this.scrollIntoView({ - `behavior` -- анимация прокрутки (`smooth`, `instant`, `auto`) - `block` -- вертикальное выравнивание (`start`, `center`, `end`, `nearest`). Значение по умолчанию: `start` - `inline` -- горизонтальное выравнивание (`start`, `center`, `end`, `nearest`). Значение по умолчанию: `nearest` + ## Запретить прокрутку Иногда нам нужно сделать документ "непрокручиваемым". Например, при показе большого диалогового окна над документом – чтобы посетитель мог прокручивать это окно, но не документ. From 4223681b8957d2c4a122fe2209e3e3da57b4ee4e Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:17:49 +0300 Subject: [PATCH 0938/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 89fa24cd96..9aeaab2dd3 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -137,7 +137,7 @@ window.scrollTo({ ```online Демонстрация плавной прокрутки страницы: - + ``` ## scrollIntoView From 3dfa1ffb8bfdc02e12ec16d66a5677c8e2cc5ab7 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:22:54 +0300 Subject: [PATCH 0939/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 9aeaab2dd3..d20bb451b0 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -93,7 +93,7 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset); Мы можем сделать то же самое для страницы в целом, используя `document.documentElement.scrollTop/Left` (кроме основанных на старом WebKit (Safari), где, как сказано выше, `document.body.scrollTop/Left`). -Есть и другие способы, в которых подобных несовместимостей нет: специальные методы `window.scrollBy(x,y)` и `window.scrollTo(pageX,pageY)`. +Есть и другие способы, в которых подобных несовместимостей нет: специальные методы [window.scrollBy(x,y)](https://developer.mozilla.org/ru/docs/Web/API/Window/scrollBy) и [window.scrollTo(pageX,pageY)](https://developer.mozilla.org/ru/docs/Web/API/Window/scrollTo). - Метод `scrollBy(x,y)` прокручивает страницу *относительно её текущего положения*. Например, `scrollBy(0,10)` прокручивает страницу на `10px` вниз. From af7e86b51cced9946b91d31e35d8e2872d67da13 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:28:21 +0300 Subject: [PATCH 0940/1128] `""` => `''` --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index d20bb451b0..09335e0239 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -137,7 +137,7 @@ window.scrollTo({ ```online Демонстрация плавной прокрутки страницы: - + ``` ## scrollIntoView From 8d13c84eb66cff26cc3854743b9bb7ec324a2381 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:38:03 +0300 Subject: [PATCH 0941/1128] `"` --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index 09335e0239..ebb2625e9f 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -137,7 +137,7 @@ window.scrollTo({ ```online Демонстрация плавной прокрутки страницы: - + ``` ## scrollIntoView From a29cdae1a7ff3a878632177845376538d3669c55 Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Sun, 20 Aug 2023 01:40:38 +0300 Subject: [PATCH 0942/1128] Revert "`"`" This reverts commit 8d13c84eb66cff26cc3854743b9bb7ec324a2381. --- 2-ui/1-document/10-size-and-scroll-window/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/10-size-and-scroll-window/article.md b/2-ui/1-document/10-size-and-scroll-window/article.md index ebb2625e9f..09335e0239 100644 --- a/2-ui/1-document/10-size-and-scroll-window/article.md +++ b/2-ui/1-document/10-size-and-scroll-window/article.md @@ -137,7 +137,7 @@ window.scrollTo({ ```online Демонстрация плавной прокрутки страницы: - + ``` ## scrollIntoView From d48585786b9a4d0daaad3c28721ab768070200c9 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 01:48:10 +0300 Subject: [PATCH 0943/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8E=20"=D0=9F?= =?UTF-8?q?=D0=BE=D0=B1=D0=B8=D1=82=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D1=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/08-operators/article.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/1-js/02-first-steps/08-operators/article.md b/1-js/02-first-steps/08-operators/article.md index 427589ceb9..57c6ddb65e 100644 --- a/1-js/02-first-steps/08-operators/article.md +++ b/1-js/02-first-steps/08-operators/article.md @@ -429,7 +429,9 @@ counter++; - RIGHT SHIFT(правый сдвиг) ( `>>` ) - ZERO-FILL RIGHT SHIFT(правый сдвиг с заполнением нулями) ( `>>>` ) -Они используются редко, когда возникает необходимость оперировать с числами на очень низком (побитовом) уровне. В ближайшем времени они нам не понадобятся, так как веб-разработчики редко к ним прибегают, хотя в некоторых сферах (например, в криптографии) они полезны. Можете прочитать [раздел о них](https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Expressions_and_Operators#Битовые_поразрядные_операторы) на MDN, когда возникнет реальная необходимость. +Они используются редко, когда возникает необходимость оперировать с числами на очень низком (побитовом) уровне. В ближайшем времени они нам не понадобятся, так как веб-разработчики редко к ним прибегают, хотя в некоторых сферах (например, в криптографии) они полезны. + +Вы можете прочитать о них в главе , когда возникнет реальная необходимость. ## Оператор "запятая" From 423c5b97c5d7ba74e29e3f037e40f8e9847739e4 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 18:20:59 +0300 Subject: [PATCH 0944/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B5=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BA=D0=B0=D1=81=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF?= =?UTF-8?q?=D0=B0=20=D0=BA=20document=20=D0=B2=20iframe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03-cross-window-communication/article.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/3-frames-and-windows/03-cross-window-communication/article.md b/3-frames-and-windows/03-cross-window-communication/article.md index 701bb97f3f..b1b67659b4 100644 --- a/3-frames-and-windows/03-cross-window-communication/article.md +++ b/3-frames-and-windows/03-cross-window-communication/article.md @@ -49,14 +49,12 @@ *!* let iframeWindow = iframe.contentWindow; // OK */!* - try { - // ...но не на document внутри него + + // ...но при попытке получить доступ к document страницы + *!* - let doc = iframe.contentDocument; // ОШИБКА + let doc = iframe.contentDocument; // ...получим null */!* - } catch(e) { - alert(e); // Security Error - } // также мы не можем прочитать URL страницы в ифрейме try { @@ -78,7 +76,7 @@ ``` -Код выше выведет ошибку для любых операций, кроме: +Код выше выведет ошибку или `null` для любых операций, кроме: - Получения ссылки на внутренний объект `window` из `iframe.contentWindow` - Изменения `location`. From 5994549db7181b0467662001f2be92f9ba9442a7 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 20 Aug 2023 18:25:46 +0300 Subject: [PATCH 0945/1128] =?UTF-8?q?=D0=AD=D1=81=D1=82=D0=B5=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3-frames-and-windows/03-cross-window-communication/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3-frames-and-windows/03-cross-window-communication/article.md b/3-frames-and-windows/03-cross-window-communication/article.md index b1b67659b4..3dfff5a7bd 100644 --- a/3-frames-and-windows/03-cross-window-communication/article.md +++ b/3-frames-and-windows/03-cross-window-communication/article.md @@ -58,7 +58,7 @@ // также мы не можем прочитать URL страницы в ифрейме try { - // Нельзя читать из объекта Location + // нельзя читать из объекта Location *!* let href = iframe.contentWindow.location.href; // ОШИБКА */!* From 3789d57a240dbfe48f49252ea6d6239afbd46b00 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Mon, 21 Aug 2023 18:31:20 +0300 Subject: [PATCH 0946/1128] Create pull_request_template.md --- .github/pull_request_template.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..5ad133a198 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ + + +## Описание + + + +## Ссылки + + + + + + + + + + +## Связанные Issue + + From a9d7c00adf4556aabd88a6995865673c14a43ed1 Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Thu, 24 Aug 2023 23:04:30 +0300 Subject: [PATCH 0947/1128] =?UTF-8?q?=C2=AB=D0=A0=D1=83=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=BE=20=D0=BF=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8E=20=D1=83=D1=87=D0=B5=D0=B1=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AUTHORING.md | 37 ---- CONTRIBUTING.md | 506 ++++++++++++++++++++++++++++++++++++++++++++++++ PROGRESS.md | 266 ------------------------- README.md | 30 +-- TRANSLATION.md | 102 ---------- 5 files changed, 513 insertions(+), 428 deletions(-) delete mode 100644 AUTHORING.md create mode 100644 CONTRIBUTING.md delete mode 100644 PROGRESS.md delete mode 100644 TRANSLATION.md diff --git a/AUTHORING.md b/AUTHORING.md deleted file mode 100644 index 17516b583b..0000000000 --- a/AUTHORING.md +++ /dev/null @@ -1,37 +0,0 @@ - -# Authoring - -This describes important stuff about authoring new articles of the tutorial. - -## Internal links - -All tutorial links should start from the root, not including the domain. - -✅ OK: - -```md -We'll cover that in the chapter [about functions](/function-basics) -``` - -❌ Not ok: - -```md -We'll cover that in the chapter [about functions](https://javascript.info/function-basics) -``` - -Also, to reference a chapter, there's a special "info:" scheme, like this: - -```md -We'll cover that in the chapter . -``` - -Becomes: -```html -We'll cover that in the chapter Function basics. -``` - -The title is auto-inserted from the referenced article. That has the benefit of keeping the right title if the article gets renamed. - -## TODO - -Ask @iliakan to for more details. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..eb82e64571 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,506 @@ +# Руководство по редактированию учебника + +В этом файле находится вся необходимая информация, которая может понадобиться при редактировании учебника. + +## Оглавление + +1. [Добавление материалов в русскую версию учебника и перевод материалов из английской версии](#добавление-материалов-в-русскую-версию-учебника-и-перевод-материалов-из-английской-версии) +2. [Структура учебника](#структура-учебника) +3. [Запуск учебника локально](#запуск-учебника-локально) +4. [Как внести правки в учебник?](#как-внести-правки-в-учебник) +5. [Как переводить материалы из английской версии учебника?](#как-переводить-материалы-из-английской-версии-учебника) +6. [Как добавить строку кода?](#как-добавить-строку-кода) +7. [Как добавить блок кода?](#как-добавить-блок-кода) +8. [Как добавить информационный блок?](#как-добавить-информационный-блок) +9. [Как добавить предупреждающий блок?](#как-добавить-предупреждающий-блок) +10. [Как добавить блок «Новая возможность»?](#как-добавить-блок-новая-возможность) +11. [Как добавить ссылку на другую статью из учебника?](#как-добавить-ссылку-на-другую-статью-из-учебника) +12. [Как добавить изображение в статью или задачу?](#как-добавить-изображение-в-статью-или-задачу) + +___ + +### Добавление материалов в русскую версию учебника и перевод материалов из английской версии + +[Версия учебника на английском языке](https://github.com/javascript-tutorial/en.javascript.info) — исходная. Все остальные версии — это переводы. + +Поэтому если в английской версии появляются новые статьи, или добавляются новые материалы в существующие статьи, — они обязательно должны быть переведены на другие языки. + +Если в «переводах» появляются новые материалы, соответственно, эти материалы должны быть переведены и отправлены в репозиторий английской версии учебника. + +#### **Хотите добавить новую статью в русскую версию? Дополнить какую-либо из статей новой информацией? Без проблем. Единственное условие — по возможности, отправьте перевод новых материалов и в английскую версию, если знаете язык.** + +* [Структура учебника](#структура-учебника) +* [Запуск учебника локально](#запуск-учебника-локально) +* [Как внести правки в учебник?](#как-внести-правки-в-учебник) +* [Как переводить материалы из английской версии учебника?](#как-переводить-материалы-из-английской-версии-учебника) + +Несколько деталей + +* *Вы* и его производные пишите с маленькой буквы +* Всегда используйте букву `ё` ([этот npm-пакет](https://github.com/hcodes/eyo) может проверить текст и вставить её, где нужно) +* Не знаете, как перевести английский термин? [Словарь «Веб-стандартов»](https://github.com/web-standards-ru/dictionary/blob/main/dictionary.md) поможет! +* Названия компаний (Google), библиотек (Jest) и аббревиатуры (DOM) не переводятся. +* **importance: n** встречающееся в начале задач - служебное поле, перевод не требуется. + +Ресурсы по переводу + +Чтобы улучшить ваш перевод и, вообще, письмо, полезные статьи: + +* [Берегись канцелярита!](http://www.vavilon.ru/noragal/slovo2.html) +* [Словесная алгебра](http://www.vavilon.ru/noragal/slovo4.html) +* [Поиск переводов в контексте](https://context.reverso.net/перевод/) +* [DeepL - переводчик на нейросетях](https://www.deepl.com/translator) +___ + +### Структура учебника + +Если вы планируете внести правки в одну статью (или в одну задачу), углубленное понимание структуры учебника вам не понадобится.
    Можете сразу переходить к делу: «[Как внести правки в учебник?](#как-внести-правки-в-учебник)» + +Понимание структуры понадобится в случае, если вы хотите сделать крупные изменения: например, добавить новую статью с задачами (или добавить задачи к существующей статье). +___ + +Каждому разделу, статье или задаче соответствует директория. + +Эта директория имеет вид `N-url`, где `N` - это номер для сортировки статей и разделов (они упорядочены), а `url` – URL-имя, по которому материал будет доступен. + +**В директории [1-js](1-js) находятся все разделы из первой части учебника («Введение», «Основы JavaScript», ... ).**
    Каждая директория в [1-js](1-js) — это раздел: + +* Директория 01-getting-started => Раздел «Введение» +* Директория 02-first-steps => Раздел «Основы JavaScript» +* и так далее... (по названиям директорий можно интуитивно догадаться, что это за раздел) + +В этих директориях содержатся все статьи конкретного раздела (каждой статье соответствует определенная директория): для примера возьмём раздел «Введение» (директория 01-getting-started). В разделе «Введение» **4** статьи. Вот как это выглядит в Github: + +В директории 01-getting-started: + +* Директория 1-intro => Статья «Введение в Javascript» +* Директория 2-manuals-specifications => Статья «Справочники и спецификации» +* Директория 3-code-editors => Статья «Редакторы кода» +* Директория 4-devtools => Статья «Консоль разработчика» +* index.md => файл, который находится в каждом разделе. В нём содержится название и описание конкретного раздела. + + ![](https://imgur.com/J8fgF4A) + +Вот структура файлов в директории каждой статьи: + +![](https://imgur.com/ximFqjq) + +**Обратите внимание:** 1) не в каждой статье есть задачи 2) не в каждой задаче есть интерактивная демонстрация + +**В директории [2-ui](2-ui) находятся все разделы со статьями из второй части учебника («Документ», «Введение в события», ... ).**
    Структура такая же, как описано выше. + +**Структура третьей части учебника несколько иная.**
    Нет директории, которая объединяет все разделы со статьями (в отличие от первой и второй части учебника). +Все разделы третьей части учебника со статьями просто расположены в репозитории: + +* Директория 3-frames-and-windows => Раздел «Фреймы и окна» +* Директория 4-binary => Раздел «Бинарные данные и файлы» +* Директория 5-network => Раздел «Сетевые запросы» +* Директория 6-data-storage => Раздел «Хранение данных в браузере» +* Директория 7-animation => Раздел «Анимация» +* Директория 8-web-components => Раздел «Веб-компоненты» +* Директория 9-regular-expressions => Раздел «Регулярные выражения» +* Директория 20-css-for-js => Раздел «CSS для JavaScript-разработчика» + +**[99-archive](99-archive) — архив устаревших статей.**
    В данной директории находятся статьи, которые по той или иной причине утратили свою актуальность. Эти статьи скрыты из оглавления сайта учебника. В репозитории английской версии учебника данного архива нет. + +___ + +### Запуск учебника локально + +Для удобства редактирования учебник можно запустить локально. + +Сервер для этого находится здесь: https://github.com/javascript-tutorial/server. + +В `README.md` находится инструкция по запуску сервера. + +___ + +### Как внести правки в учебник? + +**Если вы хотите отредактировать только одну статью/задачу** + +1. Откройте статью, которую собираетесь редактировать. Нажмите «**Редактировать на Github**»: + + ![](https://imgur.com/sAkEbHD) + +2. Выберите необходимый файл: + + ![files_explanation](https://imgur.com/ximFqjq) + + **Обратите внимание:** 1) не в каждой статье есть задачи 2) не в каждой задаче есть интерактивная демонстрация + +3. Нажмите на «✏»: + + ![](https://imgur.com/dtzfg3r) + + После чего выберите «**Fork this repository**»: + + ![](https://imgur.com/iM1EiAV) + + Теперь вы создали копию учебника. Всё, что вы делаете в этой копии, никак не влияет на исходный материал учебника (пока вы не отправили ваши правки на рассмотрение). + +4. Отредактируйте файл. Далее следуйте указаниям на картинке ниже (согласно нумерации): + + ![](https://imgur.com/lh4fXxk) + + +5. Нажмите «**Create pull request**»: + + ![](https://imgur.com/54QNimX) + + После чего следуйте указаниям на картинке ниже: + + ![](https://imgur.com/Lt01kHy) + + Вы отправили правки на рассмотрение. Теперь остаётся только внимательно следить за уведомлениями на Github. + +**Если вы хотите отредактировать сразу несколько статей/задач (или добавить новую статью/задачу)** + +1. Откройте репозиторий учебника. Нажмите на «**Fork**»: + + ![](https://imgur.com/VEN8lm9) + +2. Нажмите «**Create fork**»: + + ![](https://imgur.com/yjP46p0) + + Теперь вы создали копию учебника. Всё, что вы изменяете/создаёте в этой копии, никак не влияет на исходный материал учебника (пока вы не отправили ваши правки на рассмотрение). + +4. Выберите необходимый файл согласно [структуре учебника](#структура-учебника) (или создайте его, если добавляете новую статью/задачу). После чего нажмите на «✏»: + + ![](https://imgur.com/IYVkr4U) + +5. Отредактируйте файл. Далее следуйте указаниям на картинке ниже (согласно нумерации): + + ![](https://imgur.com/5CFfvVx) + + После чего можете создавать любые другие файлы (или изменять существующие) и редактировать их по той же схеме. + +6. Как закончите редактировать файлы, перейдите на страницу созданной вами копии учебника. Далее следуйте указаниям на картинке ниже (согласно нумерации): + + ![contribute_explan](https://imgur.com/6lKMoNr) + +7. После этого следуйте указаниям на картинке ниже: + + ![](https://imgur.com/94boTqE) + + Вы отправили правки на рассмотрение. Теперь остаётся только внимательно следить за увемодлениями на Github. + +#### Если вы — опытный пользователь Github, можете использовать Github Desktop или git для внесения правок. Выше описаны самые простые способы, подходящие для новичков. + +___ + +### Как переводить материалы из английской версии учебника? + +Перевод не обязательно должен быть слово-в-слово. Он должен быть без ошибок и, по сути, верным, хорошо объясняющим. + +Если вы видите, что переведённый текст может быть улучшен, пожалуйста, [пришлите нам свои правки](#как-внести-правки-в-учебник). + +![](https://imgur.com/ZiKy04k) + +**Текст в коде** + +- Комментарии в коде – переводить. +- Строки в примерах – можно переводить, но не обязательно. +- Названия переменных, классы, идентификаторы – не надо переводить. + +Например: + +```js +// Example +const text = "Hello, world"; +document.querySelector('.hello').innerHTML = text; +``` + +✅ ХОРОШО (переведён комментарий): + +```js +// Пример +const text = 'Hello, world'; +document.querySelector('.hello').innerHTML = text; +``` + +✅ ТОЖЕ ОК (переведён комментарий и текст): + +```js +// Пример +const text = 'Привет, мир'; +document.querySelector('.hello').innerHTML = text; +``` + +**Внешние ссылки** + +Если есть внешняя ссылка на MDN или Wikipedia, например https://en.wikipedia.org/wiki/JavaScript, но есть версия этой же статьи на русском, поменяйте ссылку. + +Например: + +```md +[JavaScript](https://en.wikipedia.org/wiki/JavaScript) is a programming language. +``` + +✅ ПОСЛЕ ЗАМЕНЫ (en -> ru): + +```md +[JavaScript](https://ru.wikipedia.org/wiki/JavaScript) – это язык программирования. +``` + +Если статья на MDN переведена частично, это тоже подходит. + +В случае, если у ссылки нет эквивалента на русском, оставьте её как есть. + +**Соглашение по переводу (глоссарий)** + +**Пожалуйста, поддерживайте глоссарий в алфавитном порядке.** + +| Оригинальный термин | Перевод | +| :--------------------- | :----------------------------------------------------------------------------- | +| Arrow function | Стрелочная функция | +| Backtick | Обратная кавычка | +| Bitwise operator | Побитовый оператор | +| Breakpoint | Точка останова | +| Character class | Символьный класс | +| Comparison | Операция сравнения | +| Construct | Конструкция | +| Conversion | Конвертирование | +| Functionality | Функциональность | +| Left click/right click | Левый/правый клик? Кликните? левой кнопкой мыши | +| More in / Details in | Подробнее в | +| Nullish coalescing operator | Оператор нулевого слияния | +| Script | Скрипт | +| “Short-circuit” evaluation | Сокращённое вычисление +| Statement | Инструкция | +| Summary | Итого | + +**Ресурсы по переводу** + +Чтобы улучшить ваш перевод и, вообще, письмо, полезные статьи: + +* [Берегись канцелярита!](http://www.vavilon.ru/noragal/slovo2.html) +* [Словесная алгебра](http://www.vavilon.ru/noragal/slovo4.html) +* [Поиск переводов в контексте](https://context.reverso.net/перевод/) +* [DeepL - переводчик на нейросетях](https://www.deepl.com/translator) + +**Несколько деталей** + +* *Вы* и его производные пишите с маленькой буквы +* Всегда используйте букву `ё` ([этот npm-пакет](https://github.com/hcodes/eyo) может проверить текст и вставить её, где нужно) +* Не знаете, как перевести английский термин? [Словарь «Веб-стандартов»](https://github.com/web-standards-ru/dictionary/blob/main/dictionary.md) поможет! +* Названия компаний (Google), библиотек (Jest) и аббревиатуры (DOM) не переводятся. +* **importance: n** встречающееся в начале задач - служебное поле, перевод не требуется. + +___ + +### Как добавить строку кода? + +\`// ... код ... //\` + +___ + +### Как добавить блок кода? + +JavaScript: + +`````js +```js +// ... код ... // +``` +````` + +HTML: + +`````js +```html +// ... код ... // +``` +````` + +CSS: + +`````js +```css +// ... код ... // +``` +````` + +Если блок кода находится внутри информационного/предупреждающего блока, нужно использовать 4 обратных кавычки `: + +`````` +````smart header="Информационный блок" + +```js +// ... код ... // +``` + +```` +`````` + +Чтобы добавить кнопки ![](https://imgur.com/Wqn87Rb) в правый верхний угол блока кода, нужно добавить **run**: + +`````js +```js run +// ... код ... // +``` +````` + +Чтобы JS-код запускался в нестрогом режиме, нужно добавить **no-strict** (по умолчанию все блоки кода запускаются с использованием строгого режима `"use strict"`): + +`````js +```js run no-strict +// ... код ... // +``` +````` + +Чтобы отключить [подсветку синтаксиса](https://ru.wikipedia.org/wiki/Подсветка_синтаксиса) в блоке кода, нужно добавить **no-beautify**: + +`````js +```js no-beautify +// ... код ... // +``` +````` + +Ключевые слова **run**, **no-strict**, **no-beautify** можно комбинировать: + +`````js +```js run no-strict no-beautify +// ... код ... // +``` +````` + +Чтобы выделить определенную часть кода, нужно поместить её в `*!* */!*`: + +```js +let year = prompt('В каком году была опубликована спецификация ECMAScript-2015?', ''); + +*!* +if (year == 2015) alert( 'Вы правы!' ); +*/!* +``` + +![](https://imgur.com/RvqZMfV) + +Также `*!* */!*` можно использовать в одной строке: + +```js +let user = { + name: "John", + go: function() { alert(this.name) } +}*!*;*/!* + +(user.go)() // John +``` + +![](https://imgur.com/YNcjyUf) + +___ + +### Как добавить информационный блок? + +![](https://imgur.com/6qSUxIQ) + +```` +```smart header="Название информационного блока" + +Текст + +``` +```` + +Если внутри информационного блока находятся блоки кода, нужно использовать 4 обратных кавычки `: + +````` +````smart header="Название информационного блока" + +```js +// ... код ... // +``` + +```` +````` + +Если в названии информационного блока находятся двойные кавычки `"`, их нужно экранировать (`\"`): + +````` +````smart header="\"Название\"" + +Текст + +```` +````` + +___ + +### Как добавить предупреждающий блок? + +![](https://imgur.com/DEY0IdE) + +```` +```warn header="Название предупреждающего блока" + +Текст + +``` +```` + +Если внутри предупреждающего блока находятся блоки кода, нужно использовать 4 обратных кавычки `: + +````` +````warn header="Название предупреждающего блока" + +```js +// ... код ... // +``` + +```` +````` + +Если в названии предупреждающего блока находятся двойные кавычки `"`, их нужно экранировать (`\"`): + +````` +````warn header="\"Название\"" + +Текст + +```` +````` + +___ + +### Как добавить блок «Новая возможность»? + +![](https://imgur.com/RZM2ZEN) + + +``` +[recent browser="new"] +``` + +___ + +### Как добавить ссылку на другую статью из учебника? + +![](https://imgur.com/K1bPgIx) + +- (У них также нет \`super\`, но мы про это не говорили. Про это будет в главе \). + +В `` указывается название, по которому статья будет доступна в учебнике. + +Это название можно найти в Github: + +![](https://imgur.com/xScEKkL) + +...Или в адресной строке браузера: + +![](https://imgur.com/tQ0fbPB) + +___ + +### Как добавить изображение в статью или задачу? + +![](https://imgur.com/PvIevN5) + +1. Загрузите изображение в директорию со статьёй (или в директорию с задачей) +2. Добавьте изображение в определённой части `article.md` (или `task.md`/`solution.md`, если добавляете изображение в условие/решение задачи): + + ``` + ![](название_изображения.png) + ``` \ No newline at end of file diff --git a/PROGRESS.md b/PROGRESS.md deleted file mode 100644 index b6671c63a2..0000000000 --- a/PROGRESS.md +++ /dev/null @@ -1,266 +0,0 @@ - -## Maintainer List - -@iliakan - -## For New Translators - -To translate a page: - -1. Check that no one else has claimed your page in the checklist and comments below. -2. Comment below with the name of the page you would like to translate. **Please take only one page at a time**. -3. Clone this repo, translate your page, and submit a pull request! - -Before contributing, read the glossary and style guide (once they exist) to understand how to translate various technical and React-specific terms. - -Please be prompt with your translations! If you find find that you can't commit any more, let the maintainers know so they can assign the page to someone else. - -## For Maintainers - -When someone volunteers, edit this issue with the username of the volunteer, and with the PR. Ex: - -* [ ] Home Page (@lex111) #1 - -When PRs are merged, make sure to mark that page as completed! - -## The JavaScript language - - -### An introduction - -* [ ] An Introduction to JavaScript -* [ ] Code editors -* [ ] Developer console - -### JavaScript Fundamentals - -* [ ] Hello, world! -* [ ] Code structure -* [ ] The modern mode, "use strict" -* [ ] Variables -* [ ] Data types -* [ ] Type Conversions -* [ ] Operators -* [ ] Comparisons -* [ ] Interaction: alert, prompt, confirm -* [ ] Conditional operators: if, '?' -* [ ] Logical operators -* [ ] Loops: while and for -* [ ] The "switch" statement -* [ ] Functions -* [ ] Function expressions and arrows -* [ ] JavaScript specials - -### Code quality - -* [ ] Debugging in Chrome -* [ ] Coding Style -* [ ] Comments -* [ ] Ninja code -* [ ] Automated testing with mocha -* [ ] Polyfills - -### Objects: the basics - -* [ ] Objects -* [ ] Garbage collection -* [ ] Symbol type -* [ ] Object methods, "this" -* [ ] Object to primitive conversion -* [ ] Constructor, operator "new" - -### Data types - -* [ ] Methods of primitives -* [ ] Numbers -* [ ] Strings -* [ ] Arrays -* [ ] Array methods -* [ ] Iterables -* [ ] Map, Set, WeakMap and WeakSet -* [ ] Object.keys, values, entries -* [ ] Destructuring assignment -* [ ] Date and time -* [ ] JSON methods, toJSON - -### Advanced working with functions - -* [ ] Recursion and stack -* [ ] Rest parameters and spread operator -* [ ] Closure -* [ ] The old "var" -* [ ] Global object -* [ ] Function object, NFE -* [ ] The "new Function" syntax -* [ ] Scheduling: setTimeout and setInterval -* [ ] Decorators and forwarding, call/apply -* [ ] Function binding -* [ ] Currying and partials -* [ ] Arrow functions revisited - -### Object properties configuration - -* [ ] Property flags and descriptors -* [ ] Property getters and setters - -### Prototypes, inheritance - -* [ ] Prototypal inheritance -* [ ] F.prototype -* [ ] Native prototypes -* [ ] Prototype methods, objects without __proto__ -* [ ] Getting all properties - -### Classes - -* [ ] Class patterns -* [ ] Classes -* [ ] Class inheritance -* [ ] Static properties and methods -* [ ] Private and protected properties and methods -* [ ] Extending build-in classes -* [ ] Class checking: "instanceof" -* [ ] Mixins - -### Error handling - -* [ ] Error handling, "try..catch" -* [ ] Custom errors, extending Error - -### Promises, async/await - -* [ ] Introduction: callbacks -* [ ] Promise -* [ ] Promises chaining -* [ ] Error handling with promises -* [ ] Promise API -* [ ] Promisification -* [ ] Microtasks and event loop -* [ ] Async/await - -### Generators, advanced iteration - -* [ ] Generators -* [ ] Async iteration and generators - -### Modules - -* [ ] Modules, introduction -* [ ] Export and Import -* [ ] Dynamic imports - -## Browser: Document, Events, Interfaces - - -### Document - -* [ ] Browser environment, specs -* [ ] DOM tree -* [ ] Walking the DOM -* [ ] Searching: getElement* and querySelector* -* [ ] Node properties: type, tag and contents -* [ ] Attributes and properties -* [ ] Modifying the document -* [ ] Styles and classes -* [ ] Element size and scrolling -* [ ] Window sizes and scrolling -* [ ] Coordinates - -### Introduction into Events - -* [ ] Introduction to browser events -* [ ] Bubbling and capturing -* [ ] Event delegation -* [ ] Browser default actions -* [ ] Dispatching custom events - -### UI Events - -* [ ] Mouse events basics -* [ ] Moving: mouseover/out, mouseenter/leave -* [ ] Drag'n'Drop with mouse events -* [ ] Keyboard: keydown and keyup -* [ ] Scrolling - -### Forms, controls - -* [ ] Form properties and methods -* [ ] Focusing: focus/blur -* [ ] Events: change, input, cut, copy, paste -* [ ] Form submission: event and method submit - -### Document and resource loading - -* [ ] Page: DOMContentLoaded, load, beforeunload, unload -* [ ] Scripts: async, defer -* [ ] Resource loading: onload and onerror - -## Frames and windows - -* [ ] Popups and window methods -* [ ] Cross-window communication -* [ ] The clickjacking attack - -## Binary data, files - -* [ ] ArrayBuffer, binary arrays -* [ ] TextDecoder and TextEncoder -* [ ] Blob -* [ ] File and FileReader - -## Network requests - -* [ ] Fetch: Basics -* [ ] Fetch: Download progress -* [ ] Fetch: Abort -* [ ] Fetch: Cross-Origin Requests -* [ ] Fetch API -* [ ] URL objects -* [ ] XMLHttpRequest -* [ ] WebSocket - -## Storing data in the browser - -* [ ] Cookies, document.cookie -* [ ] LocalStorage, sessionStorage -* [ ] IndexedDB - -## Animation - -* [ ] Bezier curve -* [ ] CSS-animations -* [ ] JavaScript animations - -## Web components - -* [ ] From the orbital height -* [ ] Custom elements -* [ ] Shadow DOM -* [ ] Template element -* [ ] Shadow DOM slots, composition -* [ ] Shadow DOM styling -* [ ] Shadow DOM and events - -## Regular expressions - -* [ ] Patterns and flags -* [ ] Methods of RegExp and String -* [ ] Character classes -* [ ] Escaping, special characters -* [ ] Sets and ranges [...] -* [ ] Quantifiers +, *, ? and {n} -* [ ] Greedy and lazy quantifiers -* [ ] Capturing groups -* [ ] Backreferences in pattern: \n and \k -* [ ] Alternation (OR) | -* [ ] String start ^ and finish $ -* [ ] Multiline mode, flag "m" -* [ ] Lookahead and lookbehind -* [ ] Infinite backtracking problem -* [ ] Unicode: flag "u" -* [ ] Unicode character properties \p -* [ ] Sticky flag "y", searching at position - -## Miscellaneous - -* [ ] Mutation observer diff --git a/README.md b/README.md index 8843571328..44fcc39037 100755 --- a/README.md +++ b/README.md @@ -5,35 +5,19 @@ Здесь находится текст Современного Учебника JavaScript, опубликованного на https://learn.javascript.ru. -Недавно он был почти полностью переписан, основываясь на английской редакции, если что не так - пожалуйста, пришлите исправляющий Pull Request 👏 +# Внесение правок -**Нужна помощь с [разделом по CSS](https://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉.** +JavaScript — это активно развивающийся язык, в который постоянно добавляется что-то новое. -# Структура +Мы стараемся, насколько это возможно, следить за всеми новинками и обновлениями. Но иногда всё-же что-то остаётся незамеченным. -Каждому разделу, статье или задаче соответствует директория. +Если вы считаете, что какая-либо информация из учебника уже неактуальна (или может быть улучшена), — мы всегда будем рады рассмотреть ваши предложения по усовершенствованию материала 😄. -Эта директория имеет вид `N-url`, где `N` - это номер для сортировки статей и разделов (они упорядочены), а `url` – URL-имя, по которому материал будет доступен. +Мы также приветствуем добавление новых статей и задач в учебник. -В директории находится один из файлов: +О том, как внести правки в [learn.javascript.ru](https://learn.javascript.ru), можно прочитать [здесь](CONTRIBUTING.md). - - `index.md` для раздела - - `article.md` для статьи - - `task.md` для условия задачи (+там же `solution.md` с решением) - -Каждый из этих файлов начинается с `# Заголовка материала`, и дальше текст в формате а-ля Markdown. Его довольно просто понять. Для редактирования достаточно простого текстового редактора. - -Ресурсы и примеры, необходимые для статьи, раздела или задачи, находятся в её директории. На них можно ссылаться из материала. - -# Запуск локально - -Для удобства редактирования учебник можно запустить локально. - -Сервер для этого находится здесь: . - -# Перевод с английского - -При переводе статей ознакомьтесь с [рекомендациями по переводу](https://github.com/javascript-tutorial/ru.javascript.info/blob/master/TRANSLATION.md)! +**(сейчас нужна помощь с [разделом по CSS](https://learn.javascript.ru/css-for-js), его хорошо бы обновить 😉)** --- ♥ diff --git a/TRANSLATION.md b/TRANSLATION.md deleted file mode 100644 index 2730bc7a7e..0000000000 --- a/TRANSLATION.md +++ /dev/null @@ -1,102 +0,0 @@ -# Перевод - -Перевод не обязательно должен быть слово-в-слово. - -Он должен быть без ошибок и, по сути, верным, хорошо объясняющим. - -Если вы видите, что исходный текст может быть улучшен – отлично, пришлите, пожалуйста, PR. - -> **Важно!** -> -> Сохраняйте переносы строк (пустые строки) и структуру абзацев «как есть»: это упрощает объединение будущих изменений из английской версии в перевод. - -## Текст в коде - -- Комментарии в коде – переводить. -- Строки в примерах – можно переводить, но не обязательно. -- Названия переменных, классы, идентификаторы – не надо переводить. - -Например: - -```js -// Example -const text = "Hello, world"; -document.querySelector('.hello').innerHTML = text; -``` - -✅ ХОРОШО (переведён комментарий): - -```js -// Пример -const text = 'Hello, world'; -document.querySelector('.hello').innerHTML = text; -``` - -✅ ТОЖЕ ОК (переведён комментарий и текст): - -```js -// Пример -const text = 'Привет, мир'; -document.querySelector('.hello').innerHTML = text; -``` - - -## Внешние ссылки - -Если есть внешняя ссылка на MDN или Wikipedia, например https://en.wikipedia.org/wiki/JavaScript, но есть версия этой же статьи на русском, поменяйте ссылку. - -Например: - -```md -[JavaScript](https://en.wikipedia.org/wiki/JavaScript) is a programming language. -``` - -✅ ПОСЛЕ ЗАМЕНЫ (en -> ru): - -```md -[JavaScript](https://ru.wikipedia.org/wiki/JavaScript) – это язык программирования. -``` - -Если статья на MDN переведена частично, это тоже подходит. - -В случае, если у ссылки нет эквивалента на русском, оставьте её как есть. - -## И ещё пара деталей :) - -- _Вы_ и его производные пишите с маленькой буквы -- Используйте букву `ё` ([этот npm-пакет](https://github.com/hcodes/eyo) может проверить текст и вставить её, где нужно) -- Не знаете, как перевести термин? [Словарь «Веб-стандартов»](https://github.com/web-standards-ru/dictionary/blob/main/dictionary.md) поможет! -- Названия компаний (Google), библиотек (Jest) и аббревиатуры (DOM) не переводятся. -- **importance: n** встречающееся в начале задач - служебное поле, перевод не требуется. - -## Соглашение по переводу (глоссарий) - -**Пожалуйста, поддерживайте глоссарий в алфавитном порядке.** - -| Оригинальный термин | Перевод | -| :--------------------- | :----------------------------------------------------------------------------- | -| Arrow function | Стрелочная функция | -| Backtick | Обратная кавычка | -| Bitwise operator | Побитовый оператор | -| Breakpoint | Точка останова | -| Character class | Символьный класс | -| Comparison | Операция сравнения | -| Construct | Конструкция | -| Conversion | Конвертирование | -| Functionality | Функциональность | -| Left click/right click | Левый/правый клик? Кликните? левой кнопкой мыши | -| More in / Details in | Подробнее в | -| Nullish coalescing operator | Оператор нулевого слияния | -| Script | Скрипт | -| “Short-circuit” evaluation | Сокращённое вычисление -| Statement | Инструкция | -| Summary | Итого | - -## Ресурсы по переводу - -Чтобы улучшить ваш перевод и, вообще, письмо, полезные статьи: - -* [Берегись канцелярита!](http://www.vavilon.ru/noragal/slovo2.html) -* [Словесная алгебра](http://www.vavilon.ru/noragal/slovo4.html) -* [Поиск переводов в контексте](https://context.reverso.net/перевод/) -* [DeepL - переводчик на нейросетях](https://www.deepl.com/translator) From 760d3ee1c7ee9a6b9a38ec9a947ddd2d55ba6219 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 24 Aug 2023 23:05:57 +0300 Subject: [PATCH 0948/1128] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb82e64571..861e0e3491 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,7 +79,7 @@ ___ * Директория 4-devtools => Статья «Консоль разработчика» * index.md => файл, который находится в каждом разделе. В нём содержится название и описание конкретного раздела. - ![](https://imgur.com/J8fgF4A) + ![](https://imgur.com/J8fgF4A.png) Вот структура файлов в директории каждой статьи: @@ -503,4 +503,4 @@ ___ ``` ![](название_изображения.png) - ``` \ No newline at end of file + ``` From 98bdf9bd8bc50da415d9c29a964d700b0a6420a4 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 24 Aug 2023 23:07:29 +0300 Subject: [PATCH 0949/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 861e0e3491..0003059594 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -83,7 +83,7 @@ ___ Вот структура файлов в директории каждой статьи: -![](https://imgur.com/ximFqjq) +![](https://imgur.com/ximFqjq.png) **Обратите внимание:** 1) не в каждой статье есть задачи 2) не в каждой задаче есть интерактивная демонстрация @@ -121,36 +121,36 @@ ___ 1. Откройте статью, которую собираетесь редактировать. Нажмите «**Редактировать на Github**»: - ![](https://imgur.com/sAkEbHD) + ![](https://imgur.com/sAkEbHD.png) 2. Выберите необходимый файл: - ![files_explanation](https://imgur.com/ximFqjq) + ![files_explanation](https://imgur.com/ximFqjq.png) **Обратите внимание:** 1) не в каждой статье есть задачи 2) не в каждой задаче есть интерактивная демонстрация 3. Нажмите на «✏»: - ![](https://imgur.com/dtzfg3r) + ![](https://imgur.com/dtzfg3r.png) После чего выберите «**Fork this repository**»: - ![](https://imgur.com/iM1EiAV) + ![](https://imgur.com/iM1EiAV.png) Теперь вы создали копию учебника. Всё, что вы делаете в этой копии, никак не влияет на исходный материал учебника (пока вы не отправили ваши правки на рассмотрение). 4. Отредактируйте файл. Далее следуйте указаниям на картинке ниже (согласно нумерации): - ![](https://imgur.com/lh4fXxk) + ![](https://imgur.com/lh4fXxk.png) 5. Нажмите «**Create pull request**»: - ![](https://imgur.com/54QNimX) + ![](https://imgur.com/54QNimX.png) После чего следуйте указаниям на картинке ниже: - ![](https://imgur.com/Lt01kHy) + ![](https://imgur.com/Lt01kHy.png) Вы отправили правки на рассмотрение. Теперь остаётся только внимательно следить за уведомлениями на Github. @@ -158,31 +158,31 @@ ___ 1. Откройте репозиторий учебника. Нажмите на «**Fork**»: - ![](https://imgur.com/VEN8lm9) + ![](https://imgur.com/VEN8lm9.png) 2. Нажмите «**Create fork**»: - ![](https://imgur.com/yjP46p0) + ![](https://imgur.com/yjP46p0.png) Теперь вы создали копию учебника. Всё, что вы изменяете/создаёте в этой копии, никак не влияет на исходный материал учебника (пока вы не отправили ваши правки на рассмотрение). 4. Выберите необходимый файл согласно [структуре учебника](#структура-учебника) (или создайте его, если добавляете новую статью/задачу). После чего нажмите на «✏»: - ![](https://imgur.com/IYVkr4U) + ![](https://imgur.com/IYVkr4U.png) 5. Отредактируйте файл. Далее следуйте указаниям на картинке ниже (согласно нумерации): - ![](https://imgur.com/5CFfvVx) + ![](https://imgur.com/5CFfvVx.png) После чего можете создавать любые другие файлы (или изменять существующие) и редактировать их по той же схеме. 6. Как закончите редактировать файлы, перейдите на страницу созданной вами копии учебника. Далее следуйте указаниям на картинке ниже (согласно нумерации): - ![contribute_explan](https://imgur.com/6lKMoNr) + ![](https://imgur.com/6lKMoNr.png) 7. После этого следуйте указаниям на картинке ниже: - ![](https://imgur.com/94boTqE) + ![](https://imgur.com/94boTqE.png) Вы отправили правки на рассмотрение. Теперь остаётся только внимательно следить за увемодлениями на Github. @@ -196,7 +196,7 @@ ___ Если вы видите, что переведённый текст может быть улучшен, пожалуйста, [пришлите нам свои правки](#как-внести-правки-в-учебник). -![](https://imgur.com/ZiKy04k) +![](https://imgur.com/ZiKy04k.png) **Текст в коде** @@ -334,7 +334,7 @@ ___ ```` `````` -Чтобы добавить кнопки ![](https://imgur.com/Wqn87Rb) в правый верхний угол блока кода, нужно добавить **run**: +Чтобы добавить кнопки ![](https://imgur.com/Wqn87Rb.png) в правый верхний угол блока кода, нужно добавить **run**: `````js ```js run @@ -376,7 +376,7 @@ if (year == 2015) alert( 'Вы правы!' ); */!* ``` -![](https://imgur.com/RvqZMfV) +![](https://imgur.com/RvqZMfV.png) Также `*!* */!*` можно использовать в одной строке: @@ -389,13 +389,13 @@ let user = { (user.go)() // John ``` -![](https://imgur.com/YNcjyUf) +![](https://imgur.com/YNcjyUf.png) ___ ### Как добавить информационный блок? -![](https://imgur.com/6qSUxIQ) +![](https://imgur.com/6qSUxIQ.png) ```` ```smart header="Название информационного блока" @@ -431,7 +431,7 @@ ___ ### Как добавить предупреждающий блок? -![](https://imgur.com/DEY0IdE) +![](https://imgur.com/DEY0IdE.png) ```` ```warn header="Название предупреждающего блока" @@ -467,7 +467,7 @@ ___ ### Как добавить блок «Новая возможность»? -![](https://imgur.com/RZM2ZEN) +![](https://imgur.com/RZM2ZEN.png) ``` @@ -478,7 +478,7 @@ ___ ### Как добавить ссылку на другую статью из учебника? -![](https://imgur.com/K1bPgIx) +![](https://imgur.com/K1bPgIx.png) - (У них также нет \`super\`, но мы про это не говорили. Про это будет в главе \). @@ -486,17 +486,17 @@ ___ Это название можно найти в Github: -![](https://imgur.com/xScEKkL) +![](https://imgur.com/xScEKkL.png) ...Или в адресной строке браузера: -![](https://imgur.com/tQ0fbPB) +![](https://imgur.com/tQ0fbPB.png) ___ ### Как добавить изображение в статью или задачу? -![](https://imgur.com/PvIevN5) +![](https://imgur.com/PvIevN5.png) 1. Загрузите изображение в директорию со статьёй (или в директорию с задачей) 2. Добавьте изображение в определённой части `article.md` (или `task.md`/`solution.md`, если добавляете изображение в условие/решение задачи): From 9e5070250f88cb30bc2cdd9ffae077710a0e9d68 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 24 Aug 2023 23:38:41 +0300 Subject: [PATCH 0950/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0003059594..526c8ee949 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -83,7 +83,7 @@ ___ Вот структура файлов в директории каждой статьи: -![](https://imgur.com/ximFqjq.png) +![](https://imgur.com/QbIHhzL.png) **Обратите внимание:** 1) не в каждой статье есть задачи 2) не в каждой задаче есть интерактивная демонстрация @@ -125,7 +125,7 @@ ___ 2. Выберите необходимый файл: - ![files_explanation](https://imgur.com/ximFqjq.png) + ![](https://imgur.com/QbIHhzL.png) **Обратите внимание:** 1) не в каждой статье есть задачи 2) не в каждой задаче есть интерактивная демонстрация From 01beceefd3e1fbb83a8142bb6e866b73427a7685 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Fri, 25 Aug 2023 00:27:38 +0300 Subject: [PATCH 0951/1128] Update issue templates --- .github/ISSUE_TEMPLATE/custom.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/custom.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md new file mode 100644 index 0000000000..48d5f81fa4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/custom.md @@ -0,0 +1,10 @@ +--- +name: Custom issue template +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + From ac08a1fcddf5ae528d440a21f051a2a78d789da1 Mon Sep 17 00:00:00 2001 From: Alexandre887 Date: Fri, 25 Aug 2023 00:29:07 +0300 Subject: [PATCH 0952/1128] Revert "Update issue templates" This reverts commit 01beceefd3e1fbb83a8142bb6e866b73427a7685. --- .github/ISSUE_TEMPLATE/custom.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/custom.md diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 48d5f81fa4..0000000000 --- a/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' -labels: '' -assignees: '' - ---- - - From 6b405ce9e262f979cc29eb11e883f504695b7aa6 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Fri, 25 Aug 2023 16:06:24 +0300 Subject: [PATCH 0953/1128] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BF=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=8F=D1=82=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/12-json/article.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index 9fce43ec46..fa4b0b9c84 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -440,11 +440,11 @@ JSON может быть настолько сложным, насколько ```js let json = `{ - *!*name*/!*: "John", // Ошибка: имя свойства без кавычек - "surname": *!*'Smith'*/!*, // Ошибка: одинарные кавычки в значении (должны быть двойными) - *!*'isAdmin'*/!*: false // Ошибка: одинарные кавычки в ключе (должны быть двойными) - "birthday": *!*new Date(2000, 2, 3)*/!*, // Ошибка: не допускается конструктор "new", только значения. - "friends": [0,1,2,3] // Здесь всё в порядке + *!*name*/!*: "John", // Ошибка: имя свойства без кавычек + "surname": *!*'Smith'*/!*, // Ошибка: одинарные кавычки в значении (должны быть двойными) + *!*'isAdmin'*/!*: false, // Ошибка: одинарные кавычки в ключе (должны быть двойными) + "birthday": *!*new Date(2000, 2, 3)*/!*, // Ошибка: не допускается конструктор "new", только значения. + "friends": [0,1,2,3] // Здесь всё в порядке }`; ``` From aff34b76847630705c6fa2308b2378dd69b8f71f Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Fri, 25 Aug 2023 16:19:26 +0300 Subject: [PATCH 0954/1128] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BF=D1=83=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/06-advanced-functions/01-recursion/article.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/1-js/06-advanced-functions/01-recursion/article.md b/1-js/06-advanced-functions/01-recursion/article.md index 171679bf7f..61efd49707 100644 --- a/1-js/06-advanced-functions/01-recursion/article.md +++ b/1-js/06-advanced-functions/01-recursion/article.md @@ -453,6 +453,7 @@ let list = { value: 1 }; list.next = { value: 2 }; list.next.next = { value: 3 }; list.next.next.next = { value: 4 }; +list.next.next.next.next = null; ``` Здесь мы можем ещё лучше увидеть, что есть несколько объектов, каждый из которых имеет `value` и `next`, указывающий на соседа. Переменная `list` является первым объектом в цепочке, поэтому, следуя по указателям `next` из неё, мы можем попасть в любой элемент. @@ -481,6 +482,7 @@ let list = { value: 1 }; list.next = { value: 2 }; list.next.next = { value: 3 }; list.next.next.next = { value: 4 }; +list.next.next.next.next = null; *!* // добавление нового элемента в список From 829a8dece993fe82b0e1b1f9d2e1e744e6a811d3 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Fri, 25 Aug 2023 16:22:36 +0300 Subject: [PATCH 0955/1128] =?UTF-8?q?=D0=A4=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/12-json/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index fa4b0b9c84..0a1d8389c3 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -444,7 +444,7 @@ let json = `{ "surname": *!*'Smith'*/!*, // Ошибка: одинарные кавычки в значении (должны быть двойными) *!*'isAdmin'*/!*: false, // Ошибка: одинарные кавычки в ключе (должны быть двойными) "birthday": *!*new Date(2000, 2, 3)*/!*, // Ошибка: не допускается конструктор "new", только значения. - "friends": [0,1,2,3] // Здесь всё в порядке + "friends": [0,1,2,3] // Здесь всё в порядке }`; ``` From 16841274aa7b7cd1eefd75a255476b8d89d06ce6 Mon Sep 17 00:00:00 2001 From: mecmep <69386369+mecmep@users.noreply.github.com> Date: Fri, 25 Aug 2023 21:15:06 +0300 Subject: [PATCH 0956/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=82=D0=B8=D0=BF=D0=B8=D1=87=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20=D0=BE=D1=82?= =?UTF-8?q?=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=8F=D1=82=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/12-json/article.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index 0a1d8389c3..f77752d229 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -440,11 +440,12 @@ JSON может быть настолько сложным, насколько ```js let json = `{ - *!*name*/!*: "John", // Ошибка: имя свойства без кавычек - "surname": *!*'Smith'*/!*, // Ошибка: одинарные кавычки в значении (должны быть двойными) - *!*'isAdmin'*/!*: false, // Ошибка: одинарные кавычки в ключе (должны быть двойными) - "birthday": *!*new Date(2000, 2, 3)*/!*, // Ошибка: не допускается конструктор "new", только значения. - "friends": [0,1,2,3] // Здесь всё в порядке + *!*name*/!*: "John", // Ошибка: имя свойства без кавычек + "surname": *!*'Smith'*/!*, // Ошибка: одинарные кавычки в значении (должны быть двойными) + *!*'isAdmin'*/!*: false, // Ошибка: одинарные кавычки в ключе (должны быть двойными) + "birthday": *!*new Date(2000, 2, 3)*/!*, // Ошибка: не допускается конструктор "new", только значения + "gender": "male"*!* */!* // Ошибка: отсутствует запятая после непоследнего значения + "friends": [0,1,2,3] // Здесь всё в порядке }`; ``` From c5c977fd63f1ceff6513935fb704d4e4d2688993 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sat, 26 Aug 2023 22:00:05 +0300 Subject: [PATCH 0957/1128] =?UTF-8?q?=D0=A8=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BB=D1=8F=20Issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.yml | 36 +++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 ++ .../ISSUE_TEMPLATE/tutorial_suggestion.yml | 52 +++++++++++++++++++ .github/ISSUE_TEMPLATE/website_suggestion.yml | 23 ++++++++ .github/ISSUE_TEMPLATE/wquestion.yml | 20 +++++++ 5 files changed, 136 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/tutorial_suggestion.yml create mode 100644 .github/ISSUE_TEMPLATE/website_suggestion.yml create mode 100644 .github/ISSUE_TEMPLATE/wquestion.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..d9846d42f6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,36 @@ +name: 🛑 Сообщить о баге +description: На сайте учебника что-то неправильно отображается; не работает; работает не так, как нужно +title: "[Баг]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + **Пожалуйста, заполните форму ниже максимально точной информацией.**
    Правильное описание бага поможет нам намного быстрее решить проблему. + - type: textarea + id: bug-description + attributes: + label: Описание + description: В чём именно заключается баг? + placeholder: | + Например: «в статье [...] неправильно отображается [...]». + validations: + required: true + - type: textarea + id: bug-reproduce + attributes: + label: Как воспроизвести? + description: Что нужно сделать, чтобы воспроизвести этот баг? + placeholder: | + Например: «чтобы воспроизвести баг, нужно: (1) открыть страницу [...] (2) перейти в раздел [...] (3) нажать на [...]». + validations: + required: true + - type: textarea + id: bug-browsers + attributes: + label: Браузер + description: В каком браузере у вас воспроизводится этот баг? Какая версия этого браузера? (можно указать несколько, если тестировали не в одном браузере) + placeholder: | + Например: «у меня воспроизводится этот баг в Chrome 116.0.5845.98» + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..ca5355a93c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Наш Discord-сервер + url: https://discord.gg/X8yWNWpTQs + about: Вопросы по JavaScript, HTML, CSS, Node.js, React, TypeScript, Vue.js, Angular, а также «code review» и обсуждение программирования в целом diff --git a/.github/ISSUE_TEMPLATE/tutorial_suggestion.yml b/.github/ISSUE_TEMPLATE/tutorial_suggestion.yml new file mode 100644 index 0000000000..fc2e5cfa77 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/tutorial_suggestion.yml @@ -0,0 +1,52 @@ +name: 📙 Предложить идею по улучшению материала учебника +description: Предложения о добавлении новых разделов/статей в учебник; о переработке существующих статей; о добавлении новых материалов в статьи +title: "[Предложение: учебник]: " +labels: ["suggestion: tutorial"] +body: + - type: markdown + attributes: + value: | + ## Не открывайте Issue в этой категории, если хотите предложить: + * Исправление/изменение кода в какой-либо из статей + * Исправление неточности/устаревшей информации в какой-либо из статей + * Исправление орфографических/пунктуационных/стилистических ошибок в какой-либо из статей + * Добавление задач в какую-либо из статей + + ...А так же любые другие **небольшие** правки, которые, на ваш взгляд, не требуют обсуждения и могут быть сразу отправлены на рассмотрение. + * «[Как внести правки в учебник?](../blob/master/CONTRIBUTING.md#как-внести-правки-в-учебник)» + ## Открывайте Issue в этой категории, если хотите предложить: + * Переработку какой-либо статьи (или переработку определенной части статьи) + * Добавление новых разделов в учебник + * Добавление новых статей в учебник + * Добавление нового материала в какую-либо из статей + * ...а так же любые другие **крупные** правки + + Перечисленные выше темы требуют предварительного обсуждения с редакторами учебника. + - type: textarea + id: suggestion-description + attributes: + label: Описание + description: Что именно вы хотите предложить? + placeholder: | + Например: «в JavaScript недавно был добавлен [...] — на мой взгляд, было бы неплохо сделать новую статью на эту тему». + validations: + required: true + - type: textarea + id: suggestion-motivation + attributes: + label: Мотивация + description: Почему предлагаемые правки действительно должны быть внесены в учебник? + placeholder: | + Например: «я считаю, что любое представление о [...] без понимания концепции [...] будет недостаточным и неполным, у читателя может сложиться ложное впечатление». + validations: + required: true + - type: dropdown + id: suggestion-question + attributes: + label: Готовы ли вы принять участие в реализации данного предложения? + description: Например, если вы предлагаете добавить новую статью — готовы ли вы заняться её написанием? + options: + - Да, я готов(а) принять участие. + - Нет, я не готов(а) принимать участие. Оставляю эту возможность редакторам учебника. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/website_suggestion.yml b/.github/ISSUE_TEMPLATE/website_suggestion.yml new file mode 100644 index 0000000000..fb2f960925 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/website_suggestion.yml @@ -0,0 +1,23 @@ +name: 🌐 Предложить идею по улучшению веб-сайта +description: Предложения о добавлении нового функционала на сайт учебника; ошибки/опечатки во вкладках «Курсы», «Тесты знаний», «Скринкасты», «о проекте» и т.д; идеи по улучшению курсов +title: "[Предложение: веб-сайт]: " +labels: ["suggestion: website"] +body: + - type: markdown + attributes: + value: | + Всё, что касается именно **веб-сайта**, на котором опубликован учебник — [https://learn.javascript.ru](https://learn.javascript.ru). + + В этой категории вы можете: + * Предложить добавление нового функционала на веб-сайт учебника + * Сообщить об ошибках/опечатках во вкладках «Курсы», «Тесты знаний», «Скринкасты», «о проекте» и т.д. + * Предложить идеи по улучшению курсов + - type: textarea + id: suggestion-description + attributes: + label: Описание + description: Что именно вы хотите предложить (или о чём хотите сообщить)? + placeholder: | + Например: «мне кажется, было бы неплохо добавить возможность [...]». + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/wquestion.yml b/.github/ISSUE_TEMPLATE/wquestion.yml new file mode 100644 index 0000000000..14e2207d8c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/wquestion.yml @@ -0,0 +1,20 @@ +name: 📨 Задать вопрос +description: Вопросы по материалу учебника; по веб-сайту; по редактированию учебника +title: "[Вопрос]: " +labels: ["question"] +body: + - type: markdown + attributes: + value: | + Любые вопросы по материалу учебника; по веб-сайту; по редактированию учебника и т.д. + + ### **Мы не консультируем по вопросам о JavaScript здесь.** Для этих целей есть [Discord-сервер](https://discord.gg/X8yWNWpTQs). + - type: textarea + id: question-description + attributes: + label: Описание + description: Какой у вас вопрос(ы)? + placeholder: | + Например: «почему раздел [...] идёт перед разделом [...], а не после него?». + validations: + required: true From 326f1eefee5210bb1079f5bcc2a27c995c52b076 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 27 Aug 2023 02:19:46 +0300 Subject: [PATCH 0958/1128] =?UTF-8?q?BigInt=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D1=80=D0=B0=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/05-types/article.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/1-js/02-first-steps/05-types/article.md b/1-js/02-first-steps/05-types/article.md index b6c2faa727..5410236e3c 100644 --- a/1-js/02-first-steps/05-types/article.md +++ b/1-js/02-first-steps/05-types/article.md @@ -68,9 +68,20 @@ n = 12.345; ## BigInt -В JavaScript тип `number` не может безопасно работать с числами, большими, чем (253-1) (т. е. `9007199254740991`) или меньшими, чем -(253-1) для отрицательных чисел. Технически, тип `number` может хранить и гораздо большие значения (вплоть до 1.7976931348623157 * 10308), однако за пределами безопасного диапазона ±(253-1) многие из чисел не могут быть представлены с помощью этого типа данных из-за ограничений, вызванных внутренним представлением чисел в двоичной форме. Например, нечётные числа, большие, чем (253-1), невозможно хранить при помощи типа `number`, они с разной точностью будут автоматически округляться до чётных значений. В то же время некоторые чётные числа, большие, чем (253-1), при помощи типа `number` хранить технически возможно (однако не стоит этого делать во избежание дальнейших ошибок). +В JavaScript тип `number` не может безопасно работать с числами, большими, чем (253-1) (т. е. `9007199254740991`) или меньшими, чем -(253-1) для отрицательных чисел. -Для большинства случаев достаточно безопасного диапазона чисел от -(253-1) до (253-1). Но иногда нам нужен диапазон действительно гигантских целых чисел без каких-либо ограничений или пропущенных значений внутри него. Например, в криптографии или при использовании метки времени ("timestamp") с микросекундами. +Если говорить совсем точно, то, технически, тип `number` *может* хранить большие целые числа (до 1.7976931348623157 * 10308), но за пределами безопасного диапазона целых чисел ±(253-1) будет ошибка точности, так как не все цифры помещаются в фиксированную 64-битную память. Поэтому можно хранить "приблизительное" значение. + +Например, эти два числа (прямо за пределами безопасного диапазона) совпадают: + +```js +console.log(9007199254740991 + 1); // 9007199254740992 +console.log(9007199254740991 + 2); // 9007199254740992 +``` + +То есть все нечетные целые числа, большие чем (253-1), вообще не могут храниться в типе `number`. + +В большинстве случаев безопасного диапазона чисел от -(253-1) до (253-1) вполне достаточно, но иногда нам требуется весь диапазон действительно гигантских целых чисел без каких-либо ограничений или пропущенных значений внутри него. Например, в криптографии или при использовании метки времени («timestamp») с микросекундами. Тип `BigInt` был добавлен в JavaScript, чтобы дать возможность работать с целыми числами произвольной длины. @@ -81,7 +92,7 @@ n = 12.345; const bigInt = 1234567890123456789012345678901234567890n; ``` -Так как `BigInt`-числа нужны достаточно редко, мы рассмотрим их в отдельной главе . Ознакомьтесь с ней, когда вам понадобятся настолько большие числа. +Так как необходимость в использовании `BigInt`--чисел появляется достаточно редко, мы рассмотрим их в отдельной главе . Ознакомьтесь с ней, когда вам понадобятся настолько большие числа. ```smart header="Поддержка" В данный момент `BigInt` поддерживается только в браузерах Firefox, Chrome, Edge и Safari, но не поддерживается в IE. From 5c870db36a67d63e9418da4cd701076cce7b8595 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 27 Aug 2023 02:31:28 +0300 Subject: [PATCH 0959/1128] =?UTF-8?q?=D0=9D=D0=B5=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D0=B0=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/99-js-misc/06-bigint/article.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-bigint/article.md b/1-js/99-js-misc/06-bigint/article.md index fcc961b768..43523dc903 100644 --- a/1-js/99-js-misc/06-bigint/article.md +++ b/1-js/99-js-misc/06-bigint/article.md @@ -54,8 +54,10 @@ alert(Number(bigint) + number); // 3 ```js run let bigint = 1n; -alert( +bigint ); // SyntaxError: Unexpected identifier +alert( +bigint ); // Ошибка! ``` + +Мы должны использовать `Number()` для преобразования `bigint` к `number`. ```` ## Операции сравнения From 683d5a1cacdb81a68317445e3239d19dc300f7f9 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 27 Aug 2023 02:32:49 +0300 Subject: [PATCH 0960/1128] `.` => `:` --- 1-js/99-js-misc/06-bigint/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/99-js-misc/06-bigint/article.md b/1-js/99-js-misc/06-bigint/article.md index 43523dc903..5f92b46238 100644 --- a/1-js/99-js-misc/06-bigint/article.md +++ b/1-js/99-js-misc/06-bigint/article.md @@ -50,7 +50,7 @@ alert(Number(bigint) + number); // 3 ````smart header="К `BigInt` числам нельзя применить унарный оператор `+`" Унарный оператор `+value` является хорошо известным способом конвертировать произвольное значение `value` в число. -Данный оператор не поддерживается при работе с `BigInt` числами. +Данный оператор не поддерживается при работе с `BigInt` числами: ```js run let bigint = 1n; From 40e179a01debda1d1f8141e690ddb47b7d597a2a Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 27 Aug 2023 02:41:53 +0300 Subject: [PATCH 0961/1128] =?UTF-8?q?=D0=91=D0=BB=D0=BE=D0=BA=20=C2=AB?= =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=C2=BB=20=D1=81=D0=BE=20?= =?UTF-8?q?=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=BE=D0=B9=20=D0=BD=D0=B0=20can?= =?UTF-8?q?iuse.com?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 526c8ee949..53e84e61b1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -474,6 +474,14 @@ ___ [recent browser="new"] ``` +Если нужно добавить блок «Новая возможность» со ссылкой на ресурс «[caniuse.com](https://caniuse.com)»: + +``` +[recent caniuse="ключевое_слово_для_поиска_на_caniuse"] +``` + +![](https://imgur.com/mZdSHQa.png) + ___ ### Как добавить ссылку на другую статью из учебника? From 93adae58e2a2d865e4df13085c4738ddfed20fee Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 27 Aug 2023 02:45:23 +0300 Subject: [PATCH 0962/1128] =?UTF-8?q?=D0=9D=D0=B5=D0=B0=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BE=D1=87=D0=BD=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/01-getting-started/2-manuals-specifications/article.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/1-js/01-getting-started/2-manuals-specifications/article.md b/1-js/01-getting-started/2-manuals-specifications/article.md index 64ed54756b..7b6bc1d704 100644 --- a/1-js/01-getting-started/2-manuals-specifications/article.md +++ b/1-js/01-getting-started/2-manuals-specifications/article.md @@ -23,11 +23,6 @@ Хотя зачастую вместо их сайта удобнее использовать какой-нибудь интернет-поисковик, вводя там запрос "MDN [что вы хотите найти]", например для поиска информации о функции `parseInt`. - -- **MSDN** – справочник от Microsoft, содержащий много информации, в том числе по JavaScript (который там часто обозначается как JScript). Если вам нужно найти что-то специфическое по браузеру Internet Explorer, лучше искать там: . - - Так же, как и в предыдущем случае, можно использовать интернет-поиск, набирая фразы типа "RegExp MSDN" или "RegExp MSDN jscript". - ## Таблицы совместимости JavaScript -- это развивающийся язык, в который постоянно добавляется что-то новое. From d5b2fe0b931adb129c9a73a30ce22d772d20d6bc Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 27 Aug 2023 02:49:48 +0300 Subject: [PATCH 0963/1128] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 53e84e61b1..a35e7cae2f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,6 +33,7 @@ ___ * [Запуск учебника локально](#запуск-учебника-локально) * [Как внести правки в учебник?](#как-внести-правки-в-учебник) * [Как переводить материалы из английской версии учебника?](#как-переводить-материалы-из-английской-версии-учебника) +* Перед тем, как делать какие-либо масштабные правки по типу добавления новой статьи, обязательно обсудите эту идею, открыв Issue в категории «Предложить идею по улучшению материала учебника» Несколько деталей @@ -154,7 +155,7 @@ ___ Вы отправили правки на рассмотрение. Теперь остаётся только внимательно следить за уведомлениями на Github. -**Если вы хотите отредактировать сразу несколько статей/задач (или добавить новую статью/задачу)** +**Если вы хотите отредактировать сразу несколько статей/задач или добавить новую статью/задачу (перед этим обязательно создайте Issue в категории «Предложить идею по улучшению материала учебника»)** 1. Откройте репозиторий учебника. Нажмите на «**Fork**»: From 5b002ff97af4c02716f935a6638adcbc4484a395 Mon Sep 17 00:00:00 2001 From: mecmep <69386369+mecmep@users.noreply.github.com> Date: Mon, 28 Aug 2023 13:45:30 +0300 Subject: [PATCH 0964/1128] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B9=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=8F=D1=82=D0=BE=D0=B9=20=D0=B8=20=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=80=D0=BC=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Aleksandras --- 1-js/05-data-types/12-json/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/12-json/article.md b/1-js/05-data-types/12-json/article.md index f77752d229..a696500ed1 100644 --- a/1-js/05-data-types/12-json/article.md +++ b/1-js/05-data-types/12-json/article.md @@ -444,8 +444,8 @@ let json = `{ "surname": *!*'Smith'*/!*, // Ошибка: одинарные кавычки в значении (должны быть двойными) *!*'isAdmin'*/!*: false, // Ошибка: одинарные кавычки в ключе (должны быть двойными) "birthday": *!*new Date(2000, 2, 3)*/!*, // Ошибка: не допускается конструктор "new", только значения - "gender": "male"*!* */!* // Ошибка: отсутствует запятая после непоследнего значения - "friends": [0,1,2,3] // Здесь всё в порядке + "gender": "male"*!* */!* // Ошибка: отсутствует запятая после непоследнего свойства + "friends": [0,1,2,3]*!*,*/!* // Ошибка: не должно быть запятой после последнего свойства }`; ``` From 6bbf8c98650663835503b4e09268308722836cdf Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Mon, 28 Aug 2023 20:46:25 +0300 Subject: [PATCH 0965/1128] =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/12-nullish-operators/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/12-nullish-operators/article.md b/1-js/02-first-steps/12-nullish-operators/article.md index 96a6301a73..273955f793 100644 --- a/1-js/02-first-steps/12-nullish-operators/article.md +++ b/1-js/02-first-steps/12-nullish-operators/article.md @@ -176,7 +176,7 @@ if (userAge === null || userAge === undefined) { x ??= y ``` -Оператор `??=` присвоит `x` значение `y` только в том случае, если `x` *не определено (`null`/`undefined`)*. +Оператор `??=` присвоит `x` значение `y` только в том случае, если `x` *не определено* (`null`/`undefined`). Теперь попробуем переписать уже знакомый нам фрагмент кода используя новый оператор: From 38cbd59a41777750c905ba1d64615bf2d43df4ea Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 31 Aug 2023 02:42:03 +0300 Subject: [PATCH 0966/1128] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/10-error-handling/1-try-catch/article.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1-js/10-error-handling/1-try-catch/article.md b/1-js/10-error-handling/1-try-catch/article.md index 669356eb3c..4f91fae4e0 100644 --- a/1-js/10-error-handling/1-try-catch/article.md +++ b/1-js/10-error-handling/1-try-catch/article.md @@ -283,17 +283,17 @@ let error = new ReferenceError(message); Например: ```js run -let error = new Error(" Ого, ошибка! o_O"); +let error = new Error("Ого, ошибка! o_O"); alert(error.name); // Error -alert(error.message); // Ого, ошибка! o_O +alert(error.message); // Ого, ошибка! o_O ``` Давайте посмотрим, какую ошибку генерирует `JSON.parse`: ```js run try { - JSON.parse("{ bad json o_O }"); + JSON.parse("{ некорректный json o_O }"); } catch(e) { *!* alert(e.name); // SyntaxError From 2905d8123f200f5080e05b188fbfdc15e0dc75c8 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 31 Aug 2023 03:04:11 +0300 Subject: [PATCH 0967/1128] =?UTF-8?q?=D0=9A=D0=BB=D0=B0=D0=B2=D0=B8=D1=88?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a35e7cae2f..696ed5bb5b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,6 +16,7 @@ 10. [Как добавить блок «Новая возможность»?](#как-добавить-блок-новая-возможность) 11. [Как добавить ссылку на другую статью из учебника?](#как-добавить-ссылку-на-другую-статью-из-учебника) 12. [Как добавить изображение в статью или задачу?](#как-добавить-изображение-в-статью-или-задачу) +13. [Как добавить клавишу в текст?][#как-добавить-клавишу-в-текст] ___ @@ -513,3 +514,13 @@ ___ ``` ![](название_изображения.png) ``` + +___ + +### Как добавить клавишу в текст? + +![](https://imgur.com/a4KglZW.png) + +``` +Обычно при нажатии `key:Enter` введённая строка кода сразу выполняется. +``` From 0e9acba09d2843a162295871043879ba5a3ca7ad Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Thu, 31 Aug 2023 03:04:28 +0300 Subject: [PATCH 0968/1128] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 696ed5bb5b..506c6e0f49 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,7 +16,7 @@ 10. [Как добавить блок «Новая возможность»?](#как-добавить-блок-новая-возможность) 11. [Как добавить ссылку на другую статью из учебника?](#как-добавить-ссылку-на-другую-статью-из-учебника) 12. [Как добавить изображение в статью или задачу?](#как-добавить-изображение-в-статью-или-задачу) -13. [Как добавить клавишу в текст?][#как-добавить-клавишу-в-текст] +13. [Как добавить клавишу в текст?](#как-добавить-клавишу-в-текст) ___ From 09d90dcc81224fe3f4294b73470d75a364f24771 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 3 Sep 2023 14:27:55 +0300 Subject: [PATCH 0969/1128] =?UTF-8?q?=D0=9F=D0=BE=D1=80=D1=8F=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=20Issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/{bug_report.yml => ybug_report.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/ISSUE_TEMPLATE/{bug_report.yml => ybug_report.yml} (100%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/ybug_report.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/bug_report.yml rename to .github/ISSUE_TEMPLATE/ybug_report.yml From d6f23cdaa89b4245d3e0b99e6c43d7351c6bf523 Mon Sep 17 00:00:00 2001 From: Pavel Asafov Date: Mon, 4 Sep 2023 19:13:08 +0600 Subject: [PATCH 0970/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=80=D1=84=D0=BE=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/11-logical-operators/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 051711e500..963854de8e 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -147,7 +147,7 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в [recent browser="new"] -Оператор логического присваивания ИЛИ `||=` записывается как обычный ИЛИ `||` с добавлением символа приваивания `=`. Такая запись не случайна, так как результат выполнения данного оператора напрямую зависит от действий уже известного нам `||`. +Оператор логического присваивания ИЛИ `||=` записывается как обычный ИЛИ `||` с добавлением символа присваивания `=`. Такая запись не случайна, так как результат выполнения данного оператора напрямую зависит от действий уже известного нам `||`. Вот его синтаксис: From 5b68becb174a230af0d54fdf1c217df5e5073c74 Mon Sep 17 00:00:00 2001 From: Pavel Asafov Date: Mon, 4 Sep 2023 19:23:43 +0600 Subject: [PATCH 0971/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=83=20=D0=98=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=20=D0=98=D0=9B=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/02-first-steps/11-logical-operators/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/11-logical-operators/article.md b/1-js/02-first-steps/11-logical-operators/article.md index 051711e500..431aced1eb 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -321,7 +321,7 @@ let x = 1; if (x > 0) alert( 'x больше нуля!' ); ``` -Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ. +Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно И. ```` ## &&= (Логическое присваивание И) From 91a70bf36a52b6839485e3177114cf587f5e5677 Mon Sep 17 00:00:00 2001 From: Alexandr Smirnov Date: Mon, 4 Sep 2023 20:08:01 +0300 Subject: [PATCH 0972/1128] Update solution.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправил неправильную формулировку --- .../2-insert-after-head/solution.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md b/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md index 67343b2433..1c99654ea3 100644 --- a/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md +++ b/9-regular-expressions/14-regexp-lookahead-lookbehind/2-insert-after-head/solution.md @@ -30,8 +30,8 @@ alert(str); // ...

    Hello

    ... - Проверяет не предшествует ли ему `pattern:`. - Если это так, то мы встретили совпадение. -Тег `pattern:` не вернётся. Результатом этого регулярного выражения является буквально пустая строка, но она совпадает только в позициях, предшествующих `pattern:`. +Тег `pattern:` не вернётся. Результатом этого регулярного выражения является буквально пустая строка, но она совпадает только в позициях, которым предшествует `pattern:`. -Происходит замена "пустой строки", которая предшествует `pattern:` на `

    Hello

    `. Что, как раз, и есть вставка этой строки после ``. +Происходит замена "пустой строки", которой предшествует `pattern:` на `

    Hello

    `. Что, как раз, и есть вставка этой строки после ``. P.S. Флаги регулярных выражений, такие как `pattern:s` и `pattern:i`, также могут быть полезны: `pattern://si`. Флаг `pattern:s` создает точечный `pattern:.` соответствует символу новой строки, а флаг `pattern:i` делает `pattern:` также соответствующим `match:` без учета регистра. From 2ef514057c7a4f7220ecd5026e47bdf2b7e28317 Mon Sep 17 00:00:00 2001 From: kaliganoff <96372655+kaliganoff@users.noreply.github.com> Date: Wed, 6 Sep 2023 17:36:46 +0300 Subject: [PATCH 0973/1128] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D1=82=D0=B0=D0=B2=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D1=8E=20"=D0=B5=D0=B3=D0=BE=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BE=D1=80=D0=B4=D0=B8=D0=BD=D0=B0=D1=82=D1=8B=20=D1=8D=D0=BB?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/1-document/11-coordinates/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/1-document/11-coordinates/article.md b/2-ui/1-document/11-coordinates/article.md index 7102a043f2..24bde095e1 100644 --- a/2-ui/1-document/11-coordinates/article.md +++ b/2-ui/1-document/11-coordinates/article.md @@ -147,7 +147,7 @@ elem.style.background = ''; // Ошибка! Чаще всего нам нужны координаты для позиционирования чего-либо. -Чтобы показать что-то около нужного элемента, мы можем вызвать `getBoundingClientRect`, чтобы получить его координаты элемента, а затем использовать CSS-свойство `position` вместе с `left/top` (или `right/bottom`). +Чтобы показать что-то около нужного элемента, мы можем вызвать `getBoundingClientRect`, чтобы получить его координаты, а затем использовать CSS-свойство `position` вместе с `left/top` (или `right/bottom`). Например, функция `createMessageUnder(elem, html)` ниже показывает сообщение под элементом `elem`: From e1bade83b26c300fb6ccad9346ea091cf2436ae9 Mon Sep 17 00:00:00 2001 From: Nataly Klimova <36628483+Tataklim@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:47:06 +0200 Subject: [PATCH 0974/1128] update link to ecma-262 --- 1-js/01-getting-started/2-manuals-specifications/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/01-getting-started/2-manuals-specifications/article.md b/1-js/01-getting-started/2-manuals-specifications/article.md index 7b6bc1d704..68fea2546d 100644 --- a/1-js/01-getting-started/2-manuals-specifications/article.md +++ b/1-js/01-getting-started/2-manuals-specifications/article.md @@ -5,7 +5,7 @@ ## Спецификация -[Спецификация ECMA-262](https://www.ecma-international.org/publications/standards/Ecma-262.htm) содержит самую глубокую, детальную и формализованную информацию о JavaScript. Она определяет сам язык. +[Спецификация ECMA-262](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/) содержит самую глубокую, детальную и формализованную информацию о JavaScript. Она определяет сам язык. Вначале спецификация может показаться тяжеловатой для понимания из-за слишком формального стиля изложения. Если вы ищете источник самой достоверной информации, то это правильное место, но она не для ежедневного использования. From 7cd319a32c576919b52f72e27519d2b96969b2d5 Mon Sep 17 00:00:00 2001 From: h0ttab <117557342+h0ttab@users.noreply.github.com> Date: Sat, 7 Oct 2023 00:09:12 +0300 Subject: [PATCH 0975/1128] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B2=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправление ошибочного термина в статье. --- 1-js/05-data-types/05-array-methods/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/05-array-methods/article.md b/1-js/05-data-types/05-array-methods/article.md index e1a676ae41..8f0b36a244 100644 --- a/1-js/05-data-types/05-array-methods/article.md +++ b/1-js/05-data-types/05-array-methods/article.md @@ -668,7 +668,7 @@ arr.reduce((sum, current) => sum + current); ## Array.isArray -Массивы не образуют отдельный тип языка. Они основаны на объектах. +Массивы не образуют отдельный тип данных. Они основаны на объектах. Поэтому `typeof` не может отличить простой объект от массива: From eb5c5967ae13c14874a3bf6be1b19eb08b5e0728 Mon Sep 17 00:00:00 2001 From: Aleksandras Date: Sun, 8 Oct 2023 12:28:21 +0300 Subject: [PATCH 0976/1128] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1-js/05-data-types/08-weakmap-weakset/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/08-weakmap-weakset/article.md b/1-js/05-data-types/08-weakmap-weakset/article.md index 1781079624..cf5fdaa7e4 100644 --- a/1-js/05-data-types/08-weakmap-weakset/article.md +++ b/1-js/05-data-types/08-weakmap-weakset/article.md @@ -142,7 +142,7 @@ function countUser(user) { // 📁 main.js let john = { name: "John" }; -countUser(john); //ведём подсчёт посещений +countUser(john); // ведём подсчёт посещений // пользователь покинул нас john = null; From ab51673582068b8d6f249417963a400eb825f224 Mon Sep 17 00:00:00 2001 From: Oleksandr Tkachenko Date: Thu, 12 Oct 2023 12:49:36 +0300 Subject: [PATCH 0977/1128] Add WeakRef and FinalizationRegistry article --- .../article.md | 396 ++++++++++++++++++ .../weakref-finalizationregistry-01.svg | 9 + .../weakref-finalizationregistry-02.svg | 9 + .../weakref-finalizationregistry-03.svg | 9 + .../weakref-finalizationregistry-04.svg | 9 + .../weakref-finalizationregistry-05.svg | 9 + .../weakref-finalizationregistry-06.svg | 9 + .../weakref-finalizationregistry-demo-01.png | Bin 0 -> 835160 bytes .../weakref-finalizationregistry-demo-02.gif | Bin 0 -> 1082949 bytes .../weakref-finalizationregistry-demo-03.jpg | Bin 0 -> 307409 bytes .../weakref-finalizationregistry-demo-04.gif | Bin 0 -> 1550693 bytes .../weakref-finalizationregistry-demo-05.jpg | Bin 0 -> 345671 bytes .../weakref-finalizationregistry-demo-06.gif | Bin 0 -> 1551161 bytes .../weakref-finalizationregistry-demo-07.jpg | Bin 0 -> 342199 bytes .../index.css | 288 +++++++++++++ .../index.html | 48 +++ .../index.js | 228 ++++++++++ .../utils.js | 321 ++++++++++++++ .../01-sum-salaries/_js.view/solution.js | 0 .../01-sum-salaries/_js.view/test.js | 0 .../01-sum-salaries/solution.md | 0 .../01-sum-salaries/task.md | 0 .../02-count-properties/_js.view/solution.js | 0 .../02-count-properties/_js.view/test.js | 0 .../02-count-properties/solution.md | 0 .../02-count-properties/task.md | 0 .../article.md | 0 .../1-destruct-user/solution.md | 0 .../1-destruct-user/task.md | 0 .../6-max-salary/_js.view/solution.js | 0 .../6-max-salary/_js.view/test.js | 0 .../6-max-salary/solution.md | 0 .../6-max-salary/task.md | 0 .../article.md | 0 .../destructuring-complex.svg | 0 .../1-new-date/solution.md | 0 .../{11-date => 12-date}/1-new-date/task.md | 0 .../2-get-week-day/_js.view/solution.js | 0 .../2-get-week-day/_js.view/test.js | 0 .../2-get-week-day/solution.md | 0 .../2-get-week-day/task.md | 0 .../3-weekday/_js.view/solution.js | 0 .../3-weekday/_js.view/test.js | 0 .../3-weekday/solution.md | 0 .../{11-date => 12-date}/3-weekday/task.md | 0 .../4-get-date-ago/_js.view/solution.js | 0 .../4-get-date-ago/_js.view/test.js | 0 .../4-get-date-ago/solution.md | 0 .../4-get-date-ago/task.md | 0 .../5-last-day-of-month/_js.view/solution.js | 0 .../5-last-day-of-month/_js.view/test.js | 0 .../5-last-day-of-month/solution.md | 0 .../5-last-day-of-month/task.md | 0 .../6-get-seconds-today/solution.md | 0 .../6-get-seconds-today/task.md | 0 .../7-get-seconds-to-tomorrow/solution.md | 0 .../7-get-seconds-to-tomorrow/task.md | 0 .../_js.view/solution.js | 0 .../8-format-date-relative/_js.view/test.js | 0 .../8-format-date-relative/solution.md | 0 .../8-format-date-relative/task.md | 0 .../{11-date => 12-date}/article.md | 0 .../1-serialize-object/solution.md | 0 .../1-serialize-object/task.md | 0 .../2-serialize-event-circular/solution.md | 0 .../2-serialize-event-circular/task.md | 0 .../{12-json => 13-json}/article.md | 0 .../{12-json => 13-json}/json-meetup.svg | 0 68 files changed, 1335 insertions(+) create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/article.md create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-01.svg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-02.svg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-03.svg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-04.svg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-05.svg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-06.svg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-01.png create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-02.gif create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-03.jpg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-04.gif create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-05.jpg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-06.gif create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-07.jpg create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry.view/index.css create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry.view/index.html create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry.view/index.js create mode 100644 1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry.view/utils.js rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/01-sum-salaries/_js.view/solution.js (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/01-sum-salaries/_js.view/test.js (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/01-sum-salaries/solution.md (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/01-sum-salaries/task.md (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/02-count-properties/_js.view/solution.js (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/02-count-properties/_js.view/test.js (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/02-count-properties/solution.md (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/02-count-properties/task.md (100%) rename 1-js/05-data-types/{09-keys-values-entries => 10-keys-values-entries}/article.md (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/1-destruct-user/solution.md (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/1-destruct-user/task.md (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/6-max-salary/_js.view/solution.js (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/6-max-salary/_js.view/test.js (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/6-max-salary/solution.md (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/6-max-salary/task.md (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/article.md (100%) rename 1-js/05-data-types/{10-destructuring-assignment => 11-destructuring-assignment}/destructuring-complex.svg (100%) rename 1-js/05-data-types/{11-date => 12-date}/1-new-date/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/1-new-date/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/2-get-week-day/_js.view/solution.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/2-get-week-day/_js.view/test.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/2-get-week-day/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/2-get-week-day/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/3-weekday/_js.view/solution.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/3-weekday/_js.view/test.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/3-weekday/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/3-weekday/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/4-get-date-ago/_js.view/solution.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/4-get-date-ago/_js.view/test.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/4-get-date-ago/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/4-get-date-ago/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/5-last-day-of-month/_js.view/solution.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/5-last-day-of-month/_js.view/test.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/5-last-day-of-month/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/5-last-day-of-month/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/6-get-seconds-today/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/6-get-seconds-today/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/7-get-seconds-to-tomorrow/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/7-get-seconds-to-tomorrow/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/8-format-date-relative/_js.view/solution.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/8-format-date-relative/_js.view/test.js (100%) rename 1-js/05-data-types/{11-date => 12-date}/8-format-date-relative/solution.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/8-format-date-relative/task.md (100%) rename 1-js/05-data-types/{11-date => 12-date}/article.md (100%) rename 1-js/05-data-types/{12-json => 13-json}/1-serialize-object/solution.md (100%) rename 1-js/05-data-types/{12-json => 13-json}/1-serialize-object/task.md (100%) rename 1-js/05-data-types/{12-json => 13-json}/2-serialize-event-circular/solution.md (100%) rename 1-js/05-data-types/{12-json => 13-json}/2-serialize-event-circular/task.md (100%) rename 1-js/05-data-types/{12-json => 13-json}/article.md (100%) rename 1-js/05-data-types/{12-json => 13-json}/json-meetup.svg (100%) diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/article.md b/1-js/05-data-types/09-weakref-finalizationregistry/article.md new file mode 100644 index 0000000000..ae90b60533 --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/article.md @@ -0,0 +1,396 @@ + +# WeakRef и FinalizationRegistry + +Вспоминая основную концепцию принципа *достижимости* из главы , +мы помним что движок JavaScript гарантированно хранит в памяти "достижимые" значения (те, которые доступны или используются). + +Например: + +```js +// в переменной user находится сильная ссылка на объект +let user = { name: "Aleks" }; + +// перезапишем значение переменной user +user = null; + +// ссылка теряется и объект будет удалён из памяти +``` +Или же, похожий, но немного усложненный пример с двумя сильными ссылками. +Теперь мы скопировали ссылку из `user` в переменную `admin`. +В этом случае объект `Aleks` имеет две сильные ссылки ссылающиеся на него - `user` и `admin`. + +```js +// в переменной user находится сильная ссылка на объект +let user = { name: "Aleks" }; + +*!* +let admin = user; +*/!* + +// перезапишем значение переменной user +user = null; + +// объект всё ещё доступен через глобальную переменную admin +``` +И только при отсутствии сильных ссылок на объект (если бы мы также перезаписали значение переменной `admin`), +только тогда, объект `Aleks` будет удалён из памяти. + +`WeakRef` - принципиально другая концепция, которая ведёт себя иначе и не предотвращает удаление объектов +сборщиком мусора когда единственными ссылками на объект являются слабые ссылки. + +## WeakRef + +````warn header="Предостережение" + +Прежде чем вы начнёте изучать данные возможности, хотелось бы обратить ваше внимание на официальное предупреждение об их использовании, +которое звучит следующим образом: + +```quote +Избегайте, где это возможно. +Правильное использование этих функций требует тщательного обдумывания, и по возможности их лучше избегать. +Также важно не полагаться на какое-либо специфическое поведение, не гарантированное спецификацией. +Лучше всего, если объекты WeakRef и FinalizationRegistry используются как способ избежать чрезмерного использования памяти +или как защита от некоторых ошибок, а не как обычный способ очистки внешних ресурсов или наблюдения за внешними ресурсами. +``` + +```` + +`WeakRef` - это объект, содержащий слабую ссылку на другой объект, называемый `target` или `referent`, +который не препятствует сборщику мусора собирать указанный объект. +Другими словами, объект `WeakRef` не удерживает "в живых" объект-референт. + +Теперь давайте используем переменную `user` в качестве референта и создадим слабую ссылку от `user` к переменной `admin`. +Чтобы создать слабую ссылку, необходимо использовать конструктор `WeakRef`, +передав целевой объект (объект, на который вы хотите создать слабую ссылку), в нашем случае это переменная `user`. + +```js +// в переменной user находится сильная ссылка на объект +let user = { name: "Aleks" }; + +// в переменной admin находится слабая ссылка на объект +*!* +let admin = new WeakRef(user); +*/!* +``` + +На картине изображены два типа ссылок: сильная ссылка с использованием переменной `user` и слабая ссылка с использованием переменной `admin`. + +![](weakref-finalizationregistry-01.svg) + +Затем, в какой-то момент, мы перестаём использовать переменную `user` - она перезаписывается, +выходит из области видимости и т.д., при этом сохраняя экземпляр `WeakRef` в переменной `admin`. + +```js +// перезапишем значение переменной user +user = null; +``` +Слабой ссылки на объект не достаточно для того, чтобы сохранить объект в живых. +Когда единственными оставшимися ссылками на референт являются слабые ссылки, +сборщик мусора вправе уничтожить объект и использовать его память для чего-то другого. +Однако до тех пор, пока объект фактически не уничтожен, слабая ссылка может вернуть объект, даже если на него больше нет сильных ссылок. +То есть наш объект становится своеобразным "котом Шрёдингера", о котором мы не можем точно знать, "жив" он или "мёртв". + +![](weakref-finalizationregistry-02.svg) + +На этом этапе, чтобы получить объект из экземпляра `WeakRef`, нам следует использовать его метод `deref()`. +Метод `deref()` возвращает объект или `undefined`, если объект больше не доступен. + +```js +let ref = admin.deref(); + +if (ref) { + // сделать что-нибудь со значением ref +}; +``` + +## Варианты использования WeakRef + +`WeakRef` обычно используется для создания кэшей или сопоставлений (mappings), в которых хранятся массивные объекты, +гарантируя, что простое присутствие объекта в кэше или сопоставлении не гарантирует сохранение этих больших объектов в памяти. +Одним из основных примеров является ситуация наличия большого количества объектов бинарных изображений (например, представленных в виде `ArrayBuffer`, `Blob`, и т. д.), +и мы хотим связать имя или путь с каждым изображением. Существующие структуры данных просто не делают то, что здесь требуется. + +- Использование `Map` для создания ассоциаций между именами и изображениями, или наоборот, сохранит объекты изображений в памяти, + поскольку они фигурируют в `Map` в качестве ключей или значений. +- `WeakMap` также не подходит для этой цели: они слабы по своим ключам, но в данном случае нам нужна структура данных, которая была бы слабой по значениям. + +Вместо этого мы можем использовать `Map`, значениями которого являются объекты `WeakRef`, ссылающиеся на необходимые большие объекты. +Таким образом, мы избегаем хранения в памяти этих больших и ненужных объектов дольше, чем нужно. +В противном случае это способ получить объект изображения из кэша, если он все еще доступен, +но если он удалён сборщиком мусора, мы сгенерируем или скачаем его заново. +Таким образом, в некоторых ситуациях используется меньше памяти. + +## Пример: применение WeakRef для кеширования + +Вот фрагмент кода, который демонстрирует технику использования `WeakRef`. +Кратко говоря, мы используем `Map` со строковыми ключами и объектами `WeakRef` в качестве их значений. +Если объект `WeakRef` не был удалён сборщиком мусора, мы берём его из кэша. +В противном случае мы скачиваем его заново и помещаем в кэш для дальнейшего возможного повторного использования. + +```js +const weakRefCache = (fetchImg) => {// (1) + const imgCache = new Map(); // (2) + + return (imgName) => { // (3) + const cachedImg = imgCache.get(imgName); // (4) + + if (cachedImg?.deref() !== undefined) { // (5) + return cachedImg?.deref(); + } + + + const newImg = fetchImg(imgName); // (6) + imgCache.set(imgName, new WeakRef(newImg)); // (7) + + return newImg; + }; +}; + +const getCachedImg = weakRefCache(fetchImg); +``` + +Давайте подробно разберём всё, что тут произошло: +- `(1)` `weakRefCache` - функция высшего порядка, которая принимает другую функцию `fetchImg` в качестве аргумента. +- `(2)` `imgCache` - кэш изображений который хранит закэшированные результаты функции `fetchImg`, в виде строковых ключей (имя изображения) и объектов `WeakRef` в качестве их значений. +- `(3)` Возвращаем анонимную функцию, которая принимает имя изображения в качестве аргумента. Данный аргумент будет использоваться в качестве ключа для кэшированного изображения. +- `(4)` Пытаемся получить кэшированный результат из кэша используя предоставленный ключ (имя изображения). +- `(5)` Если кэш содержит значение по указанному ключу, и объект `WeakRef` не был удалён сборщиком мусора, возвращаем закэшированный результат. +- `(6)` Если в кэше нет записи с запрошенным ключом, либо метод `deref()` возвращает `undefined`, что означает что объект `WeakRef` был удалён сборщиком мусора, + функция `fetchImg` скачивает изображение заново. +- `(7)` Помещаем скачанное изображение в кэш в виде `WeakRef` объекта. + +Вот визуальное представление того, как выглядит этот код. +У нас есть объект `Map`, где ключи - это имена изображений в виде строк, а значения - это объекты `WeakRef`, содержащие сами изображения. +Эта техника помогает избежать выделения большого объема памяти на ресурсоёмкие объекты, которые больше никто не использует. +А также, экономит память и время в случае повторного использования закэшированных объектов. + +![](weakref-finalizationregistry-03.svg) + +Но, у данной реализации есть свои недостатки: со временем объект `Map` будет заполняться строками в качестве ключей, +которые указывают на `WeakRef`, чей объект-референт уже был удалён сборщиком мусора. + +![](weakref-finalizationregistry-04.svg) + +Один из способов справиться с этой проблемой - это периодически проверять кэш и удалять "мёртвые" записи. +Другой способ - использование финализаторов, с которыми мы ознакомися далее. + +## Пример: применение WeakRef для отслеживания объектов DOM + +Ещё один вариант использования `WeakRef` - отслеживание объектов DOM. +Давайте представим ситуацию, когда какой-то сторонний код / библиотека работает с элементами на нашей странице до тех пор, +пока они существуют в DOM. Например, это может быть какой-то сторонний логгер, который присылает события в DOM элемент. +Но, как только элемент удаляется из DOM (мы закрыли окно отображения логов), логгер должен перестать слать события. +Для того что б нам не слать лишних событий и не уведомлять сторонний код каждый раз, когда наш элемент доступен и когда он удалён, +достаточно лишь создать на него слабую ссылку. После того как наш элемент будет удалён из DOM (например, пользователь закрывает окно с логами), +логгер это увидит и перестанет слать логи. + +```html run height=120 +
    No events.
    + + +``` + +## FinalizationRegistry + +`FinalizationRegistry` предоставляет способ запросить вызов колбэка очистки (также известный как финализатор) в какой-то момент после того, +как объект, зарегистрированный в реестре, будет собран сборщиком мусора. +Чтобы создать реестр, необходимо вызвать его конструктор, передав функцию очистки (финализатор) в качестве аргумента. + +```js run +let user = { name: "Aleks" }; + +const registry = new FinalizationRegistry((heldValue) => { + console.log(`${heldValue} has been garbage collected.`); +}); +``` + +Затем, мы регистрируем объект для которого требуется колбэк очистки, вызывая метод `register` и передавая объект и `heldValue` значение для него. +Реестр не хранит сильную ссылку на переданный ему объект, так как это противоречило бы цели (если бы реестр сохранял сильную ссылку на объект, то объект никогда бы не был очищен сборщиком мусора). + +```js +registry.register(user, user.name); +``` + +Если объект был собран сборщиком мусора, наш колбэк очистки может быть вызван в какой-то момент в будущем с переданным ему `heldValue`. +Удерживаемое значение (`heldValue`) может быть любого типа: примитив, объект, даже `undefined`. +Если `heldValue` является объектом, реестр срхраняет на него сильную ссылку (чтобы позже можно было передать его в колбэк очистки). + +![](weakref-finalizationregistry-05.svg) + +```js +// Когда объект user будет удалён сборщиком мусора, в консоль будет выведено сообщение: +"Aleks has been garbage collected." +``` + +Также существуют ситуации, когда даже в реализациях, которые обычно вызывают колбэк очистки, есть вероятность, что они не будут вызваны, например: +- Когда программа полностью завершает свою работу (например, при закрытии вкладки в браузере). +- Когда сам экземпляр `FinalizationRegistry` больше не доступен для JavaScript кода. + +## Совместное использование WeakRef и FinalizationRegistry + +Возвращаясь к нашему примеру [слабого кэша](#primer-primenenie-weakref-dlya-keshirovaniya) ранее, мы можем заметить следующее: +Что даже несмотря на то, что значения, обёрнутые в `WeakRef`, были собраны сборщиком мусора, +всё ещё существует "утечка памяти" в виде оставшихся ключей, значения которых были собраны сборщиком мусора. +Для улучшения и устранения ненужных ключей, вот более полная версия слабого кэша, использующая `FinalizationRegistry`. + +```js +const weakRefCache = (fetchImg) => { + const imgCache = new Map(); + *!* + const registry = new FinalizationRegistry((imgName) => { // (1) + const cachedImg = imgCache.get(imgName); + if (cachedImg && !cachedImg.deref()) imgCache.delete(imgName); + }); + */!* + + return (imgName) => { + const cachedImg = imgCache.get(imgName); + + if (cachedImg?.deref() !== undefined) { + return cachedImg?.deref(); + } + + + const newImg = fetchImg(imgName); + imgCache.set(imgName, new WeakRef(newImg)); + *!* + registry.register(newImg, imgName); // (2) + */!* + + return newImg; + }; +}; + +const getCachedImg = weakRefCache(fetchImg); +``` + +- `(1)` Для управления очисткой "мертвых" записей в кэше, когда связанные с ними объекты `WeakRef` собираются сборщиком мусора, создаём реестр очистки с использованием конструктора `FinalizationRegistry()`. + Важным моментом здесь является то, что колбэк должен проверить, что запись была удалена сборщиком мусора и не была добавлена заново, чтобы не удалить "живую" запись. +- `(2)` После загрузки и установки нового значения (изображения) в кэш, регистрируем его в реестре финализатора для мониторинга объекта `WeakRef`. + +Вот визуальное представление обновлённого кода. +Данная реализация содержит только актуальные или «живые» пары ключ-значение. +В этом случае каждый объект `WeakRef` зарегистрирован в `FinalizationRegistry`. +А после того, как объекты были очищены сборщиком мусора, колбэк очистки удалил все значения `undefined`. + +![](weakref-finalizationregistry-06.svg) + +Важным моментом в реализации выше является то, что финализаторы внедряют параллелизм между "основной" программой и колбэками очистки. +Вышеупомянутый колбэк очистки, должен проверить, не добавлена ли запись обратно в кэш "основной" программой между моментом сбора мусора, +и моментом выполнения колбэка, чтобы избежать удаления активных записей. +Аналогично, при поиске ключа в кэше есть возможность, что значение было собрано сборщиком мусора, но функция очистки еще не была выполнена. + +## Демо совместного использования WeakRef и FinalizationRegistry + +```smart header="Примечание" +Интерактивное демо (песочница) будет представлено в конце раздела. +``` + +Переходя от теории к практике, представьте себе реальный сценарий, когда пользователь синхронизирует свои фотографии на мобильном устройстве +с каким-либо облачным сервисом (таким как iCloud или Google Photos), и хочет просматривать их с других устройств. +Подобные сервисы, помимо основного функционала просмотра фотографий, предлагают массу дополнительных возможностей, таких как: + +- Редактирование фотографий и видео эффекты. +- Создание воспоминаний и альбомов. +- Монтаж видео из серии фотографий. +- И многое другое. + +Одна из возможных функций, которая будет показана в демо — это создание фото коллажа из выбранных пользователем фотографий. +Конечно, для демонстрационных целей это очень упрощено, и основная цель — показать возможный сценарий совместного использования `WeakRef` и `FinalizationRegistry` в реальной жизни. + +Краткое описание: Мы открываем свою облачную библиотеку фотографий, выбираем нужные фотографии, макет, и нажимаем кнопку "Create collage". +Затем, мы можем скачать созданный коллаж в виде изображения. + +Итак, представим, что мы открыли свою библиотеку фотографий и в левой части экрана видим список миниатюр наших фотографий. +Для увеличения скорости загрузки страницы разумно будет загружать и показывать миниатюры фотографий не в полном размере, а в сжатом качестве. +Но, для создания коллажа из выбранных фотографий, загружать и использовать их в полноразмерном качестве. +На этом скриншоте мы видим, что внутренний размер миниатюр составляет 240×240 пикселей. +Размер был выбран специально для увеличения скорости загрузки, а также за ненадобностью иметь полноразмерные фотографии в качестве предосмотра. + +![](weakref-finalizationregistry-demo-01.png) + +Давайте представим, что мы хотим создать коллаж из 4-х фотографий, выбираем их, и нажимаем кнопку «Create collage». +На этом этапе наша функция `weakCache` проверяет, есть ли нужное изображение в кэше, и если нет, +то скачивает его из облака и помещает в кэш для возможного дальнейшего использования. +И так происходит для каждого выбранного изображения. + +![](weakref-finalizationregistry-demo-02.gif) + +Из вывода в консоли видно, какие из фотографий были загружены из облака (синее сообщение с текстом `FETCHED_IMAGE`). +Так как это первая попытка создания коллажа, это означает, что на данном этапе слабый кэш был пуст, а все фотографии были скачаны из облака и помещены в кэш. + +Но, наряду с процессом загрузки изображений, происходит еще и процесс очистки памяти сборщиком мусора. +Обратите внимание на красное сообщение с текстом `CLEANED_IMAGE`. +Это означает, что хранящийся в кэше объект на который мы ссылаемся используя слабую ссылку, был удалён сборщиком мусора. +И наш финализатор выполнился успешно, тем самым удалив ключ, по которому изображение хранилось в кэше, и оповестив нас красным сообщением в консоль. + +![](weakref-finalizationregistry-demo-03.jpg) + +Далее мы понимаем, что нам не нравится получившийся коллаж, и решаем изменить одно из изображений и создать новый. +Для этого достаточно снять выделение с не желаемого изображения, выбрать нужное, и ещё раз нажать кнопку "Create collage". + +![](weakref-finalizationregistry-demo-04.gif) + +Но, обратите внимание на зелёное сообщение в консоли с текстом `CACHED_IMAGE`, +на этот раз не все изображения были скачаны из сети, и одно из них было взято из слабого кэша. +Это означает, что на момент создания коллажа сборщик мусора ещё не удалил наше изображение, и мы смело использовали его из кэша, +тем самым сократив количество сетевых запросов и ускорив общее время процесса создания коллажа. + +![](weakref-finalizationregistry-demo-05.jpg) + +Давайте ещё немного "поиграем", заменив одно из изображений ещё раз и создадим новый коллаж. + +![](weakref-finalizationregistry-demo-06.gif) + +На этот раз результат ещё более впечатляющий. +Из 4-х выбранных изображений, 3 из них были взяты из слабого кеша, и только одно пришлось скачать из сети. +Снижение нагрузки на сеть составило ~ 75%, впечатляет, не правда ли? + +![](weakref-finalizationregistry-demo-07.jpg) + +Конечно, не следует забывать, что такое поведение не является гарантированным, и зависит от конкретной реализации и работы сборщика мусора. +Это не является постоянным и предсказуемым результатом, а скорее может быть рассмотрено как дополнительная возможность или приятный бонус. +Сразу же возникает вполне логичный вопрос: почему бы нам не использовать обычный кэш, где мы можем сами управлять его сущностями, а не полагаться на сборщика мусора? +Всё верно, в большинстве случаев нет необходимости использовать `WeakRef`. +В данном случае была представлена альтернативная концепция, которая может быть полезной для определенных сценариев. +Это, скорее, демонстрация возможности и предоставление основы для собственных размышлений и реализаций. + +```smart header="Примечание" +Для оптимального взаимодействия, рекомендуем вам открыть демо в новом окне в полноэкранном режиме, +а также открыть инструменты разработчика. +``` + +[codetabs height=420 src="weakref-finalizationregistry"] + +## Итого + +`WeakRef` - предназначенный для создания слабых ссылок на объекты, что позволяет объектам быть удалёнными из памяти сборщиком мусора, если на них больше нет сильных ссылок. +Это полезно для решения проблемы чрезмерного использования памяти и оптимизации использования системных ресурсов в приложениях. + +`FinalizationRegistry` - это средство для регистрации колбэков, которые выполняются при уничтожении объектов, на которые больше нет сильных ссылок. +Это позволяет освобождать связанные с объектом ресурсы или выполнять другие необходимые операции перед удалением объекта из памяти. +`FinalizationRegistry` помогает улучшить управление ресурсами и избегать утечек памяти в приложениях JavaScript. \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-01.svg b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-01.svg new file mode 100644 index 0000000000..6d6ff218d6 --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-01.svg @@ -0,0 +1,9 @@ + + image + + + + + + \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-02.svg b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-02.svg new file mode 100644 index 0000000000..abc8d57deb --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-02.svg @@ -0,0 +1,9 @@ + + image + + + + + + \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-03.svg b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-03.svg new file mode 100644 index 0000000000..fe80223446 --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-03.svg @@ -0,0 +1,9 @@ + + image + + + + + + \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-04.svg b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-04.svg new file mode 100644 index 0000000000..9d7d82bcbd --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-04.svg @@ -0,0 +1,9 @@ + + image + + + + + + \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-05.svg b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-05.svg new file mode 100644 index 0000000000..cebdd150d9 --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-05.svg @@ -0,0 +1,9 @@ + + image + + + + + + \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-06.svg b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-06.svg new file mode 100644 index 0000000000..d3d646e936 --- /dev/null +++ b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-06.svg @@ -0,0 +1,9 @@ + + image + + + + + + \ No newline at end of file diff --git a/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-01.png b/1-js/05-data-types/09-weakref-finalizationregistry/weakref-finalizationregistry-demo-01.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8bb01e882bea2d5dfaa243a211fd727b959cf1 GIT binary patch literal 835160 zcmd41bx>T-);78a2`)hb1f3+fyE_CJ+(HN*EVvGC!II!ka39>=-7UCVaCf(lQ{VeL z=iEPU-9PSIHMOgH_jIq_-K)Ew^{nTYl7bWl>RVI*05D{vB~$?5l?VX9?;yjyyg?z# znFIjTEHiO&B{M@q0FeF_8;_(EJ@=;f_&Vo@f0RG6G)l9K4Jh0HkJ#&Mzt9K-WJ-S# zrE+jZ9h`-zB!cCR?@wO~kWo1}$V$1)V2L95X9d$6%e*EmLf=N4W%u)up@jRv{`zP4 zqZD`35hOq}f&NWy`v8y~TtR8zr5o~lmgki^khktb1|4^U)oUGhEcxv2FH2Dtlh-Wwj0vGHf$IzaZ4hDS*j#@_}6a} z(Ky8$4q3L24GT)hY?0X(#AG@a_HkgnA1+K=n49;VTcU%%@;Qu`o>Rb<>IY-EY_`GK z9pXFT(gdjIrn}zYQc4B1 z*lo1&hmF&sWZToUEj zqBLdy+=qtC!t*Y5lO(XXx|kHeJ%;Y_HRUL_i2wA0Qq_bZ`y_qy@MyB4dUHeMgWCXL z8?&>nlL2^=oE02BJg`6#5?e~`XI~i?`;uN+mH}^u(3g3+rPHK z_fwGOd(eJHnf4V^Lg(^3OouxF-M5R{B9Oojr(+}|#kX@%5Sc0iGFmFXfl?d_By2WK8kfX%tGoVVWYN+ZW_vw5)1Uq<+WDRgo z@#_qsZ^&-&o`K3ND6sY~Wv?v}*$v*1AWO9cuYTac9SJ~N4YlRf#vl(&T0KAEyuoDf z)9c8h@lg>OQ*NL^!^7?V7?A!~=@$)(IcEW~dSJmv&h#(JDS28nMCOE-D4~+7W9U_g z^Z1A1VG`$m5_YC`a2yfuC>l_fzPAJ%iHE1R8uSs$hw%0wcD8rvN3qDV2K;7|!`S+; z^==E(1UM%P?jA4i`Al6T%=IS8SLZup`%wqi*HMGU^2b?a63pB%_TKt6F1d z`pmOr-z-994;l{$$XIw2E+;K0b5C_njSNb930%H|`UK_>P4HCVePKOBE)M3(geX^Q zgsSMkzT~@oQU5447P>>?_SO^kk?@h}@tmPpvq;ldlh}lFXfNSX)T$;iH&LWmx>)%z zY~Bv1?1S|3*@bnzRD-S@?ni~Hi_*fm?r%u zu_oL@1`bjV8MjR5N4&pzM;s&^3bq$3DKyI%>>2hL?-+LDMB{GbhT}?$(2M>S)qIA2 z@vL+zQ>YZufBX~p6<0snX2SfuXL=~kRLjhLA49PzPZh-*0U6T3OsAj zEZ*3uAw@0q%g}EgQN!_&s!ov1_mp-pBDv>CM- z@siQ)x1;z&f-JQw@}r^qHKX!dBevnrEBj36e=b+u)Z7IwC$Bf$r(G~B!|= z;b6a*xt+buIH%thMyo{8BAO;rz|h0-qIvN2*XV-%{1HhNIo@|glam*q3{@u2Y|fI+ zGG_h6TKKi3+q?_aQ0uR)ow6OLT^5?h8%sTwvOfj}YaNZjAq0$Cj>hFZf2+E4<7pVz zn0U#;e}#t$<2?rucNA}hQQ6`Y;CytkT*h3MZK3ui_Lg3yqQOU}YM_jx5>m96oloS5 zIf&Gb6JRhxqxUaWeNes1_K?PqDV8Ty3|6p^>&@-WO~X-^$j=NzKMXM@TKei>m+?7n zH>zIHK>~*+zu&jwjd8WnL`2U{!=%KWUlnt&U@qJC`gmSWZ+t!jE@NZMqUCMireA$a zy>O{W>1y#ez5GV|!+{p{BK7-E;)S@MYD>rTRLe{#MwyRSzxuy|7ZQ_rz_wxO=*Mi!-XV^5Jw zIQE&Nh1Je*hN@S-k=u|vm}_O}Z~3NvKE%x0?0I^%Sbl+UA*iN#p~dJvmhHYmkpCxt zHowuP=q4jShLiR3ZO*&;zX~}T#)h#bQ-K9ojW>;MPVPt6vsu--E~DGc9nH=64_BP( z#Om>fy+@;S&j%ut-$&9CglDF{P2$aX6yr|~U8{AZ(QCaMb+-vSgg#oT99LqdY%bAKF)yIo$QPmY78sQ07@p3VG3t0r7O|DAvzyTnUT%^Go`{%P)2 z+jMC5wRVKUnA%A(YGW9t6S}t$i&pYfHF2e;0F|LME>jkyKJBZ1sAtNI% ztSPR(6!qNHK0B%yI8)f#+nAVH8dEsB+8R@cDk-r70CK`QL~&S_aX{`94b6b!;E>Fw z3IK12%Y-Y7E1M+&4-bz9kIcfs!or0R^--jTSB+*2K>Ypow`L+y5>X;N>(5a{K)MF6 zpKnr}4FD(r83|D}m*j&b=j1otk4PuSLzdommpvdUBvEYq*Z68IPJW14zkWSUa^M<< zCVn=QIcV-8)C!@x!oi~tq9H|;K+IktojKketu!|A@)mH$!s-=eAXI#8(QCS}PFtFr z^SqjKzp7-fG@3VK2f+T=FSq%>9vLk`UK98t|F`h3H{VQI+Wx2RUq#QiuRi~$GEcD+ zK>JVQOEW_K|CBO>FyI;f-7$DF*T5&>A2VS8I}Y@+|CE%{0zq&7V`gvS|BcZBZXM8n z+3DWYows8vNx4WyzvdW#D=?u=%rI}r#1U)RMfGC;?~d;RWg>oAni#UVZCJZ25DHrB zANmwjocWB}@GFR)$Aw-dX%sze^amW{S(tR4O&sfmNWxOM){{!$|NW_dt~I8ian4+N z-0K%vFtRV2x*04rj{-R9?DMzt$#XLTPOWLQq7&DxrQ6&;G2U|T{XZK=BGgk(*Y~cz z9@X)liTQOO04EA@CofF~eh1bsl)V<_Kbw^kxIL>t?1mlRPh??h{nz|@!e_@MeLd7j zaheVfQoINbs{-Dajfe9HLGwz`$7w?X78upnBcXGJpkL1MZ;+5L?R!PRU=4mNk z%OI(RahbFN)&U?LJUtdEpCES#<){{tge2Idz>JFCM+ccq*ztGz)A^N`|gtL(^}T5EknCfg3y!MA)D zw%c)wQf-IlL)@N&$fROe#Q>J&NJV!X?3sD*aag(K@0r-oO#PkYv}9%VPpNV_Q3)Ji z3DmLK`6id{ALr9W4CQbkD)H`(GZ>AJ{?VYmW9ufB$P;xohMDt<)Iue5uesXZ)5YeG zA-C;bs(<@8R#H6|&zs0DBZ0&G4e@wAJxyKL$L3mQz1jv!eD8}hVusF#8Shm0?aqLP z0?*w$?v5XC7g6@Fg40|t`IMU4X58bh zov_86`O%0iAzW4YKZi^PGuX_O zDfKBjsN(D)M&g}vMv~}6;wScvgjzjM+i8b57;z8;1>|FFAtclMtxzuE3vUEAoQy3A zb!!oiqb|pL(^jALnbs=QwVql}_fW>FO%I#!W$sr42G9I51T;?uAfH1IO==6fs+#nv0{&6adL z9ls#Y?$iX*gpJooWcDZ7@QL$Zj*>4Ab}IIsTjXpI2!K^r?LJ-eY?hh=ug-rvf|w=uvt^-n@^rCXz1msllpxI*)P_XPsMqvY9GJE0I}z+XQpO9@wi`K~ z@a`Ydx?S5wfAYr$C>ot#6Tks=t9mo9DE{%I73gLD?3gMRW3q~}Zlof$N5k4gXom); zBnIK9Ck-hVW6GQWc9N`l7_j%`s5xObj^dDfy1mtc?`c-LX*S`D<$=ZYa1U+S>4$ z3fevDeZ4k-U&`!eGh_0(k)mzD{UFCwSNFk7guP*$d?gD4`chg<$ll+}#z$@CDNUIf6AgNuYo z>~Nnm6X@HH=6$-5m`1`{pXqH)%Oo*AB5@cJp<)Ut-B9&lj-omjZ_ zo#Zc=lxzR|Ooi`U!EkN8=QeGp5@wZ`*s9;lm%0!sV=NGlgEKwsWAMhB^q(v2f^^m1 zX0L3ike(imx@4uUeV&VW?w5}V)BR1BjJragqCw2#?g_4*4o~e&WEtN?zxdVSb;XKq z`o5c%l)Lf=`{{gBUHi_dsCz?X-eXCbyJ_?(c9} zxcad7<7nCRVL3x&)!$62>7u>q!LoR_tG(0d`Bb?#&@bbgz}0Acs!r3^`p?bL<~@7n zxZz}%)eI#0Sw(Kg-Wok`?~%&mmNivq0BfsRi|x~tAJQa9ga+GXFG`Da#`C0`S`-rR zPBbd$b%q5y5FBF}cI11UeyCR*b!E&;5`5d_sX*KNG;_=}fp8kIMxQ3(a z@M1N{%aq({zRl~A7JQgOI@KAx0>UZuE+^3o5Vtm&%dOYAG&QI!9ktSLi&77AsZEvyZ?Ks3?vkX;|HLpj&W4;y8*Z2Ax zgL41mK4P(e^topHh|_Vhn&83is;M4H=W0Jtn;WjZ6 zF`xecd>lp)ZH7N&IRyeS_r8rA<6auCJ_iuyFrMaFnS!zZU@Xz@I9{ELht;o!RGzgS z)n0e;lQ%q<&*-8j2*tY_c%Nig*pMozCZ!pSmb)i=4B2fz-3G;tTF%sUGb&$EII$o5w)}6hZfwt~Az~{tV?#{lz00f`7 znz(Br&6-P2$nx`kYXN;jMTT8gFNxFY) zGUMc7ir(9GGGryy$;4m~MtgrGd_FwG)cRZ#VRp-T_*)#4+p#&n^6@!L7zIfDq7}DX ze%0>>1BnR4)@`051$%&iZ?fIbE*o=5$Ic>BRp*I6jv4nxegWz1(R|kPYd{1fmptKC z&Z;ikHaN)hJHb|qCJE}jTyP^(4oAZ9f#BC6D8a)RTP@~(%d@}dHnYyd0&yuiewD&v z zVsdk)d32S~#F3!IxRS<%z8a{@XG~TRwb<%=W z2FRCBekks}QcQE3ElMIth2EUL55#P|Xwh0}*ezFLVfngKMp^rOJ}q^0Os0zLCUC9* zSydryI9@w{ayb|Gw%WCfr$CBP*ST&CwsBdtuFWC>v}YQ3Zqi7(jLoT%Znx1!hrS5Z z_T6dw*&TPy;OpDb-u;l3n}G9CqqF)`OwYGnr8lI*F9~UKaz5;FXpp&hrK-H9VXG@E{7`S{7`CD(w0><`{gMC3W#_?g#2_VwfV|0+ly*O1`!Dq3cIPBpyu{G@XYFb|Sq7TGb?X2f^SmmHVuB~<@ z>5cLTi}Pct_Q{m=LL|a&2g{Aek!}|)?*QO)O4zZGIXCdT(N<`?sjOXhyn1ku z4oJ@_hN|z!8Fb?ZOi}s&4sv@Ae%=zharDDcdCPP+c+AZ1*qqaRxSPQ2_>upbjNfY> zgmhHdn>zDw)`WK4u)Jt?-W`)7_=wcIF}7cRLsou*Z>`VpWnlc*A$pIOQ`-!~ z(yk+VOihy<=riZKUi;Nk`$EKQwtti-Fl9~0fmJ&!;A_HU{e*XvY^iR-bftq^#mGN=Q^3ervmR_~$SPKmT1zJog zzNS=ATnwA#-7Bmj_r09$`&+U4i-C0yd-bJ@U@ua(qB3iAGNsz>-*%z-H`Eq0A>@Kw zZ^MhV&&}wPQ11PJvg~GMz7iQCpy~s^x235=cR^6a%b!7mGm~R<*$k+G*F?3s`NSpI z$>)Ao{B3s0&IH5ctqZ>`m~Q->?n6r%6D`bMc_22jwLuoB@PKKo#UJ2G5b6J;<=`?Rt7J^o?B#vaCgiO?~Q_zd-N`8B(PuJCPo=e{`-&?d>P z{WuVHEn6g_#aI4yIG0=7LsI9^CyPqK)oN|gBGqdn@;lVfz>zAc{^Zv^l{!|ON~+M| zj#umyaFV-V<6*LVfHSzlaW9-^rR}|IGfFOyel(OX)hytxP)aJ=il8&0@c1}4$X$GC z(StZDbao~=L*}$vRi5=xkwn1$s$jF;6&bv(<1n{R&PZGR5b|d?I@c<1g(SEavvs5B z>8UK{Y=m3y^V4eOCS^|a^|JF;W_`||%WR*(o*q$QVK42xE~V-Q{jtGHJ@OZqTm?a= zGTt#E5d7U(x~Bbw2WktpX??@=%?lAAIzoK#0=^v|u(-K9QGq|qE|nDUzHUA-ZRKzj zOnJd3Yo&(${`uzILvCB`ljLFi2YKXjLOUJq)(23Rdx3a&Xf-?+*JSC<#k#6>y}d-; zht1hR;rokY?-q6SN%EuSXN%yK=gl$dH&Q{sYT*4*-E%cT0enV}M(XWN<&-zi{-QQm zY`}^CF)J$^(T70Kee<^#(@JjM_}Y>8)@Xw3^?T!PN@_C48{E=oYW?5*`6&NJgI1B7 zx=f6;7m`|5*kVz0a%(Y46u&pD!{_{CM3*?AS@}7dra>{|Y(oVVsNgP^2+iJG{li=_ zayL*mf*2qIF(djoU6XNdW^=nJ0s&_a z3B!e9&py`*Gfos^ePyISayc;VecbuQTY8lN>`xjh@EomnB4g{!AYC2nebPn+g5wxd zn(fUJn181ot}wUO>B&@=m<#E6o6cp1eKS?&QPI$86qvr6L5T+R4Li3Mwwu_BO;~`> z4Nn)owW9^X#oqFVk*csKi;=?EIALxVLLmPnfKh&h#43%;j190XTJgB%XI7*+MgsgC z*DDCf1ka^%W8&lFNm{RQZARzSLDMg;zN~lOAMw{7;K|E;j>TGXnEgJ12Rjh9F7;+e zOH0bl&$-<-KJSg6+VJu;JJPBh^{4=ol9Mo8W&inY&dM1J5tT7hrit0qZ8>q?YULJE z(KWgSiAdiLWL|rb3TE+;BnWLHg%7(eUo~Y>E5iG{oQBU&w#!{d-)9}N5g;glE%<5w z&n2mXQ%Bt?z+!Wn88}h{ic|pz^}alw1S^vAZR)3)J?{14T6=Ag^V5PYZ*4p-p43lk z^7ccJ-_)zzIA)bsGA324w|*g`Em7=tCa)(3x^T*6(_HoE+r|JE3GO48%egdC_peZ6 ze4wgvPES!l00$MmZ8LmPu)Zly#oV_AmSucPO)fugkw%Mq)x6*B{U35~r%@C0_lrC!rmHM1o3iwt|-rF zX{stJs{3$w83Jyt3K!N&u~F)w(V49qb0X215NpSF{E_kk=Oq#S4jsT$n1oJytn42# zNUaG2OZEe;e>Y$*B^WQy2g=`uxyM9&=DTc{8q7W7c0F6hwQ<`b55rsU4MFtbMO!8& zV>nV~4W>Pn$ZTk;sLJE1);UOwhLY0ebj6!6Y&v7wNSaHNN$gqt{Ld(j3tTKb zw|q`-v-%p;I_#0?B5?h={z~qwY2BO8dh&Nk1xVilt;p)r{%jb82vCAl)C|+8(yXUm z2WTbY&&GnLeX-(-ma4uh)8&M88_Ejb?xZLR6`|l?BG1y~+`hFToz#X#&NRHid9ZC-1^rbU=DiN_6h5UkZ%q6hnL5Cik6{MIKY z#Lu>|`NTE*RnCqdaDLtO1d2W)eKr~WKHf+i52dYnC>>4^gtqp-|AD!(YU0(fpo?$3 z3D};ihQG0?Ey^)JJUnC}gaifuz>D2}bwZa6KAey4Juutr>FK#stg#%Jia^6eJeCqt z%8Cg}IjVA@^1OT9`?zIl3Wx|KNPocDRV!#IH@I2ND01(6Sd6d<8ShZ;%8toijp);` zKMcGan8r#{!=Jir3fy9poP9w3ACCQxb3o3weQq0uWEB-PkG`8-h$8fu~w1X=s-nL*(EEZNf`!2+Ro}zO&yqVer=p1fV)<|LuJ2OAtkhgo{qfs z`#}};3npP2Iaay8K~O;tU({LpL@&jP`a+&`sgN&y4@P7+!0cb8ZJVxeslHW)O{VYp%-d8EPz-tHsd0p zveWFY3M5alcl2hA7C1Tbb=_X_vXY`ov9(g2&=9y2`$G=+s7!scwjkyD*7p+l&qyY{ z!jA>{#IRAiv>yGCG?z0AcG~bFbJzn_8)p$7&b#g#7VA^f1zR}N7a!%k`e!fxsf{Qp zNGsA|thH)%7j;^gUaEAU#{44 zqs^d!<>{ymU8pN1z@S(Ew-Yw3{-hMj%mJN@DF_;PZcs#yP+3ZB{3ZmDlwEhptY5$K zNvPB-WR!-TIZAr2cOoX$asX{+)K4zQ8ClcNs_X;H`F^f$e#VKL?*3dj5x(g9{pxM0 zFW<3*bwR*OXcTV8ZEQ+9sgomdjuZJXjMvPNAH&=_!0IBD^f~LX+{Q&bJZ2|6B z8Thu&?G;*)D=hqLv^Vu)5BG}}am&wX7T#xt*(r0Pl>emIGHi%+l+$ztYV)geY`-e= zjGuMwS8uAPK{=!*Xx$s_BD6=MolL|{3z6*GF|ZCAxBbc3wI7B$pO)X+vJONgTwGKt zhUZ3IYrA@`JJ<+&O$e$4;f@H2XUQ4ML1+WiPzq7~$z8YfU@!dIjGy6NAZj}(y-bx9 z^ezWajK=>J=XxT)&C7+cQ$Vfvc+bh*dNWUtfDD$%iov-%7-SB8%k}kkojJ|@u2k3C z`O4V4wQ?5Kqx-RjUQ6Fo@^z=%S#i86iL0Ee%v{#YlHE)emSx_GnyNB%WVaQ;XRBs< zd%MZNtYOeqstOmN8ypx-v7dx(eT?$q*LC?TB}Gn*5>VQ@6LkM{y4r9jFOD?%__z0E zxl}C%b=cDiFfO8Q03VpSaGDp+b(2S)w2#Z8``77U4oSFU{G^z8I_Yv!JB+H((^u*PUz*{1tR zPHq_g!;Xx*d<0HK*yG>DT88TQ8fE_oACrg87Jlo-gD>*R&u+u=l`HPfFA+XS|MSx7 zdrZDAQ%%73SeT4t6>T@@YUf<>P}tz>2RyI+X(aNSnXJR|9YxGEulbN@kp9{a*~G7; z8Kf{TAjWf1JFUDDX8o|UV@UiZiS&imoXlvw>CeB_^bK@f7@`gre8`(GNIV}AusG-& zBQJh(94dQ_bkyk0@fr)s7f4r1tUlyk_Pl@Lgr58Ds3Ei~x)&`O<^)d{+foXGc)*k3 zxob`>HQl>^*t->#SeWjkav-c1lKQ;23i$=SGcAA$0Tj=>$t2{#~k*-R8ui3=lu*l>Hf;_v4>7!ac zs(Qdv?!=i93-JbSm!!2UWThU!2WJ2ogc85v_J~2C_Zs!p^G(wES*7H9 zIlWD*D5@y_R4!2^K@0bK9y!~9b^XO2tR_yCiLX(*wxr>)r*Nb>kB8)T-DY%@nNYUN z+xt-+|C9cG!zS6R>CRnvIIq|JywGjW;4N$RnGL=n9zf=KwbD!ObYV{s%KncQKz&Ib}*Q!EYFWcm=#GJ8pmH--Dc=@v7f ze#VMNA1hSjV6IZFO0UC+?|y*(=^0ic?wD6b>ifEF!h)J_mjlAfF2j_qLew~@FB!Ul z$;aFcJ*f8fT5hV#PW5)7uOx7?)}UT1WP9vtn#yUUzjPU|oseerf=pUl4@alkGqY3r ztrWbDH}9@l2avy;)8EWiDyF)QEB?SDyQ>vmp#vee$=WpW8K=pBTGMbKKIrIgQXCGA zopqgbppu&}*-RdnaS(7aa4>@}nNaimy zS3EPMYRxUZpk8>wckoImEBS!3}vVmIY*3Zpw zN8y4IrD{()^K)kT!ad#-f8Tec% zrJ<9=@@+A%^s|3S0d%VR)aBt&^4Pg6OYjxuXe0n0)KJx(o1f;|Z?4s}ZgYZD>DU2@ zTQ2B6jQz0SvZ>-|F3-B`<~Ajgn^5D7m8q?%ZRT|z*>qm6%ZCQ%5CLs8ON-MF{kdss zaWSS=jm25(Q`algzbnd(2a9-ZcIA}uC{u>3s;XOFT9F^uwNTC*SkCyV`7)s4$KvC2 zb8^>K)x3GKu(Bvz89(Xqb^e8oD|J8?`jLP^tD-!={hi}@o?W?%#|yFUEO5H&b7s!u zV#-jXzxy}Xy1qt`YziOWpK#fRBI{sc^b@mg{g4_bphT$EnB%pE6igpHs6Bf4(`h8} zaZAyr!J{=Ji+7t|!~3kgAl$P-sHui27BZsAQOYyX#OVXVk7>(Z9=% z>31wBHyc!C*Q+~wTHqMK>-iw!nwM9US65!YTYSBYvTM>B6_mcxnxFCXi0JU*Shewt z);4CesDW%wHT5~0Hi`mn+vnkmgf&`pv2Hf~9gK&Jz{Yyq9dW8RT;^#_*i|>ZkjKt$ z?`X@h;&!sFo3U$mTwGl4iW}wEJGh41oqc9wzI9OAic|6nt;)GCbU)}>EBq2cbw90^ z@Q%O!A2-ct`HtNIBqk+cCfAW0T857qmbzcG$eDUP92w&G0IR;l&s{p)9~^9v5otabdOO6#%7z^0ln1LIAUonOjTSH>y}it5DW>w6uZ%dA)Es>U}=O ze4Z>dQ;3~2JUx>OM>NE>1d=c)*jn(TMyssMzsIO*CSGm8+*i^+LVnCi@r=%!hv2(a zSaqYX#%(96F=KumfP%x(6T~RIZ*7k+PtAYeC{cTMYdo{%u4_Su>F?r;#QEOnj&J-| zT{I(?2Y7-ydogOKs(!|h+%35_7k4mehUtDE&G2K$-cKhor|D6+#8bVrqW%Es`GmZb zvELoY<@Kg)oR)WZ)0O#n2;+4OZ{`JJv^We*Jr%);w@T2aa$zdhTc053?)fvbt~EU3m&Pkt?G5dz2sKhjm9b)-C2{?&lN}%sB^o zYIlEiux>q{W|m#|ubr2a-XL#=`NyOj_GRNk>hTcLCkZBFb+|5s{yA?Zb3Nv3HjfFO z%w94U!0HR9oNW6T(5Qj__S2G$`1u>vF}Esh*JeANgMMzm_Eeo1A>GQoI$1AO+@A;Y zp9`?&5kb>4Qr6dP?WOMRLfz{gO3*`;A7q^AFsE-z6oAW4zxVRvkZ`bvp8f_q3eJZ2 z?$Vs#Hq)}17^-Mru(RMstq1AY4)O8Ga#c=wL(|_sv`A871~cbjPnV-4y(Tr+(Yj-pjLU0f z%`Z^GckMIV)7%}@#-mKc_GteQl=kl!>H0@Rh0yfr;QO%qZbb$5M&{_=5uU0^f<>k_ zxA%m|fDeL;!SoP4c|&2}j&XMSF&%o@9S2yl$BqU}r`pntloK<4wOF*@;9D587gSI< z?@ikCZ;{)bPy|r!sG?eprpS99(T|kSz-rxNK-nT<;8R^y?=`&6-kEX2f4;SRc_VI- zxF`FVaXb~v`QO^A6&A3BJKtEcJQjU^y4aP=hm?qM__>&$Y$%&ge`;$(2jj1rcc_2; z1Kh!r@yd{wZdAObrA2GyOJAT!ru5D=BZ=lWjrRW%-{qC2XPdfB2|l{N)!DpgQT=y& zf9$>Y|1Em^-yz{s|Nlu!`2UN3@qfM1&3#=E7!Uyfku55Z{I5nWO{Kay%R$5M z7Zje8IagYemrdrr0Jqw~2W2z~%%avBZ@>}*qlkhbd>T$ zCwY}DfqV-wzLLagSWafHvchS2^B$ouELD;sZ>>lq{5|fg4^GeG7sBiA*CQk3< z0NhCMZYd34(}j=zH_EDP%I})nlQ))ocX>1E^l{_SC(ccVuAyhj1*}3(lQQEYQJ$4a41;+sYIkvC73$ z0D{w9!1Mj9=YveLmSrFqTRNAdw;W$GC+0PrFB(%_435ZFi2G!KDICRyPOCW6$nWBsIV0~nKeLV%Z=<`5=Kre!x$xSHbS~u z|CB1SD3Fa8!zPxGK+6*^mY0}8gSxE^S>w~B&4DF_8Pd!3>!3gYaCVF@HiQ=6SC&>? zo!Y-H6&~kzW<<%*PnDkRn3#yg*akdbY%!V~f50bYm?o$P4>3DC1_D5S7SPl;$rywH z$o(kTVzs*XxDeWmiu-qZ5HRI#gMC~Z;&IEy2Lutv<2SUD*En70+C6wE6g=@bG=}xu zk!Yf{o4&YWG{#Fwu-9UB+b`SLxXqBFyG9E0my?r8<<&H$lyDJh)ls$M?o8@O?C)848}(H-I0o2`=@WZ&qW`}6Mx0< zbE985Y4dBN#yuPId+S>1c8M1|5|DmETTEYqt@k47{Be{zD-1aZw2~ii#xTUKlb*7p z@{Qg_@=wx!f2j2-p&u<#O#UE30~WMkco9NeOZi#eUm?@h$7H6P$2fYwYsktWJvJW4 z57>mKiW-a&&5+Q*2Y+{<1!*5a1C#)viHigncE_pq$Ak_Vumo}{lmz@ide@!_MHx>L zf+BV&KT%4Yx=%Ght6{5z2cr=~ZI>*O`WO z;iM@-XkRiR`Er4dDQU(t=xokPvS5jDl@}$&Po*~UtNXLwrRf7o@4Y#`@?L>kadm5N z7~Nw0ix$zMI%{dFSw^tMACi#P0tLUT9chK?N!M406hG5Gc=wj^GBO?p zX57okD#sM1$WW<@xu^`tv8gM6GSU3hqW}*Mf;E=x^M=`0?y7a1yJXjOp(2pXsB*l= zp?xRvbu3PzC}qKnA6JpeP{il;+i+^xLAv?*8tn8OV|B?K^)|I5o(60C5v_%JM|pP6 zsrALOheT`GxS6=>M8Bhqx;J3HKqNV#Jp(0Wj<5eL^gd-|r$Oe|Umha$3CGT$ZdGka zK)D=Sx!a}r;C5kA$(rx2hv?D;wJMP$H!?V}guf)qJVr%^C{!w1Wgzn_`zpI&I6Yos zQgoP=#wYyhs$339SaiPSG=_i2spBUI4*DH_EY#^kwtvuo53JzuP;-gpcL&3uV_oiU zgV~N4B!D(36L~G)9{@KP3BKFvdhMhs4!Jo?RmzhJ?`-V;K=i!Z zyG(kv?Tv1P^*oEm!i(1G&)Vj#AkY(7rC7&`nZ35uo*I02E#P+S)6me-Y92GLsNv;y zi|8%j_|PZ)XIxFvR)L7sk@Q8zgA3#v@x2a48)c+pQpbnUgs@TtP{g>E(C7Sd^rH=7 zHP;MWO=c@7FsC52G`H3~J-uU0s;L`~PDT=6t2kp*|6cRCcYZVx1yLcx6A5I9B4P)X zY|6=+fYON6lMmd-n@-pToUFa?eM#tirh=DeBwDB@VAh^hTKND3J)E3Zj;=Acdrvs&ITVe<{XBtss+v zz%jCL?+WY3Osu%t;xF9L`S0!r?#1rb40EpeC|$-T zz1{L^U=_{#`O6Qcz~gdoVxGVyniu2N;ULJJ1Xa`PQiZn=($dgU|Mclo58(vHdxFpK zfN{_vPne+}0+=!A8b0Wih7%P$F)F%FdR zOA?rQ3HGjBkkSCCA|b?-KN$@UQo!rffuRwa#u4d|>g|_}C;8MiE81z#&5oQQ0`ifT zvCjxvbQ7;y9S^h|=4;fW(1MRXx-qn<8BalhmR2`f&c%Lu9g)4ijABb$|3PhPp6@R? zvrctReQf^Q?eTMg8E74~z=+k%FrO1$%Bjl{6$p_6ug%EcWsW?}cBn6^Lc1WbF{KTW z0PX`p{XL$xG}s?c2OJyWE8AWlp@Iyi1kw6$yNcOHVp*fS#*tuBkD?Gor4ZY|nbeM1 zs7`oCU;ZmaN|~#gh?eBQs_9QWA9Fjz_mi9+Ah3*|*nYtN3Df?9VIXh@gT4 zA_Qu)vJa}74X+D$pMImH)?W6Bu87Bs$I=TW3t!^{f${1qAM5X1vwGx`oo>dOPFg5H zM`y9;aqQ}m3rmC|dauBMlA5l7%XLP@>hcG0SIuEzX)}yN!y-@yU#ydd~AK+BV_x;sdb(a&0i_2G^aoSie3JQX1YNlU)wjW4B zoo+n5Xk#t8ig$wy_T=6RbZTj74bsuc4{p;2VF&Hj!hQD{tWT--6vCx>@4qltwGAVo zW(-J@qr{iY2tgT9*P#vx2$n_ftSIuK*N%O?R3Q+~uAZM?Je)m&N@*qWWy zSlNK=1D8CSyxliS-5j3UeMM4^l7oCTW;^C~$jHhGIHAr69$qNfbyX4u3>FKK(#Y9E zCY2-=F%Wrhi%44qLk|rIoP)6YTK~IGex5mBwDND6{I8mU280C#CY74}DU(oA5xSWC z5a~7BBXte+jgkyUc}3X7uH%3TK15VQJwipD#zzUSz?=?nNsVvZG6-?f5!(=>qeadL z{HS84D4oGVmvd3q_c)e|hc51{6Hgn1vr2*DQ(`e^IbCig`hqmYYM zBH63jH()9xSp1;2&o?$OTk{nA!=j^qU8_X>*H)TkK>Og*CtIR-W zaKE!mUSM_evy&F@TH>fl8Wf1pI_Qk>Uh~XwhSH(~4?^AoWQsW|w>kra`welF6d-@< zln^rXn?&Lq3t6Si5Y~a4Hqo`U_w>>IRWZYlNNUAewf)exN>SwmB}>V}&7PFZG71(! zJY~;UJ_zmV>R?n=e98A8qN^FF(qYW85VR#*l#Il!bIpPQLPG=}w6z8%u)b#8C>v3h z_K66E(w8shXkTMLhzGTUXnb-CpY%nH$2p75>60zUK7Hi}VwC>Ymu$P$>-#D1)q1?( z&-fTTeoUW9H8E(nsid!0VP2J3?L)H5N0A@~3G)K!4+s*8L1K6TvVR=KxkIO?xj>oO zG;$()fhKwAJTvlsy($eRw;i99Sm_E19Md*)JSErOO|WIIDOFTgS7-1hL8d0v=o3wT zQyB&!fRUXAlj<}_0$^{!dI@W2J8`4r=$cOv1;la_0sn`o_YP)X;Y&OMMD)y zsZo3Hy-Pn<5VORdMNxay-fC~PMNncBtM-VhilS)ElA?C)C%@nIe4po=D}U#@lH9NR zeeQG4eO`_}HjTEXCROa=sWBU8k3v_!ey|ZNoUkzu`SSOCQYX8Up6BNyt=VU8@B*rj zWCv}0;BOS~@3ZIu*jS_$VJTz|cXdU0K*dq_k!0y%C7J*o5eSG{iGg4>&3@rKS!rZ_gMZwTh7U z6%y9ysL+6th63hkn>HFH=QEr)UP&4F%*6mTNJ*#HQ@xSyLSn-Saf;~-2&Z;lNoRpTOQ>%`TkBewuuFTaYvqZQocjcV;{4L&Z zuWu)ZgbrhD1kLsI81R24%D!gW=2UP-IJmo?M>b$hvUBqBJVp-@M6!Y1uWZ?XJ{4Kfb_tBcWz#DWl(*{i?WjPsXNi< zrn+a&_kh-Wpu|Vi)Wn2L3zFbWcGSjQkK&?*ri~Ko%gntTc$8^-5tz9qt{8I>HKfB| zMXyR|AC*FbY%1m5dWu!)dR7T92y)NV5vzL253i@g9%f2&BHEe?z$&c+>8U1^S$8SF zsyv7+fwTReye$WkQas-)y+boh#fJ>ee&~hShFLZS8)KcqL4* z3JZWG;*EJLf5eV}{;xp@jhXS7o4Kv``1OMG+vXta<`cmTm)-s6opr4p{aJgXHqMoK zd(KA0)G-rt^X~9{tf}xxXi&1aiwO?f^tMdSw5NrG(b3&8jR1wLe-D%vBKb8r0fhc5 z)}&03N1_z1BK>nKh(qff6OQ&?AQa^N3!S$YR?Ek6sGA7S{)v=Lzwl6i0{y|gt7?N> z(2h{8fn@29Nu5&ysIMH~2Db_*WH0|KJ>?^9uFpL_wji4I)$0#xS9NSmui8LxSLbdz zm13-`REOi;aDV>w(&FcjlG0A3IU~mJQ$^^Q&xvqGf_|*Ee?|?f-)kS@JGWBiD2>g| zQdfQtso;nz(cz55E5cPqJR0+!Fo>Az!YW%tq2-6uYNiyFQHc>|KN@6cg&`5U;$)@B zego}NmZx*HigsvGt9BfWj>uX{6!4Gdy>5oCCMOI)GXx|W7uK37OQ_Hr)q0-xs?uw2 zoN0?u-j*hmUlR;TPYHZcP^Vnl>HIjAq{BLPZ`_45EEMknkN8OyaXASIa1>o_;Dzv-?CntJKyi@iR+UtDSaE1s z5o>)03%=3ut7O-rBG{XYI4=w7GcEBQ`yF`S6B((PovS`m23pelY?&7 zg?f^SMc#=T#G>=FBFn_Fy!?jQm9(~rnx!fXR|3f}d6X;iK_o5X=*imP&$RicSP2s| zq2zZtd~BM(ZFIThM$W!kwncWf=PW((2ssT}@pGQW)s`ptTUdZ7zE*cgAjy|cN5K61nPZ^_dtjOtKvWb`Sj-yH>&{M`L+paM`7j%4O! znYKw%wNfyIfj@Q#=mkasaNsvg^7>kX#|8RyR3He6(m)Bf^fYU^jGbb>Lo}#_ftXbA zIHSABI)y1Z=={C-MKcjqb6^rDrS|?n+7i{{MD{l}KU!Z&bG8Mfb5yT7^WB|s35S-b zLq^l=i>?RHg8%;6cwyNZq^^|k>?u|w8!o;z0fmln59-zuukzok zR|}_Nb24hm%pu1I^#ObjPR<&-PeEtkH9K@|APm+lFeK@muzlI>m|IaD>#)r8q0D^c z2{h%cx5tu?(0iXCulMnhWKWD-jg0;)k}L3i8cMw}C3js_{iG3l?$o&mgJ}=Nd}=tg z^M2MpTzLjciLp*t+&x|Y$1(65GsWr2SXWoCyuJQAUnkmXZqfuXF?%uzs$-J%|DCTi zFdx|7(e8nb`gA8_IC*9Mff80vgho%Vapm8x`_rdIW!&gGuDX(x=`W?i#V%yIxMyLtC~J|~8e zCrkM`#rtr>Zb=DDmfm-i;ZopcZ4pewn1&XiWsC1#NfkiXJ+h*uk1_}_@*`(aA7n0x z)apxT2nX6ilkh7-Jq&2G&#l4Eoc?rl7cwU|^@mT(mqE2XOsV&f>(?sQ0e!Hit zmuHmp$1}qZDx(vA=nlulC<&>T+8b}o=rJF=DKfgR{ya9O?cyEDJ?#5S{$%C4j<0L{ z1~aDC8RTQexEu<8=ZoS{H|S#!!Y@p^J+_v%;1x3s+Bzu3=UL%gzWFyhJ2@qL zZG+xZ$~+3-@e3#Nz5a>Jg(Z4r)I={8BRNT}1aO%fIU=|w!)%zhXpwE|q?cbAANp%{ z{9B8`oFT-${$#U5PFD70*?5iS5OdEQd#HB%`|3~N_LXJNL39T(XdZc(A%#(g%ypYX4ub%9Al|d_tr8&`CdahL}HK#D{w^n$}Y49?ISrE1GKH_S9)9jm9wKj zW`a2TYr@c=&$Qot@+ymZ!VxzT%d2zE99JOmn*8C$;1@w{angjRivK z1+VSAg8cmaJy&07O*oAhz-GMjCQqzod(QqgT=rVjxfMzW9A2FZ0ii4KnM&wa*_di9gC{p@@^WU7bBZD%dTZ{>owwK1EwzH9mY_lPkNv%YUpilB1B} zMMq1uIgxWDyf6Q19{lL@U+nc!E0YX`)jL-=#)qWK^U<8T6o97eo4+k{1BGM%J-)V( z6osHl0LaS{A3VDOWwP>{j&6VyzSJ&7(S^&2}Wv5 zN;g?zb~hs&xQ;^g6H9p6VM|cGD6@YCqbX13H(8e$mf|Ie>Y!cWj+Vl#5^Zr0yjzz! zR%O54KHM4aF=pDiRk?Oe`uOU@Vo#p=MF8xuRb0Ghbnch?pL=rOZe4?R0poD7qAA>B zGus*pjpgK^?+CdqT<=;&B_$>EYmzBF|AFEovT>tZ4zOEx6YFO*_||!O#>CNka#GHo zMlDqnp&oNKwf`sw?60%rTGDJt>nneaTPAE zl=4UOf)$MV%WeTg4_y;Uw~CuwOC+-SMY`*RC1Mj-B{Z(25Nc(4M2~ zt<1%oNo*nAl;4V4f}PD_uA)yA4M+w&D1Ceg2K`!0eS!WRZatjKa%c9}^Mh0&8a)8% z%(rDz5U!x;wg1$T1ji zxdTrHs=2iY^X?|`Ye$~zPsE}y#D|Db)x zH|8r7f3=eU7`ek_v|F@vgu3R-y`7We+#jpo(?d7PFAaz7dL8fo=?W*NrhBiqY1U#e z+v12s5{EM1{2mUuu@Biv@Vol`t2E6vX+C8}R~!(-N(QALSf5ax1ciEacXc&oUv}RM z-F1uMBz!~@x(->xC93>yekT6*cmn&IH)KV0JxOY6>D8?ZL+%{sGAb@S}UWrryd~^$p zi$xnQ1Hg8%kP7hQaa-qF8&x4D7Ca+l2)y#;KE#3=e~fujB=X#W@=nhtp_&Rij0-k6T|2CosW@X%!@xsDzU=ap|T zbE20CeJ1`_xV4Q#2hlt~=flaJ)x*`DjrhuoGi2u++l1+AjcpB4f- z_%+NNB>cz6URw+=>8x$qj-$KN7|s<>mef=i_!Sjig3a}$AzOJS)P7uX?4>A}1c()? z;UbQEvq}*frG;&GZ~*G6awQId?dH!y_;JMX>t=fvBN18#MECE{Jk=$b??QaBNRO)_Xn6Z38d(Op#_;L;QAxZk)GbtU} zr79NvjMS{^ss~o>xSTvDu`cu)qnsQMWt(m@jLbEylzdb2L>b7lJQ1vqPWrlcc{3K4sZ5lem2Aov5z< zX|Z3Ij1=$E!xe2?Y3P(3XvEn}%+Ck9gg98t- zBB3L@PSSyv?HDah#|CjxTx51<%Oc7bsct~OD4vBm!%vng2EVzrikbgTmR;+`nIYB7 zfI#L|)a}&Zoe_jW2;~@f=jmAjfHvX-5VfCFv4kxKnSlGDu8SKJ+WL1KW}1hLjb^Xy zo^d`(J;V9+bj*XvxF$Y4W*=5Dfg-V;-763)BN5jbto?Tp?Xm5hov{TCAAaP$w-2qy z{9(#e(_n*$38&gvxN;lPOv~0*a6Mn8jN3yAs1ow`&$*YgtK6}TIt+D^kJwl|LO+^z zp)j|!gqHA2sd+CQ2d#)C3TzU_4z+kvs0L2#?+dVROBJF!@UiuOWT$OT%%dpZtEkH# zH6DFzC22Uj+f`r7qr_t*BNQJ;6|`d*DX$_x23u4BtW6=mJ#hmVtG0$`a$Sa zA?8gcU3|I7-u2Or+miuGzAn4}z=d65%z3+7vFCuH} zqO%hqRL^ITr?!+%2~?z8n1;2nCsZ+Hi35-bNJNDr>WFnL_hUpzrLgnP+6-FOPDxCe zq(7}pbN@l*bx9G3GL_*@TItSSoCPge2)zVAUTy$%vy{mqyQ_oU4_&U%r(TZxzeD<44 zxNs5%qfRAHl%4Tfu}8g?OoUY>^sBR?fx>;3*aszbdq9;)uL&HSRX8e!u}U|xe-btT zVo-vY0SRll)sSbv1i>eyEXr28c5Bk`XS&@^EmX7V(B#a>B@N?eP|P(bb2PSur-wQF*snq zH2rmT(7J?{YS%;>zW)3DVPEi5KLD8nKs8iktV!N7OFWTM#`0zO1t1@R^EqeXKSD4)OFEVqz{ZGq<$Q zXxR;QVYarW?S*V@6dcS9Hp6q|9?hMd15 zlf_A=5dniC(Qa8u$>8JH>O=2d=0Dov=Ei}0#JBfkHYc?=xD?|$clRzXW-FO3K26|3}$7~#0&^Zde-;K%IeBdBMih09<@a46D&LVwxa^^IXrJ#zU)#~ zfraT3p%k2z`KiDRGP2YXDkxNtqAGNG4hst{3+1%6;s@X%yIS5pw_!ib4tEy7f>Cj) z@e(h{=^KY^c-3j}9ip!eTk30&!rz{3C?e)0qCOn7M(dQYIQ^z%K$QrNb8ab0zgr)O zkvG1(T6p?-Db-ROl$>vqFA?{5r|!a%ihPi2UMi6itndFzC3BJ&)f&VMUD!LmLG54G z;A=)0^%?p@LxI-v+3hjm^1{O;#T63>WcDMdL7CjmIP=ZHKIU@Ly^C2NS~h(mI%z)m z2#F*U?}Mh_zn4)B(u|Nw3P+iy-(vwlbB8yBkX&57X@kjdL39j9IF#1c`&U?KacFeY4 zRuXjbRNIL&ZZqjKkvv3&_p)r1-3$GH!Pfu5T_^aO`lqkyp)Z>jcL^ab@U;HD?Xm(Ya5jbD%3oLdAK)DGTpo2>0>|f*E-= zt_RT~8i(|hx=kc|04P08bD1rJU~eO5mk1JNvY4UCEcUz83qCF4LKPjp!3@@BwPHhl zYsmS-s%=TUv;4vX#|AT5|EtUs5%k1nJR~A-c4z%vj#o>app8+Uwzcf8T@V<$MKc3B zw4RRHtQjXrIisTquQ-pD!Ad<#Cs6C!NlrIUQCz6zTr-YAcl**6c5dFYcxw7y z8CVo}JZ;_neYb_rQaa@LZz^&?{GI(}@LY6o!ygOtZk_ZabiJlQ@TA;rB#AF(jrU4% z4CVn`wPE_v%GdR>eowu|&GMZ5cxTTv)QQ51Ia;W?y~6v8ELEjT=bS?r0~AU!ke?QF zOcru2#(X^!a+Pd{-t5E79QJ(yK{sP9i2jV`0u=331!1!$&d=m)$IO1yf)PN0t+)Q3 zKF!;=_j)KBKDUH2RBd)$%$p^9{+bJ# zH)$90eE3^QBMmK;mGZ@LTFsh}|C@bO^((fgxBo7SE|NgoYnHW029)2Oj_~bb)8f37 zQxh=2SP)>0H)yY2LOG9uRVX;&&X3}UNJs-iqb7{a9KCl7Y%}Xz7c1@-C(E5*%^#7k zbtxztC{@%3&KZo+$4|OyR^Uu2S&&*jb5z+-0O&)j&-A1s@WaVliGa(#9Pd;A=J^L! z&C8^(5%*|7RJ6p`7tvW592uqMC*`P=x*V4Qi zeIzXHekI>r)Zd=;TSjo>0=V>lkmZU29BBcYWA^PGs> z;T{+tH(EA~ilNd60zN46If8zDToK7wteeZ%UvZa^LP#^%{8~$U1V|8gp!By}aOn7R zNV}5gVY13Uwgmu$xQ}i1j+bM0){#xcMppk^cUk)|9T7 z-ENYkuDQ8-cM0euN&(z;w7B#|SX-=U)>VJj+uGZE5>DW5P1FXUi@QlEDM`1j_-9nR zmsKpTGn_Q_X)WdfLFYTGtJc4xHv*$r)J-Jx{Z<~rw5H+rVq)PX1{rq@6#rZX<3wXX zh^7`Io&7|Goy(8aF9hGR=aU#@#5~_3&s^Ei*93eKo~+xCZORk5t}}uGMkNHcz=*|` z{74||-P}Wf&W~`;^6al}XiUiMvQI0tH1Fhu&}FYL?XkKPy%I737jSbJy2Wd&GNT^g zV;MyHi%B==yjrFqT&krn$N+b<=!LapF}&Q^viJ@woWX=!ON!TL{B4qtTpY9znAd4g z3tJ|nW|rfsd;#(i)Yc~irqu~e4n03U{^!#DN9kb%cfZ*})%1`=|5Jp% z2H*~s{<#2d=HbTf@O@8Rq-`^;$rSEiNJ#NcZO&-qQjx7p8zQw z1L=Si6e4vA1PlWepxI39aXzjv7|s}x|MbaYGs_hM&^F!5s6yG@|8xp7gr5W{Dwt38 zMJIMPdbFH8AFg~64A#4gPkGVxMEuXJ+q+fNB_fx6FuBc?kFW*T|BRS#{_%xeMc@8qP8gch zttLsE^bnprsFKdLUivsP@RJ-+a}~(322%~nOW2f!6|9z%@pRPmhC7;l;!4oIJN)w; zO8$f=!k4=BXR{yCoBDf7p-}p~j=N*v|48-sV2+5$){4)%F|GfF@NE$uKeb!l(ix?> zsGnU@X}9a&4Pm@XLfwtg8~?jObuVA!5@jkb3ghz<*J-SU@8))J;Xk5}0-!l)z=%Jl z+jl=0C?M2?F0V3M`tc3+6v3eAv{O-+m)_`o{EIKR&{|STR#TuNJ%!?f(oD;EB&z|NiK}qM_qw8{p+X{F#`HC>o5}lU5YB(cTv3(`^GDsQH zjmX@3lHzE?gZYDP&g5fPHNR$0Y^=KGwu9dv%st_ZXMNcbquFq=&UYsRom>=DBZVtH z54qSdruV7OTo+CD5feuByxD{!n?6!8!L=|c>0VIf@1FKaa2Q-rpWy9X?rPfVUGAi( zm2os)M?Tu@s)ie&A!^QPb_Ci~E6U|&7>L`eDaRof&M-$qihguW1I#Y~#P)V}&OCqt znlZlJ5mbM}6rAKfeu&ZvWaV7YEIMdxWH>I>h8|cTvB;u*{iqlLSRIU>S*m-$=TmG;EnM7ua&>mY35+Zxuj99&;>M|#pXgb(^VjM z2zi_zs75E~sgzk`-=wz3rlU4KG!H??8g<1bBqU{If=;j6V?Oj9LIuh>sRJ4#ogj27 z@pmNRktxwdSF>qWXVo#fEOxMrGr8=Q0De>M9rxP-sTG^!&%J$K>4y8zHmr`8=phFzB)U2G6~z50=a5& zZV4AnC1s93ynQYmaC7zN-#f!r80?&Dz2?V5nHaF5A&c`<9Xy_&BI@_?zvG9u|BBur zGS8Tqi;7;cDo*~77XS#o1IFi+PjL@rRhsHPn57oimpC&EOM(i3tZVIjN(J+-g$^zoizOmUye8t*m4Mz$pXBxD#!J^G zeJTO{)CfkQUfSFidTUQjT<+0P0PeD-&Zx$_oq4zGp}bn^1k>YpPwG_pe)EG%8!VGJNU(jiyb}9i6|wmke6@l2(U$bUJ{P=6Lg) zoK7y^jO$IMzSX>oNo3NKBRpl9o3}4kPO(d$Es%&di;hs(TgRC$JI4$N_C z*vp=OzmhGxJ34$%_YOu60`{dZrvD4E_+Z`5&7lWtOcxr?28~FV(v4!!aw=}QE{Y339_;fC2yi{!XL~AfgkxoiGE%l!b zjY=gVJ}u&|JR+f-yc9_dp;s!kR@I+S))Dibo9yypXJ^0WH|y#G4+9eVrhNbF!*6wQ z3#kPSe0l^>QYTx*=!PF%j)Q+@$@OGU{hG9=OjU^D@3p8^wV~iFR=@i#TMzj0aQVXl zHk8hlfhARh_J#8FkR)IPdKaj3nc`_@@A^?dT|NfKAkWeWcqc|`;vspdTxM3i={TM%fLeQ4><=(vs^pvz@ z#I&__b#-quHQ`L`xrvWE&Eq`Yu2(|=kfGfq0D-dGZ0*iqz1#?=BUelM0-~oiFU+4u zjup#~^mlf%mvq!weOLwQYC59f1$>>Q@GRc761SwzcBQU&H-8Ai)$sVZT9@-;4l$Ra zMxr2&L5Yh68jFTNNuXuc)lYXZ{K0?nFF{Ew!IhGdaa3h5GotY)v=9aF>^!pzSltE2Lx z_&Mx#a$0BIud!m{QMbD*focRZfF?ZSGRmmm7v* zB4oW4ro`nR*?SAEcI^{NywbOM2V#ENK;cLoy*cv#=2oBZe4?SzO+*5K(9z?o^=lG& z18yNvD93NtvosD7ZqCsG5BD!S z0`LVY=FPGd$i}=tnY^jUdE*Gq`$3%W*qoQwAtKAU<;vUnEG{QCrgL-iRt;1P+oxN zo|-k-T=a&b0TKU(vNBnUC-2M7(v8MCWInoz0Z|I17Dbz&0eV`U6Y%t!4zA}lRzT%< zZ<{C}HgtOQQA^v~UjtSq?2;UQ&+zUlCJmUqP;F7CFhFB)Q>DCL!?jZ0JjalZ*L4wVhXX^$CLY&Y$b_6~(N_F);eHI0NUbmUJ(_)=bQ2Q$`!`a#1vjy^TfywJ z80*ceR;4@5G8XH_{{cW=e0r(oT0;;$yjWTEio_(y!?N5?G ztACM}vbd{*d{Onp+4;5i&_?=>n_+V;gJMa(7h||%?$^_L3P~%467)=(+`lDvAJ?PL z%r~>Tb3C2&_oc7@%Ds)Byqx;4d%7Hd|1`4}Lm|I0(&X+TK~*_#nUM$O9O%&e)x zfPJC(MjCx~@{j{o?Pp7%Fs^i=D6Zo0*2TCz&U@N!QZ_7fS|~_`HnW%#1?OWGy?HZQ zxbOz5UoWLlYg3qx#efd>+<;3}pRh-nRj*Lh1)Ckqg)h2zmW?Sfr5_)>zYO`iyMpoU zV9ijgjK4jXTJiJtn-{JX$R?8T(ue&gcl+mY&%g7Yv)z?BPMnh#UzRT4yB94BQ?+Y% z5i}Wp%%dND{-B{NawEoBs2SSvhs~mxZKfOax6#(I#W)v0$KgXhKJ@0;^lfv9vajIy zSa7<`k0KEat=+ENPw@g4j#pk{B_(73RA2@wAOki4=cui?EXT+F4H7+~5MbHhQqXJT z|7CmVX}Rzxq9d+oYVYU>#2<7%&dX@_X_2-{EiFa7T%K=n%*&=urBp&9bG7a45ERgg zbfq|4hbLNgxQv^Voh86$-$Te!&%0@UH$ecm&{18}(LMhIINWmjJ`P=X=+kWCikoxo ze21T2>&Q9ld@5ub4e$>Pw64h|Qf95R>K5ONe*L0HT-FEcy~Hi_@bj04eHU>T-Tw+u z%>*gfWZx(C{GFcxJWnAySe{jxWdLq8WuMrv%HuC0s6I>PuSVNJb;%s+AxTb~dJRe!tex3*KU-SI&93^LoSG+jmyux2K+JsO(z z#{707_<%{|5sJV$u{m$^S?x$f$$7T%|DnS~lC7P#b0mf&yY9F@)S ziy=f{7@Z6bs%TD|QvYJSi=X%epQYpDwFv+FKA`e3A0NTiX3^aR?O!XkoooL5X=%9& znP-Py#uakednPcRZ^BSp?3T@3y;24D4qkok>sIt@`R7wX&X;T*>ly1 z0FVDWN!@g4$V+H2EDvZh&v`e9Sw&Kh{Z? zp+6(6z4(o(v7evf8LPg?5TN(o%DbLwe6W}qs?9ay(c?j5KM6aFS|7QaQTF1teYon3 zC!8n|^3>Itg={fcTrLtRIFw?yyw*0c3K*qv3GKJ0nDw@;ZN{~j8}TCfBVZJryP^>+ z#4+;1K1j7}!;`gJOR0PHMWDh@g#>p6++B?O_*b-;{nqUM&96gy=A}Rtu&<-p5J27` z0YXR<qL&2AZmZ5=O1x>$WfvY!&3?s@ji~tQGkC0Nz&byD4(#+j_0CABAZ2H zKM2II{dMRvI353?8&1s953r_$s%vUFL=v%jEL5<-Hj=X9Ti%aEWH*PtOg*tfFYd*? zjZ`TlK%MEMt(A*i_sw)W^dP9;4!r3~em6NeIdCKTi@R^$7+juq7Nn$yr4|d?ukv!$ z7tw~nmc?~QRgxqsn()!qN~%g57fhv}hyJ-jO6u@-<^dhQv70BJI1z8eNW|>L&OCW8 zpRzr_L_MgX7QgF+Hm`3MLKK1k>DeLRY1KYRloq&64e{zflzYO@c>5_tPc2pCmox~Y z{nnD-MYn+cni33`=@88_OP`*I zvbXtGevZEC&-@&EjdnAXI*=m{E+7;|0XYC2@ovhNfxNK!FSVAJZKT7cY3JY5M#)&| zDu8JCt8g@e+<;J%TyY>vD3Jn;R;eP&21Oi*}@F1QHtbmx)WC3-*P z_MY73_J2Dar*%mXqLTV6zL1Nwd-j#d%rax#s8Xx?-WtW9Z&&Nqnq2SVDGR}m7W{Us7u-EGHC5kL$B*k%Yy~R~5#hZyolmDC4 zx~bd2lNysP2p?@t$&m|iXR@PmV%!Yzt;_!Q>g_A8I(jPvS7ry&OutzhZBi>6ayUP~ z4cDAEf+Z+XG$5t6YKGl0=mk_*ppY}&aOF@N^X>8Qmic3ZG7T}jiIVE1(=~?3SZ@Md zhaQr6-z=8li{(X$@bT3x)JaK5S-Q3ui5bOjRC~!r$PW!HwIFLYtT~aK_PPa=_EG+Xu2e-7t^suvGU61t?YndoU_aV7mQabKZ*#YZo7Ty5aQp z3l*GW`P~mocJR14+8Vd0zLae{A$~)B))Ln6P^{6A33TRL@b^0X%<`HpG$-4ZS%OvT z;_gL($m#k!tC38LO>gt}z!(}Ks&uJeV{qX?f>bSK1Tb0}~_d@4gTHy7l=FpCLH^%8N`*!A+hewa+jIy%uu5+SAfmc+3w*-;z{n6Hc zMMGAXe@59K^A+7rGv9nJy83;&-*s|I*kec}h)sWv*zM0=h1`ty$Oa$(XF3q-05HxB6E|3HW(?{$v@Z8dgn|XeKpjj(WVw-U)k+r2jtA6K z&r5XZ#vZ->tWg{Wgfi+A1C+{Jx0aRtw^EXdU~qa6O5iT12RM8OZ1H@;`f0;YYgs7? zkFCmhS@nt18SZ4PB9S~az&j|&!_PaoOWFi`|8?^s&bu~3TP$yKOP+=018E|~XSe2# zuD}!SmrTkm(PbYE=^lc zizYr>lyp~?u+!ntI34>jv2%WK@WXMVi(bEQ=#jOcwD-@4bAfk2)<$dLlnqw%}6jjA@y0k0W6h zVcjgeBlPc|+=-a-v=!ZRLnEeNz`HMu5iZNC|xyu^nd}hAt!9Z_WhwMe%7>@K`5 zz{xEm@v^;}afC`wyUVz&*s*t2k6Vh(GP{5%F8+;lON;?OBk{J4V)UpuJcTZtOUEiP zLWKB6E~ou}ET{k11+m}Ky$A9&XIi@a`M#awa>&G)hH9ea;k5DP;UIdg^nAyEqw8$h zysM+j*XM4ixs=e*Cbz@}P4rm%MxdxoH@yBSRKoYIr-iR8cvYx>QdmOa3o!DrMX<9?wR6q?l;@^aQFUK57Y%gFq|J>Kc!LjLIqf4i%GDS)&NnYF5b#DJ8!EoL|aBjchHH@xrj3KOZNz^gTe*VIttH~SxqnHn1QlpW1zeE5$ zXkM%ZhkyBXyX{rN<3B$&ZJnUJ;0qaiA$Ku4 z^~(1TF(;(tY&qZ_v59lJ$hTk40E$@1o!%?69u)HABys<8c*TG5=^2yc1(gy<;)an! zDhVsA+n~*A!R%I_T-dq@?Sj1HJbEsoK>$!L+{^f+wpp*7PqF~}+RaUnY0FPEN2|h3 z2p#lb??0A)f~5*1-4A+`%NG)9CrB(`#=``em@x3dK*`&gzu&SGo}j znYrYZA3>TfpVCy943X(~0eU7>7uyHKisp+*E}{mmap+X%E|zVv^~oc4j~|+*M*BV1 zuHIMQANPz{^q;I1#3#B{)&lY3al-IqL$#@rm;|9nNMa?#8fujByHmEy0O#PaeN~F6Y{b64wR)4N@7EieV>eqlu(g7uc)L`pQWfPwa(@AxTrCxajasF zu&>N>A_^X#=6=gCVlp<%zwN(1E0R1<7hs5#s&&|%AY9k*@M+sBnKJD_HPHtZ1)!$n z1G8tZUlV5^HjyZ+hpKRBQO$S;{v;x$3Zu8-Vs|k%|1xs-{izT@eYr8_@q;8ijz5D^ zIeJ?R9Koj+Kc)F!#CTaD>DQ~pmYXuIp9$p)m?~7k?RF+)Z4G63DiE5+HioAHUH-s= zP@r(BEm759`iAm1Gk2YZL=pettJ_-EzqC3zXc)0%m5Otm5Z2n<4_Nt;N zYBtnXv-WP(s8M^w-oz}iXVJ#4U3=9iLXE@>s#Z}-ZMCT_Mv3js|HJ#fx$^0`E>Er` z^1IJ{?sK1$b_(|Q4Z2+oqE*q&>0Oe6BVgEVbNVup%H@Mpw?-(f=JU)f2eg}z#6{=(sOJSlta3L_lS$(5o?oxqy1^F_kePr~)4d4}ETMy@qx+kW z7@havL+mF`1D#7GwNo>upiR*B-^>mSV1>MNs7vz*#;jix7FROZzpm6(fv~i&I$L_? zZ7?-;awVNsU{4SMGJA?$ZGWP|XM4VH@npd3`7yPfuVE=na;tix;VZ^6x~hszPrVw^ z(UDrNZn)u1!y}?gllY-@e%f-D`zsRRb%jCzz)B>+21QCVg7CmG)GvB+m z_zgxGJ}Ml%4v+@=-C?{~jG)DtM zCdm1evn>!O`|%&QR1;;=_lJ@5$}r$scBINvX-L}O$XRgl>rdbCq@7S0s0E~qf$ft7 z4+rTQHdXv&>!Y{?zJPQyA0Xmai*LNMO3L_r6;Bao+^=|=41wVw+1lax;NJ#BI;<)@&z@}-!@0dj0=>vx-Z7?L`v-*Sv_eGgR)bd_=&j9SE#!{pZ=ru%Y7!t zWlB%V?;oRlMqP@Bzcif{E$(8cbTWSY!zYpIpf7EH)2(6Q&)u8NEyiPZ^`m=E>Zfc& z#aNO!)A$ABN|2+i)m>br zk5fK8G<0C#a%s+Ik-GU+w7lFFDuX}EO<##eI7nE`BNC~J%DqrDOi zfL2mlUsX_EVx8o}cXvrMCVCTDcggM~Ah0nlUI;H7@6(IivPfNA_v>FKbhQm+w z%WMjHKE0_@fNWEH)xnr7{`fCle2151(5)0?*eFNyRjB|Oc;d6+406#0uPsD2X!lD6 zlK;TXzkS*$9*o@Kev&l(+o-*^?Dr1rqR9FQ`3EqPe;QeJ!lWdJ4@S56cWpGnWDh z=xL~L!?M(Hy8rx%$R6&ffe**E)l`pjaKW!p9;qC<_OtEZidYK{5YyNhZ?y(!w{1E) zTqidg$<##il2b6xX^}{66D%G8Ugd z@D(yKVbuZ@<#XPO32W3>H?+By2@9#F;3!g^FS)>pznRfJP_L>wFF+Wr|7hVJZkl=( zG42J5UTVL*Y#jv61>|XQ@^^G1N!g~27VoS-Ik`LucGAh0rE;M~fNOa%=55tALlp(G zIY=}0&rPqawj5HNHe!Y|GAgFA%8HN_t)N9@GXm&bCRC8e3~!zM%>2JvfUMvP6)R;u zKV9IIuWx=-b%8r=3w;oD+{($_^3$m-qtxD9Luq_yGJxEheJ@h>U6M8xkKXeD zD8bM4l2;4UvxP67JK7B35@=#QW5b*tT#SeEQPJgwr*S;jqUobo(Ut7%h(b|<)$XI;_ z)^ZR+WzXAQKsr~Bd;O5vmdHryEWP7 zD>=kpK@uxzBCQXiQAB^mO2X!IAr)rSaexa)F5(y^d^w2|^XT`_c2xkMe|uO#H)-R^ zqEuOeoS}gX(Igx7?8#Uc0Uqk7C0jydF~3Gl$|Zni;ljg_}J^6_gVMRmc!f*6bye1FfmrGpN`YCPuKgNcqVWf<;Q2is8s`X zFsyLd$kQr~o|p~xgQ~2^sB?^hx7f?7N{*(nA!(ezueFDtv5vH(=1>F-7 zoXSpoo_v&^>E|moh~gzC0CA%#V2d&`n^xCy^SkadfZ1ME&CJZq{DD!$;!xvpz&>IE zS+!fmq|={v9AM+!$$QekjpP@IolaYAgU40Qm|Do~Rgp$;m6GobS$4^=Bul(!T*%Dq zFI^=u_FP6z6>Ex*8aN2g&q|Ub)GUl!0~QWGADEPn3ev?g(2M=P!jUBxZ~G|qY-_IG z$~WT_94vnHx*&TXZ{aG2OaXj7<|i3gfY-g%b+ppo?{%GdHw`DtaziUXT`R}buSQ+2 zDT|-Kwjl)AX)0*bQjEAKClkA;Iwo z1{3V^T^O!Kt@+V)fNlfc_92&=iIS5F`*EiOr9`b0F7c~^z_ zZ(=pjPbmTpj;A&@@X9Z3156C?3?nmwpR+wZ%1nKH)esyB5|q+s8r>sWpc@;lTk3{S z%km^^`_qq3V9mM95Lwr1l?ZS67Bw z%s7qa!Q*W^m#xgq-DGEINq~=bxO2dNswj*8nW>tCji-ks*|dP8M&@)Jc{yqv5Ca2p zQ=N!GDJz;7A8`Nyr-*kR2iyRlM)e5zZd^JJm?BM+12#8N3nFvSeQWyHwEv)1IbAX2 zWsh|{;U`}9BA>sbJ@1m%e^>8O$ekSZUzw$H7GwZbVB&-AfT$)z^BU;nDXv$N~_90Q`HY^^WHW3AP+arjqjku`F5oy;nAvQb~U zSIswEp)GrNVRv2EqQ|GaL70L=llLT>T}V_cVr--sh12}?7*u$5>CIl`_NPYCKF%C=V_ZY}Ly_YfV_>c83muFCSgm#4W=7=f!c48Wy@7KL&6O zo?yhKQ{cN#_jgN)ja6q&GI7l)aVn&l^_jclT*?E@i6qLs)j_haP^i1Qp@XRhcz%B8 zUx}o!bc1262Eq)!n03hV@Iy3P58Q}P{SiRO+dh9xoHqjmXliJvO&9lG8`e>$eEWJ{tpLi^or zsSar!zYjc3w+p4A(z&xSF)>Y3eC{!9`=KEs`2-xDscK`mw(;`@N9PCD$@I2SdJ` z_wHo&>h93h?hpOpxhbN*by6+c?4`5D#D+zr`gFyY+A*9>@Fr~#@y$peuW27#G4^6q^eSO z7Hy#JV?$H6l8K?f0tD+nlSL0!kdblbb(EA~!2TC~2Sca8B+;3FY@3ms!i~y9yy`xq_)@Bha7Mg=QcnUA#44AcRMPc0jQ1& z)Cmq2eGb$m1+!=(0rL!{?tK(XBzG0h-4_j_k4C19M|AI3VL!5;BcrBh^Gt`zL?hCtUMBdIYG1rkzq3uIC@G>lz7qAG zo?tz+s6f=v)X$Y}?#$PUp?Ea7$0-Y7{6q?!ce+0}m6SjQC@WpER$>$Yjs_R3A_Ld%R6n|h1Tid3drw4Eu9TpW1Yf3W>?aHbTFMNpEt1@8(ur%d#+ltxk-yp(zz2rMZs@>u42kb2xxiBQt{~5 z-;z(ecS3_`wsfj=FB^hmffD+}I5nPMq$JsDG%;5(nI<$onjlW2XpJ=Cer|U)9-y)T zn{LT(HK>^`pLnn3tZ0xTpsZE5SDlSPT|aRwUaWQp_*+I=;$LU0(!Gjcn0T3`% zJtJ(sQVh0zXl+KxtBtCbWc$AF5NC>mt4RPS&x4V_og#L08q5-kr#QUj-)HvWc9VQ@ zKz1YKn6mO=>fa-YsYh}|4}#<5-+d*LpqA1o{TMx$ix)Yk@Z0+x0O+vO`Q#>4RDAs% z@n6C*TfkKaA(i&C2D(cZk>`0nw@R4mL0&51F;b8w_}EdK6ad=DV@w|KW~y)@wPF;3 z!RV&hugrR+xPZDeG1B6?G;+y__ZEayb8VJVjj2d5N{NCbW|Qwg7#I}RjzPbSJ^`(g zfO%+L(-pcRbPWv~GrJ}fd#kEoYI}4`UCyF+#RFs(F_fts%oL3t75YXmUh3bFDyDO8 zRxTVQykfT-;mD;g9d0nU03Sfx9i*08?XsL0v_w>_ZDS%1nqCxO^J|?uRPp2a=?1v8 z^E6ZK_j)qtr`LbjFPy(lHOkdY*Aj`F*ZqV0Q<;j26YgP3YiL^TlIJ%soupkLo8fec zJdi2j1}Z}!o>~-Bm; zHeq3*&?szD`4f1CIM#X<@gm+o>=zm{5%3G5kexguF}>C@EKa13Pu6F*3CKTuGqRJm==Y>r+af8MIWStzc(Ae* zMfA`B+djPwY6(iUFf>$=k8G=Qvk3OXm9K;Qmtmw@hO*A)GN=s=|AF5$&LdEvQ%iWp zmaU#)zg(M3E$b|37+?mM(inn*O`gL!nDJP5Y{BvGEXoJ(Ti(P;f{#PYrZ4SlO&jTI z1I8ES!&fVCOd`4`JeqZw6ikDcT`|%sVLPMwHs4M$-fgv2DsC30;NWvff->CTcPK#j znz@dmk$68w;iR{pF(75(we5=F@47#f}!;PR)y zdF;Q2A1-X<9ldoCTOa$Lxn<^buzLd5--!jEHgM0})O%N54CkV)YFJid&B$}K$!uEm z2^{u@UXgR|VseMt-E-cBZ+vJP;q=ONJ7DS9Uc?k@tIgGlkr#QzW9!HUQsgi&O98@P zxZvX3!?=gyZZ@)~Ha9nE+}$C5HMlq~u4qmez+`?tV~Q=du}VH@|HsP@EZ)-tDasE- zRFlcyN2*1u>ED*&i}f`Y=Hn{*PP6kk66&c<=H}8VJE43EvMD;ZbC|Q-6rj6eKxv4( zR*LYhZD6SoohhL(FTRQqTRt1fm~$^N3j2gr4Rru26IeE*wP7`z-q1ApSeR zP`oa0Qo=+WO)95eB|`5V{^uY6f^U_&W;8TGK)3wr7&%}7WG?vlnu$1w26bjl}&N{aH`30w~~oWd3J(*g|sWI_Fk_xGza1-q>~OgwG|dnPfK{b#d3N3Up;55?<*s{ZU9d$p)F$*`i)OTy zh$X;!xib`Hi4NQW1FtRy6tH$#H`t`XgA`Sk%WYMKD?5dAJFBz9(9rd?=CB*VrL(Qo z(4LX-qwe9*zrwGH1 zs+wX;9@|-Fvg?V_KfqO7MHzz*I1Dx7>EJ(PbShP7DEU3IUxVQdwf$+{rhmafaKA@m z7^3fP?|RgkaA04#2u6_noVqk;ZTV9mr?f$~LGSVO<(*`qZ@afUM1^V*H=F?98xGvLI3XFWuv0R;$+ilUo(}ancWvie$O4fUsXmz5K)d>)wVl z5pQN_BM{KAtKL|-*T+cgC$%8o+;mnY0KSSpMM>%fife$q4QZi0c&j_BoML07wwiW_yYxRDhUDHMC_8nEqb}hL14~6Sl2i*onEj{Kgh% zt2HES)uh^iQ3@+{?vDgK#^Hb`5>o|i$r96RnT<(|5%aSIT4&qB74%B5!B}3}b(`17BGWRlOa3T4FSh=K`myudGtH>@{s6P1E1f7(pM)@)B4TLMm(G=oXKz`k1pKNL>{0h~p%;PD+Ge$hX|T7dBZR$i)?QwrBp}{5|1Vku2S>c;akU`_K#bFm`;Xc5UH!8Xta3{xC_jt0`J4BWMgh^0{D0!Ak&D?Vd)d?IR^N+}<~olsKPSBfZtrCN!Qp z154lVDSLnWHN-~GMqY!H0l;C80RH-%Dk<_=jLJnN?hX4>ZlG4x45ORrAMsDQI&1i# zPs{Wsm-j9?lslFOSChX61gcQa;p`b175<>h zkrY|sDziK&^sQbf%BPz@sZTfnNAMjRei3B^z6mA4FLn{UAVnozSOR^EwaxBow?6f& zV>Wqn)UOMKKKn$TxTYo3(6P(tx~0@kfGGO?)2GbiJc7PfXABf?J}j| z&q{6O+s2Ku+F2j^k6nk1X}e!}@^)MP$)fD=?01yi>R!xppGgVp&!?n97>!;EwMuUx zj9}Y&)RAu@In1{k$24>+MX099H$WVd8p4gjSBqVkndb1D&hV?oW!4cLrv;!2`nD8% zW`)-VAFAj#vKD2K(&5<(5k)8hFr#D0N0|rb^MFXc_|ZTrU5%JASS3vioe+SsKw1$% z5+!csG9}ASf`6r{){$YfFV%74v-;{HL)E%j&aTQ>14WrFN+ox(5*2>k9DY4N(|O)7 z{9GpV>K~W$dv-KsD^IYR1I=p6NA=-snLhb~ftmYJHCzG4TW^&*z((Fh9eU z77uNUwbj6LJq-rCrHg(ErFm?isoVP87DG$W?8bixHRG(RgvH>1;2~ z?_?o7+|jmp=oTQm(48y%pg{OZh92B#nEup%NjUeILdeqkG3(m=yxAkfyW2!3uC?l_ z1Uoqt)$-K&T{>3o|qr)mCd^ z>HZ+Dmrcm0uWN~+!`!OL$Tob1~n32kqF*)j@Y+;w)u4*3lv}pN-_gdZ=lEZEu?u#kQ zN>H`anvEm(30>R3f^f?~>+l+K$|-GQBU$Aq%^m(>`$G*dcD$l)5n`^mbR#u-4iz&# z2xLpPg!&k^(hCOTZF6WBhMcJ5CnWHk^f>1yzBf~9UbF;TXs0&)E?j7E&wW*f4X*Q* zHr){!!6$4P=jCMMD_UO3;m{FqiFkPW)E$Q;p62FE2ad zCrK>94OLi1C@RbogN(7OFpl+2bA9piMR?+PzIOY}PPzJSUM@6K&voFu%;=GO0+*A~ zG@$zvxB4TTN|YzJl_-r{n~`-n8!iuE!7a)ZSB#xMskKTVK6-1VyZ;?wY^0*3^ap;$ z^$KzT%wWba)4|Z<`@fxvxmsdE8RV}&#*sEJtlu;eS=sgqy{?q3q={gIeZ{;>j3FoG z?!{sTH4e434j)PvS`$Oq=X7NpkO63fiL-j#E8&3|PZ>8~HR6~%*0=7rQKhnK;ogy= ztkUO|O*uIdHMKaJ2+j!&o&l8DyvVl4#%3iy^m78%Eqbd8$?}o-M=)|ah&7~n4lKb} zLjnLz?)a{&$^0F6?wHLdVK5UK+5cGI*DwyAtcH)?#; zMI=)Go0Vo%F681UO^4a|6}#?{$iyqY(8DjpQ3OW6v-amccyDG?Q4wd93~u)X;(V!r zj*MPaHLbf%xK|Xxva1{Hx3aT|7xInNd+01jiGg}Dj64tDBmxyFm5bjy3`XKsP(Dc2 zEg}IXz9M;A!X2Z=%_a`peW3e!keivo{oQzmYuqPue+=Bag z0VGi|rZ$5Wvhhy;qF1lyFXx4+q=}~wSZ1T>tZ^LelZ)+HsYOaLUY1*HlYd>`uLA)Q z);{FJBOgdBDpqdjsPMJi^+6z9((*9!OWil4mm}=BB8rt}+=>xQCU5DlM0~qNe^oou z)z^QdFcgo7baI||TO;xE?G}@;6D|1QOt=_m#g?RsT{1f8x>{c_kQ^L!<>PQe`_922Z?H`aw&fnKwQZp;>TT}N>x6-s$cIY``g=Vl=V z_zNwrr^2t>B~S-H1%sy$PTKIBE5Z9Ein|N&2gdaU1+3dF_T0TXV7=c#zfR>g2b)zB z9p0~5p|$}UjFK*)paR4{M!F! zu3cU+E^LFV>-vXX#od~Yyl647WowmiPG*sFX=#^P4nSr`Iz3DOuEOj9Vd&7vLy1IpptDUHF&j z-9UR50-MQO%yRfjcO-V5sSh}T#!v|t5$ebu_ZGkWaDK4he}9WL!9T0BGBLRragz5r z+4#}d*Js?ZMvJnf03@@we_#o!tlhJ$!(7dD$$K>%Vqbw>HHlw9zOM65Y-Nk(*Q>4#L&4jA&+EV3NlUk*3g&;>TI!JnS`BV_INiZvTZ<05ox5ie zBVL(RHS#yc&GG@uQTdizxl1=c1%oc36-k9x`Bvdun2y`)hfEzk!S{DqD>vC;kE;|k zSgP?REBs$)W5p;-$6by@=uGZ!qpMb#!^;sabjVJ%)!iNDW-9sikB()~T$vT!gJG%W zmX=vGrrC3uW#Cw#`43jrrgOO5wQP3XIu?4kJzm=Xsk*jpH;%8?#L}|!_I$y!;1(vHdx7HF=$K-pc@RDKY`*WwMSsl@^2L5&|>cI*t>aaJ~I$m*g?6FIf{BfD+$L6Ve(Y=ypOOxo8@9q~><-1; zp=~Hh?Go<)T29Iz^rh+N+8ygv$n|4;F&3SMkwzL7WXL%OtXJ1wbFD@Pcu*bkE0zd_ zA0lNAer)`(?LdIc$0sVxFmq`x%Od=?K(2kb!5Q(JL!C1%R#=zmnfjlh;RbH9v3H8< zdFR(yO-waXeC#dNHs&hdPt_&AT%F0qYxC;li(iiK)d5E$QB-8?TH>)<+LB1uN2FPx zY2t|pAB2rSagUMlz({(VJm^4M!u=kB0-JX;{x>@J!&;tstQ@?l6B)yMkWzlE&*siZp!j#2 z?9EO;lk`!LyQ2P7g4cN7ii`ii7I8qHARr`(%1CN!XCdK_&oM2+Z&f~Td2~Ole;WFNJYMJ)lIBQAtnt!aOaY^cv8FLmQe-A^u%E9+xoe9uk z*LMab@?)Jvy?ja!cZ!&GE5tUWu~EA&Aw;0b`Hw)GAFua1D5Hm*MP%6U^EyH9Nu#1* z$Z$i$D6K6a8>MDY-CR(g?^v*W60|h-7{;v)4=7y>4FsY@9F0% zzw1YV8a(hx<*xQno6g@Fv_KeEkq1FP>sEWfwvRexd6zahiNHzu)FL+ZQ?1*{S=yLHOU|=cNkiriO$T1{)fXwT~6f`X9>W(e+_H zmpO)?(D9;URCq+ps@ZTIY#i}PSWL=%oK(LbJM$N$41zdC%6D!ntWw?;l@g2POZ)sC z94{ShjmT48$!hKYru4*%rUF0bM+VgpcbY|bA+2R3JVX!atLV3%-%TlxEZ(^*c!NUzo6%X(SV-N2GG2s!RNF|1w>rFu@=7gNrd5XCglV? zePlzgCMKH8&OwRGMyV``!NDQP0X~S1uB73OF-z0c;490}(}GA+PZ5^<`Iq}uiUZdT zsjVOPBmH@xC4PXXS;I%C7$GAc7bRIIOPb?oZj(FDnV8Tu)v(>d{dv^w@=g4* zt3DvYSy+L zqRs=ku6qfJrSOZAIJ6)$)}(ymK;icM-fQh*uKN_&bAPRH*M;=!mo3~jB!(O~i_O>D z5drY!_wR16G5d2-FbC5DY3Obw5z8zp*uQR=8QEV3m4{50Jn3Mj?N-T{>eGe!I4|MkId}IlvOUuiX3sWNvAB zhvjhF{LxET3IG9tKnkxWD-wi1JY;S=9hIr;yxKijXkHH7%EwZKuX^<>v=`qF3uIaN z&Aqm|npp5?KNweKy_Nau*)A0AaBoO-ZrO?+3&ZGyt*VBd-(Or>jdIR85S{a?NOWH2 z0#@E*f$O)P716?$btG8+YEi-W_g>c~qvz#s3~S(puFCF@f#k)L3UnPL_|ov&>h1T} zI4f6-mTd>A2aVrWQ1@`F+d9_vOLouJodpUe*&~^*^U-UC;N?tr@QJtIz|x@QNy=CD|>iH zH~_IJgAPo5e7xD-suv7ac(cKU?z+E=BBHPi+9_kb98_fqIr@gh71+r}8kde4B$-7n zXm|1pcCyAl{2x}s3J=<_+24}hSTtwl^Yeu_Q~0iaVNic}`}JYF!tIWZRoLa`H3r?a zSKEHrvi{I+1dl@2>*8pY(W7N`x4Nzqdp(I+rX10E`8U_t*x2fF$hZ~`-weE)iZ#P7 z1{6>UO43v%^6t5AS#ve|*S<1XlHsV_K0NMis+g-rsE};XNOeAyPPy;P&#+ITW^3zs-HXq5$R4O7rL%04TbOF&Sq3E122Y zuLgW|EG%3GC*^S|$li+rh$H;(>alDVvqIQT(q0zw`N2{s&!0eadZORbTVlZ1js`uN z82sT~MF(3Pd`Ilp(S6-f({K6^u)hfI+|0EMT+BdGEQehr-?uHOR|oM=cx4K;Sk_Y{ z+@1!<#pL_wG7*jKn-%$CSD7+!rBy$^#8rL^jNGQ4Rq0vjNNzIHklMnPc~2auF+nmw z`w_*{=hol!aVN0*^v>N@Bl*)EkrfLHH^TIeN%5KUpPy=gPdGHBF#jZ~zF@lqVlJ#~ z3fJX9_!F4+XRMsP4fz6B-hwT&B3BB=@r!%zlzdC!ict76vidhT#=gwM4$!y zBWo$P&(d2mcv`}t2T0Evz3jod>p&8cG*@~FSXlv-K+-06^qkpNjjDl~84q{W)%fpZ z#M)?C*5M23SNL|e?vLPnxb}Y=YK=0-Ub!?tT|RuJDFe@aD*AHLL8yeo;hHd+jEaaAse!**_zTVD!5Ik7zUY2u<{?+@+rc*gMkTsR zHLTz-7~PH@nG>y7x97b$S(<@v=1~hLGVSMu(Bdu+lSQ!=llssH*P;R*zv6})rZ9~B z6!2^3E2UZpk~BkO)8!#5_DwirI`V;Q#~)aiFekb&DjV|3L!AiqX8j4jxj&#f2WQ8p1_=G zl`9(VP8_BL8yszfu7U@az)p;7MYsoj!S83C#|rugX5-5I{%}8tBj@h_#8YDaJC!QDrf>J|kMx~%;ErjsLbvYj{^&&#MNG)w zNItCgTw5*g3zy5=8GYf04L}}CZF@l>0O@WJU|`n~A#F$)S^1>6&%v2Y$@X*u zwegJz|Ivyt{<~9#cWfJ`;*?$igW@bgBK?_(DGuZU(AO4l7S~#t0v9xD`r2+exLu54 zzy!Ivw~2178k1X>hZOppd)|k2LH79345r7z*XY7lPO1glZg%4p z{tbkC-xJAuZ^T8dr?JY1jw+OmcD3LCpy)h{gFFvAIZjIsKi-iDpV^C61ejYb*gn}^ zTRuU~NPy2IP@71F5VY#h1V|SED7@H?Qhl!QuK;s9*=zqj!9ucY-}>*g!Ma2^x?=gx zUEwOe>)6v@aP)2{{3f5Tu6-ld%Ky~(Yjc-yg76VA^QIsZTe+L}vA_WP2n@W$cFtJK zQ!I&)EO$OTG&F=o1~SW+qx{22B(j8?cUUB@1j|@(VQE}!Q>+Z5=F;AuYjkpT<&7)B z(h}Q~U-VUzm>8;?_sj{+&5zgW z1lnvFcsmuCSyxwsr|92~N30B+TWs$<&0iLXHnB3ri-;F&x4$pGT@P;VY`B|T=eirG zxLb#Kw44u>8t0qJpB5BieJ4BbyTTS0(4Cm9@YCAn#nAouWW4TY#!OOBTLwTaYNu^y z?u%#Z>G|@tCwjqT`Hco{H|8!L4gS+?pLi>cYa;XAzh6v?^}pPEkJinTVL_q@kLK(D zh=#!wb|UNuCGcbetMaXzsh+{M+Ke#zf#d!C{cKUE8U(iftoQW18zY6lCGJ#v#k7){ zW&GwGvMjLN1>g-$UlfIWz#?>pSuW@w_Fkr$P-*5u-2=a1AD`0~b%8%4@rbYt7G{t= zIV7rSB<7->MNlq_qJG>hbJ_$_mKx~76opR}t(3~KXzB0hm&I;wvG~9j07$5e`f5~N zN~-A0?7XL0356TICfaFjOeSl}_gIpSi?A$XLJ7O+Rg4&=|G>?h5$NKZ zuGU+^trWKyPd5EY)M?B&81)Kn@qaQll0wHBj-1wx%*` z8f*3#O4p~K^?FPfDmj%&onGS;;@A|C%P`|lKl%C)hLUUGiE9{)Bw;#}W-i85$fhyO`f$%~{hy>d%zkCBn5JBO|q~+ReYmhCP}^rKHLXe(}Av z4XS_lSP=Fqk*;&4ZY(nHu0J4Fv6{}{MZrKLtWg#(B5inB!YbSlWvTGhlL9~~g-vpe zI%NVJ31$dAkh?bmKC*rhH}4`X_rd|bdYkKKKlqLQ4ixdDL zQ%$J*SDmBen*IBfFDb0$q7f0N>_;iQlzK1o)JePWpbU6 z1?)=8Dm55%B&U%D8e^TrsYYZb@`$9 zRS#=5>I$h6Y2|Yfvo9j)mgc0N|GpnkE(hV3)O69wWT`q(%-fRdt}Fn`@70U)ySJ_b zRb@4QFeS*~NFm?nd)v>MTEE@w&TRcT(XcE)WRY88TKsmMbT8qVT|QKsZ*|br)>dd* zYD8t3L?+u{_AAdE|f17>)Ll{obr=TE|g zMIOM$yyG#?E$)0ciG5Ae;a{GhKZgoSs;WOD1V9!U(QN{8-wl>n<*{E#XnLe&ECVZs z>i9_kmD7-EQyz!XIRN18;jff-zw#P zJIYh`oZi|3R%g_)0Wiv>`{}rc1v-HRV`F1jBet?tBZTXaGQ_YByT`B-CNX73F_8|d z%BZ5W6&j2(krcs=q1^p5#1Px^HMpL8B9UAa8_7)->7!n@TjBnl?T7%0V-wu2wO?ND zsF6lcyyWa@qW^fRB^6)8Fso3C`CrL2$e_BpM5B>kgE_j@TR%;p>;<)qBE&*B-G<(D zK!fk~9GjrxLswdx8eKi3YQsHqd3po$iJfy_N;RGuXqvw0t)xU6AzdUmK#mf*VsOu1v&UYe5z4XZj&_#xZ`iL+^tqUY>$pTSGEB- z%(^a`Ips=}t~?~>I2Pv=PdJ*>z~7)W zLw~tzyyVqa7EH09&C`&yBBWilXxXKgQk>MJDIp;d#pe2gD>{7}_Q`V;p@8&8|)%x6E9b3Psot0T645s|8-cHBflxo}B)wYBo)=yjS zLG>tksOKk~ZnHgD851wONsqWTw_KINN_;WTTN}9$ffMQ?PH(F- zw#IP$tAR*$=3%KH{T(U$@xu@Xkkng`gk|B0%8$&afiKJGmNV5JFdvOGddAua%h=m0 zygT=LOhwWwnY1oBsi(n18FPR4SQ+vx7N)r)@I6sD>3^vD>Zm5)@bA$R5C&4xj1U9_ zq`O89sY%F?7LW$%?(P(%V}yVxFc3*W5u~I>Nl15hzR&l4&+m86yFYfGKX!JuC+_RI zuTQ;FB~y_nk3{s!>#v~ZHrz9G;oQRE7Lcr{nPweq?*&d4c5Kd{2r!5ofs91vvQdEr z;=AOYZojP><2thN^z`-gJsJ=k7PBYI3i*{Fi?CE<2^Xe{#!7+Excb@K|JnVK!3ORw zMLt42sMP7J=JXA_``zRFf%@f3LA0GPxPgG6jW#Z(S3Kw?8j*m!O^tgtGd1J8_Vxk2P9ya^uqgle5iw(86L-~?gz?(wcY=0qUQnU8^oT@4a$Q(%~w_Jf>e zSsx=hoNvTbDqgHBf6`@4E{Bz{wUL5L!I?}isLHO$g@eN8Z2-w@ejX!V=8sm?lBU3x zhpJ;?i;+LWJSBWn7{*zN`B2ld;y(U1BoQkm7)y?mMK1o>o50P&X8%C!UvCU)q|-0{ z-%d2Qq{@r?^%59Ok})4xf06`E2pPCj%@d5f141t9)IdwBwQOa#A6~Tuen9yE1>4-g zwpvhAj6=nNfi?~!Z_6V3hJkK97kfKeUQ8MKIWdp!!*?SK3pS9&XD5f&AtCJbztM3j z(fkeF?6_=<#tgv}ouJTQl?g7alr~by(1Sv8a14lzZ^$w4*8{^rPof_0CmgRbU9{b#xFH#=?;qh!u6_HWNg zSwh|12m2FmFtzvJwQi?sdH3efey;D`+)qck3$E&iYjbDC{HH?*WX=phucidor(et( z>()JbjTe~zyM^xir8$2R zTeYhmW+LE5q4eLvZerl(=2lfzRd6|A(}1y@PgBY3;)neJ;^~25th2 zrrig&QULxwf#d^TJUl1Yw;353&CSj01tL&J*+Bn*fZKe(z3i;4ulw!SS%&s=Z-w#$ zuQtD%F{6M<`q|k$u%iZ)U4Va|eJWd$)RAiaG`&$k5U(QG^=d_M|9F5$IvpzTT0xXo@xRAG01iDK&5 z7>$#d%>y6{K2lSk@DRG19&VHCkLNdCL3qLTPOX_S+!=(RzgOQ3OyB+d$0v0GA*{w! zF%D-OZSNeeXq?|dj%x3=YD1Z`3JQ{nfy9cz&(-K(N#v6io&UoHU^?IG0!G}xKpWVy z0;sy3x%t2Pg4=4yQX^pHc<1CbZ*QHr{1s72FB|yR$TUyN=Q(jVo7&xp*1h|?cSnhm zdmHW&{~-vVLj5YT5nx_$zQ54X*0y^pXWFv%6%rJ*j3W3KhiZg^FOEw$t<* zUdgD>850~+G7sa&$1g*uJp}bk74vlSlVsp`PB&l9pTTR}jIGlKedmxl53dw9`PGD? zg)|bl{BmxYW6NyHj-QM6WLh<&o7r(H(WB-xO8e`Fw0{K}iEo8DC|8K|Ep zFL-0IA+$=1Q>m<#4Iau*ca!Tz!KgBh^6c+oMiK^9!lRD6DMNRdPx2GuRF}m=Y^F2~oNDKS=YD0_R1gZuGci^Dw)T<*aQ6`TR{5`5u+G#_gxuf7%T7vIxYIoHA(Qy*<9_K@FcilnsJel%EY9P|y>e94* z`~K_BqLR%JAcM3}lHdL0+-&J+zx{|*=3voOx;1F?Off3yW+RE=-A5qfOzZBi)-7?k zt2v=EUh?B@`jjtkYL0=l^2|gqr~v_2jcVj)7kr9p2>(kQH4rGb&LwLqe;jzpl5upL zEY(0t_eiAY{=E1*v+~PX#i{pVO@7D5PnK(lE!?4U=`_lSEtQl2PA5nYnneH9RmjTiRh0~fnO zQ3*fK@oTO=+<4fIzc{GFURD4;FyF~2t*8yRsS)mxFk^{G^ex+v6m8}=wbyX>l_q*! zqpP7)T~kvaj zBI6=^T12TF5|6D#%7#^qhf9v@Qp!nkx-ziyW8n4Q+;n;3r;9AeUtl5Z!UIE`W(FFJ zcZw;V>l;g{z?+?$eaIW}d)vEe(uNMl3d?ic#7;5^0+gbC1p86b z%Mvzx*+Ze~a4=6WFm^lOe}pBl3_fQ(YKZ>v8O-ts@|k86%a!fwcuM%H?a#(EJ0#{+ z;#UI_tWE=m6Je3ZZ&!kaw?0a>+H7n-pysb8I-CH@T#gfh0)~xcB}`6cgD#lXsmkvs z_XGSLJ&pxQrHDaung!X^=K~DQOPwXAVy^2=9UPxvL*M930w?aTbAoQV_ir9|{M&W* zz5LftqRLfnZFGKjb$@faaI4*BhzGKX3E`fg0nHz1?0XMi2Y#Hdcz!(YzTMKkZ-gah zdm57z=ycw7BKvh+SmyASq+^>YXgjHWdwu@qL(ty+Wm3oe>^fE1{dc2|OX-dyfH?L0 z`nJp2XPGzfmS-@=$8{edq-;CNl7Og9zfnu^OD{Epg1LsnRCWiQGATjYnN-SJm3908 z3{ST`+i_Iiajdd`uZqrea6W0@H+J?(RG+-p7gI@lIaq1%T6(Rp4d!}#ItjS7%3g%Y zfc9A3?T#0KHGKa3=dIAE zwzHXG|207^=~LZIE5z>{r*D1YHZ=tqxX`15uY=ZOG{+-Jf$7n{ZTST=|53XB%cR(E zJMVFo5)i-w4FE*cf0n-z+x7$YtMseNHS>IT?M)>mC9ly0pQAT6M2+t|3+^uc0`KOQ zBb=}A_DAIZycNb;l)cTlKNt$S9d>HI%_#VKzib~1oHO0d_fTb0uiH? zAA$n6-v?T{c`OTi&F|S;XliQRh3&U*pYI3U-*%k;3LN&jFY(KD1AE`{@?F= z=^7;2+85}f@@&P!gse(itM_XJ3RDl03CEmlo^V{L8yqJ=IX zuweKfPruartw;c6zQ4N$PKt@vs^9IlX>Iz4tSm9lohjfVbbR|pi!0x;khFXOeC}e$ zM%Hg@oNN6x8hQF*kjRzgF7r@08G?`M=C|WCmJdc6H#W^AensXnQ-SR)1JKCI2nl5f z5>LszPU@k1C(J74Q6UJtymoTp^p2jL4HsV`x*H5?oMlka-2RYmNbyTaCsWC=X58Q# zcTUdi1TrIAkD2V>&a^PY$I8me)0+9EB`osq`Zf>)S~a~oh=LsoiXUIhKUmk$Ymbif zzy%>xl|Qjjvgl>5lDVc>{dkl6fTd#69y8-vo@V2dX+1VJMnvScy{`XMpi$I(fBxt0 zU_z_Vqp>k_8uZqqu}5R(6mM)LMydq_>(%S?OB5>kV;?!!5Dy@?f0FY;#qJ1C>Bh>OF(RNF!LJP^0~9ZN$aOgBH!S0A{*{4Mz;B@_@lX^5_F;_ z9(@`rd~GL-^Qsb@jXH#B?-3EMuZ@gM!>UzN!+D?RP;eY>3fk1QN=u7RY@gEnp}vFm&K2g^1c0X`YC2;5drX$eX*X|pSo7@Yx zoJ?H_P*EOhjAF-Q`#$keIGnv1WE%8RtrEpKaPf#7D>)`yJE-Kt+NB`xux&!#{oiT* zXc~Mh9HZ^r`T-O5uWrMvQoBk?lIb=F$%Ucw}Y{`BC(H^agahp{BH z2g^Zv;rwZq1c*&GVntq7b_L#yMeSmJ8s_az!DUYE=h{ybON?8nIlKmyP9KoLc9dLj z<4efK!O2TxQqnSa^$7o8K5f01`6|_s7nF&aelnx{6SfVHW}3;x`iJTSS9m^Kp6L8S|v| zV_L<3eTE4Bu;lg-T){9aT$kYBA23E)zcW_9sV+u3K}^8zF9+(SeN*P8pc^#P443J< zMEAnLwf8|6air2kXx~ZFfb-we!Zno4oTyK2|LRmaT$X0u8*goPtC8RSZoA*R__BIB zQG;r8yC!*dRlYoYf0e}Ocf!T6aT`T7EK@)8!QsQ`{H-wnyVl{HDhtOdGG5{lUk*A1 z9sIg0f>=EHx=e5E@4XOoImaaHvm_+QB-S7#KF7Ay)P9?oW8yk^^wP%KQ)5r|D~)nd z{hsX2Iujv|MxrMG=Z-qx%)abj2M!xKw$_KL*)zP~XUblx-&;)HG@$oZn@qeWJfgDY z;g^CPSKac3c_lec%~!Eie1wV`i6*YIrz*~0U&DQ7?VY7uMn*SRDPb4w`$7Gq?Ux|K2B`)^hCNjIXUh9ryACwn6UEzj(Gvr_0^RG^cfG&57*Xu`ai(8 z0j#y<8qE6oI(J4a`V2sy)z#Ivx3|?&2Zo0UIJi*l#@^ z+TGoqo}T6>Zfb0l3U~d*;8kiXAs}#gv77|-tq8DAjsE_(?N30zA*2Ct?B8o?Y6jvJ z57ojYqjWC1WiM-ocnVC!1D=7yBHH2v-Rg&CDyJ)h4wq#c+P(;Pe7#=$rx;Z$wv+3( zE!l2wAMldPD&exI;Ko1!Y}zFPFAln`m-V#192mW0r)BSO+taIU*)3M*lX2T}Z<~Jg zw~6A30GYtSr#Uy-i$}8LKU30Eqk|XoWRHe5rO~bJb!TOM?H&tC*EQ((CT^FbA<}os zLAyphqC>#>094KR^jy5inoNUK>`wOgub)dww$#;;<9`49H+L8cJBi#D6chxxtmkH9|N}5uC8BZccDv@D4FGm3qLA8-r%1DV=bQV*@