From 234e6bab8f7b55cc1fb8a4bad64f6a18dd0b8b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D0=B5=D0=BC=20=D0=97=D1=83=D0=BD=D1=83?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= Date: Mon, 21 Sep 2020 22:36:57 +0300 Subject: [PATCH 01/30] js.uk: 4 arrays --- .../04-array/1-item-value/solution.md | 4 +- .../04-array/1-item-value/task.md | 10 +- .../04-array/10-maximal-subarray/solution.md | 36 +-- .../04-array/10-maximal-subarray/task.md | 16 +- .../04-array/2-create-array/task.md | 18 +- .../04-array/3-call-array-this/solution.md | 6 +- .../04-array/3-call-array-this/task.md | 6 +- .../04-array/5-array-input-sum/solution.md | 4 +- .../04-array/5-array-input-sum/task.md | 14 +- 1-js/05-data-types/04-array/article.md | 282 +++++++++--------- 10 files changed, 200 insertions(+), 196 deletions(-) diff --git a/1-js/05-data-types/04-array/1-item-value/solution.md b/1-js/05-data-types/04-array/1-item-value/solution.md index e631f1c70..faf4d140f 100644 --- a/1-js/05-data-types/04-array/1-item-value/solution.md +++ b/1-js/05-data-types/04-array/1-item-value/solution.md @@ -1,4 +1,4 @@ -The result is `4`: +Відповідь `4`: ```js run @@ -13,5 +13,5 @@ alert( fruits.length ); // 4 */!* ``` -That's because arrays are objects. So both `shoppingCart` and `fruits` are the references to the same array. +Це відбудеться тому, що масиви це об'єкти. Отже `shoppingCart` and `fruits` посилаються на одий і той самий об'єкт. diff --git a/1-js/05-data-types/04-array/1-item-value/task.md b/1-js/05-data-types/04-array/1-item-value/task.md index 4fcf384fb..4d692d762 100644 --- a/1-js/05-data-types/04-array/1-item-value/task.md +++ b/1-js/05-data-types/04-array/1-item-value/task.md @@ -1,19 +1,19 @@ -importance: 3 +важливість: 3 --- -# Is array copied? +# Чи скопійовано масив? -What is this code going to show? +Що продемонструє наступний код? ```js let fruits = ["Apples", "Pear", "Orange"]; -// push a new value into the "copy" +// додаємо нове значення в "копію" let shoppingCart = fruits; shoppingCart.push("Banana"); -// what's in fruits? +// Що в fruits? alert( fruits.length ); // ? ``` 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 daadf494b..e35410c32 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 @@ -1,43 +1,43 @@ -# Slow solution +# Повільне рішення -We can calculate all possible subsums. +Ми можемо порахувати всі можливі підсуми. -The simplest way is to take every element and calculate sums of all subarrays starting from it. +Найпростіший шлях, це порахувати суми всіх підмасивів, починаючи з кожного елемента. -For instance, for `[-1, 2, 3, -9, 11]`: +Наприклад, для `[-1, 2, 3, -9, 11]`: ```js no-beautify -// Starting from -1: +// Починаємо з -1: -1 -1 + 2 -1 + 2 + 3 -1 + 2 + 3 + (-9) -1 + 2 + 3 + (-9) + 11 -// Starting from 2: +// Починаємо з 2: 2 2 + 3 2 + 3 + (-9) 2 + 3 + (-9) + 11 -// Starting from 3: +// Починаємо з 3: 3 3 + (-9) 3 + (-9) + 11 -// Starting from -9 +// Починаємо з -9 -9 -9 + 11 -// Starting from 11 +// Починаємо з 11 11 ``` -The code is actually a nested loop: the external loop over array elements, and the internal counts subsums starting with the current element. +Вирішення потребує використання циклів: зовнішний цикл проходить по елементах масиву, а внутрішній рахує підсуму починаючи з поточного елементу. ```js run function getMaxSubSum(arr) { - let maxSum = 0; // if we take no elements, zero will be returned + let maxSum = 0; // якщо елементи відсутні - повертаємо 0 for (let i = 0; i < arr.length; i++) { let sumFixedStart = 0; @@ -57,15 +57,15 @@ alert( getMaxSubSum([1, 2, 3]) ); // 6 alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100 ``` -The solution has a time complexety of [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation). In other words, if we increase the array size 2 times, the algorithm will work 4 times longer. +Це вирішення має оцінку часу виконання [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation). Іншими словами,якщо ми збільшимо розмір масиву в 2 рази: алгоритм буде працювати у 4 рази довше. -For big arrays (1000, 10000 or more items) such algorithms can lead to a serious sluggishness. +Для великих масивів (1000, 10000 або більше елементів) подібні алгоритми можуть призводити до серйозних "пригальмувань" роботи. -# Fast solution +# Швидке ришення -Let's walk the array and keep the current partial sum of elements in the variable `s`. If `s` becomes negative at some point, then assign `s=0`. The maximum of all such `s` will be the answer. +Йдемо по масиву і накопичуємо поточну часткову суму елементів в змінній `s`. Якщо, в певний момент `s` стає меншим за 0, призначаємо `s=0`. Максимальний з усіх `s` і буде відповідю. -If the description is too vague, please see the code, it's short enough: +Якщо пояснення не дуже зрозуміле, подивіться, будь-ласка на код, він досить лаконічний: ```js run demo function getMaxSubSum(arr) { @@ -89,6 +89,6 @@ alert( getMaxSubSum([1, 2, 3]) ); // 6 alert( getMaxSubSum([-1, -2, -3]) ); // 0 ``` -The algorithm requires exactly 1 array pass, so the time complexity is O(n). +Це алгоритм потребує рівно один прохід по масиву, його оціночний час виконання O(n). -You can find more detail information about the algorithm here: [Maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem). If it's still not obvious why that works, then please trace the algorithm on the examples above, see how it works, that's better than any words. +Ви можете знайти більше детальної інформації про алгоритм тут: [Maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem). Якщо досі не повністю зрозуміло, як це працює, будь-ласка, подивіться алгоритм у прикладах вище, це буде краще будь-яких слів. diff --git a/1-js/05-data-types/04-array/10-maximal-subarray/task.md b/1-js/05-data-types/04-array/10-maximal-subarray/task.md index f1a1d9f95..b1f71b4ef 100644 --- a/1-js/05-data-types/04-array/10-maximal-subarray/task.md +++ b/1-js/05-data-types/04-array/10-maximal-subarray/task.md @@ -1,16 +1,16 @@ -importance: 2 +Важливість: 2 --- -# A maximal subarray +# Максимальний підмасив -The input is an array of numbers, e.g. `arr = [1, -2, 3, 4, -9, 6]`. +На вході мисив чисел, наприклад `arr = [1, -2, 3, 4, -9, 6]`. -The task is: find the contiguous subarray of `arr` with the maximal sum of items. +Завдання: знайти неперервний підмасив `arr` з максимальною сумою елементів. -Write the function `getMaxSubSum(arr)` that will return that sum. +Написати функцію `getMaxSubSum(arr)` яка повертає таку суму. -For instance: +Наприклад: ```js getMaxSubSum([-1, *!*2, 3*/!*, -9]) == 5 (the sum of highlighted items) @@ -21,10 +21,10 @@ getMaxSubSum([*!*100*/!*, -9, 2, -3, 5]) == 100 getMaxSubSum([*!*1, 2, 3*/!*]) == 6 (take all) ``` -If all items are negative, it means that we take none (the subarray is empty), so the sum is zero: +Якщо всі елементи менші нуля, нічого не беремо, це значає, що підмасив пустий а сума рівна нулю: ```js getMaxSubSum([-1, -2, -3]) = 0 ``` -Please try to think of a fast solution: [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation) or even O(n) if you can. +Будь-ласка, подумайте над швидким рішенням: [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation) або над O(n) рішенням, якщо зможете. 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 16d14071f..eea184e7b 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 @@ -1,18 +1,18 @@ -importance: 5 +Важливість: 5 --- -# Array operations. +# Операції з масивами. -Let's try 5 array operations. +Давайте спробуємо 5 операцій з масивом. -1. Create an array `styles` with items "Jazz" and "Blues". -2. Append "Rock-n-Roll" to the end. -3. Replace the value in the middle by "Classics". Your code for finding the middle value should work for any arrays with odd length. -4. Strip off the first value of the array and show it. -5. Prepend `Rap` and `Reggae` to the array. +1. Створіть масив `styles` з елементами "Jazz" та "Blues". +2. Додайте "Rock-n-Roll" в кінець масиву. +3. Замініть значення в середені масиву на "Classics". Ваш код повинен шукати медіанний елемент у масивах будь-якої довжини. +4. Видаліть перший елемент масиву та покажіть його. +5. Вставте `Rap` та `Reggae` на початок масиву. -The array in the process: +Вигляд масиву по ходу виконання операцій: ```js no-beautify Jazz, Blues diff --git a/1-js/05-data-types/04-array/3-call-array-this/solution.md b/1-js/05-data-types/04-array/3-call-array-this/solution.md index 3cb0317cf..e2bfec1db 100644 --- a/1-js/05-data-types/04-array/3-call-array-this/solution.md +++ b/1-js/05-data-types/04-array/3-call-array-this/solution.md @@ -1,6 +1,6 @@ -The call `arr[2]()` is syntactically the good old `obj[method]()`, in the role of `obj` we have `arr`, and in the role of `method` we have `2`. +Виклик `arr[2]()` це синтаксично старий та добрий `obj[method]()`, в ролі `obj` ми маємо `arr`, а в ролі `method` ми маємо `2`. -So we have a call of the function `arr[2]` as an object method. Naturally, it receives `this` referencing the object `arr` and outputs the array: +Ми маємо виклик функції `arr[2]` як методу об'єкту. Відповідно, він отримає у якості `this` об'єкт `arr` та виводить масив: ```js run let arr = ["a", "b"]; @@ -12,4 +12,4 @@ arr.push(function() { arr[2](); // a,b,function(){...} ``` -The array has 3 values: initially it had two, plus the function. +Масив має 3 елемента, спочатку їх було 2, плюс функція. 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 340c5feef..e7f421955 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 @@ -1,10 +1,10 @@ -importance: 5 +Важливість: 5 --- -# Calling in an array context +# Виклик в контексті масиву -What is the result? Why? +Який результат? Чому? ```js let arr = ["a", "b"]; diff --git a/1-js/05-data-types/04-array/5-array-input-sum/solution.md b/1-js/05-data-types/04-array/5-array-input-sum/solution.md index 75bd683b5..9bf2a43ed 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/solution.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/solution.md @@ -1,4 +1,4 @@ -Please note the subtle, but important detail of the solution. We don't convert `value` to number instantly after `prompt`, because after `value = +value` we would not be able to tell an empty string (stop sign) from the zero (valid number). We do it later instead. +Будь-ласка, зверніть увагу на одну важливу деталь у вирішенні цієї задачі.Ми не конвертуємо `value` в число одразу після `prompt`, тому, що одразу після операції `value = +value` ми не зможемо відрізнити порожню строку (зупинення роботи функції) від нулю (валідне число). Тому ми робимо це пізніше. ```js run demo @@ -10,7 +10,7 @@ function sumInput() { let value = prompt("A number please?", 0); - // should we cancel? + // Обриваємо введення даних? if (value === "" || value === null || !isFinite(value)) break; numbers.push(+value); diff --git a/1-js/05-data-types/04-array/5-array-input-sum/task.md b/1-js/05-data-types/04-array/5-array-input-sum/task.md index 4af8e7c95..39b844373 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/task.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/task.md @@ -1,15 +1,15 @@ -importance: 4 +Важливість: 4 --- -# Sum input numbers +# Сумв введених чисел -Write the function `sumInput()` that: +Напишіть функцію `sumInput()` яка: -- Asks the user for values using `prompt` and stores the values in the array. -- Finishes asking when the user enters a non-numeric value, an empty string, or presses "Cancel". -- Calculates and returns the sum of array items. +- Просить користувача ввесте значення за допомогою `prompt` та зберігає їх значення в масив. +- Закінчує робити запити в користувача, після того, як введено не числове значення, порожня строка або натиснуто "відмінити". +- Підраховує та повертає сумму елементів масиву. -P.S. A zero `0` is a valid number, please don't stop the input on zero. +P.S. Нуль `0` це валідне число, будь-ласка, не зупиняйте функцію при введені `0`. [demo] diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 33498f40a..25b346973 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -1,31 +1,31 @@ -# Arrays +# Масиви -Objects allow you to store keyed collections of values. That's fine. +Об'єкти дозволяють зберігати набори значеннь з ключами. Це чудово. -But quite often we find that we need an *ordered collection*, where we have a 1st, a 2nd, a 3rd element and so on. For example, we need that to store a list of something: users, goods, HTML elements etc. +Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го і т.п елементів. Наприклад, така колеція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та інше. -It is not convenient to use an object here, because it provides no methods to manage the order of elements. We can’t insert a new property “between” the existing ones. Objects are just not meant for such use. +Використовувати об'єкти в такому випадку не зручно, тому що вони не надають методів управління порядком елементів. Ми не можемо вставити нову властивість "між" існуючих. Об'єкти просто не призначені до такого. -There exists a special data structure named `Array`, to store ordered collections. +Для зберігання впорядкованих колекцій існує інший тип даних, який має назву масив, `Array`. -## Declaration +## Оголошення -There are two syntaxes for creating an empty array: +Існує два типу синтаксу для створення пустого масиву: ```js let arr = new Array(); let arr = []; ``` -Almost all the time, the second syntax is used. We can supply initial elements in the brackets: +Майже завжди використовують другий тип синтаксису. Ми можемо вказати початкові елементи масиву у квадратних дужках: ```js let fruits = ["Apple", "Orange", "Plum"]; ``` -Array elements are numbered, starting with zero. +Елементи масиву нумеруються починаючи з нуля. -We can get an element by its number in square brackets: +Ми можемо отримати елементи масиву, вказавши його номер в квадратних дужках: ```js run let fruits = ["Apple", "Orange", "Plum"]; @@ -35,19 +35,19 @@ alert( fruits[1] ); // Orange alert( fruits[2] ); // Plum ``` -We can replace an element: +Можемо замінити елемент: ```js -fruits[2] = 'Pear'; // now ["Apple", "Orange", "Pear"] +fruits[2] = 'Pear'; // зараз ["Apple", "Orange", "Pear"] ``` -...Or add a new one to the array: +...Або додати новий: ```js -fruits[3] = 'Lemon'; // now ["Apple", "Orange", "Pear", "Lemon"] +fruits[3] = 'Lemon'; // зараз ["Apple", "Orange", "Pear", "Lemon"] ``` -The total count of the elements in the array is its `length`: +Загальна кількість елементів масиву зберігається у його властивості `length`: ```js run let fruits = ["Apple", "Orange", "Plum"]; @@ -55,7 +55,7 @@ let fruits = ["Apple", "Orange", "Plum"]; alert( fruits.length ); // 3 ``` -We can also use `alert` to show the whole array. +Ми можемо переглянути масив цілком за допомогою `alert` ```js run let fruits = ["Apple", "Orange", "Plum"]; @@ -63,24 +63,24 @@ let fruits = ["Apple", "Orange", "Plum"]; alert( fruits ); // Apple,Orange,Plum ``` -An array can store elements of any type. +У масиви можуть зберігатись елементи будь-якого типу. -For instance: +Наприклад: ```js run no-beautify -// mix of values +// різні типи значень let arr = [ 'Apple', { name: 'John' }, true, function() { alert('hello'); } ]; -// get the object at index 1 and then show its name +// отримати елемент з індексом 1 (об'єкт) та вивести його властивість name alert( arr[1].name ); // John -// get the function at index 3 and run it +// отримати елемент з індексом 3 (функція) та виконати її arr[3](); // hello ``` -````smart header="Trailing comma" -An array, just like an object, may end with a comma: +````smart header="Завершальна кома" +Список елементів масиву, як і список елементів об'єкту може закінчуватись комою: ```js let fruits = [ "Apple", @@ -89,57 +89,61 @@ let fruits = [ ]; ``` -The "trailing comma" style makes it easier to insert/remove items, because all lines become alike. +Використання "завершальної коми" спрощує процес додавання/видалення елементів, тому що всі строки стають ідентичними. ```` -## Methods pop/push, shift/unshift +## Методи pop/push, shift/unshift -A [queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) is one of the most common uses of an array. In computer science, this means an ordered collection of elements which supports two operations: +[Черга](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) один з найбільш популяних варіантів використання об'єкту. У комп'ютерних науках так позначають +колекцію елементів, яка підтримує дві операції: -- `push` appends an element to the end. -- `shift` get an element from the beginning, advancing the queue, so that the 2nd element becomes the 1st. +- `push` додає елемент у кінець списку. +- `shift` видаляє елемент на початку, здвигаючи чергу, таким чином другий елемент стає першим. ![](queue.svg) -Arrays support both operations. +Масиви підтримують обидві операції. -In practice we need it very often. For example, a queue of messages that need to be shown on-screen. +На практиці це дуже часто стає у нагоді. Наприклад, черга з повідомлень які необхідно показувати на екрані. -There's another use case for arrays -- the data structure named [stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). +Існує також інший варіант використання масивів - структура даних, яка називається [стек](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). -It supports two operations: +Вона підтримує два типу операцій: -- `push` adds an element to the end. -- `pop` takes an element from the end. +- `push` додає елементи в кінець. +- `pop` видаляє крайній елемент. -So new elements are added or taken always from the "end". +Таким чином нові елементи завжди додаються або видаляються з "кінця". A stack is usually illustrated as a pack of cards: new cards are added to the top or taken from the top: +Хорошим пракладом `стеку` є колода карт: нові карти кладуться на верх і беруться теж зверху: ![](stack.svg) -For stacks, the latest pushed item is received first, that's also called LIFO (Last-In-First-Out) principle. For queues, we have FIFO (First-In-First-Out). +У стеках останній доданий елемент повертається першим, цей принцип також називають LIFO (з англ. Last-In-First-Out, "останій прийшов - перший пішов"). +Для черг ми використовуємо принцип FIFO (з англ. First-In-First-Out, "перший прийшов - перший пішов"). -Arrays in JavaScript can work both as a queue and as a stack. They allow you to add/remove elements both to/from the beginning or the end. +Масиви в JavaScript можуть працювати як стеки і як черги. Ми можемо додавати/видаляти елементи як у початок так і у кінець масиву. -In computer science the data structure that allows this, is called [deque](https://en.wikipedia.org/wiki/Double-ended_queue). +В комп'ютерних науках структури даних, які дозволяють це робити, мають назву [двухсторонні черги](https://en.wikipedia.org/wiki/Double-ended_queue). -**Methods that work with the end of the array:** + +**Методи, які працюють з кінцем масиву:** `pop` -: Extracts the last element of the array and returns it: +: Видаляє останій елемент масиву та повертає його: ```js run let fruits = ["Apple", "Orange", "Pear"]; - alert( fruits.pop() ); // remove "Pear" and alert it + alert( fruits.pop() ); // видаляємо "Pear" та виводимо його alert( fruits ); // Apple, Orange ``` `push` -: Append the element to the end of the array: +: Додає елемент у кінець масиву: ```js run let fruits = ["Apple", "Orange"]; @@ -149,23 +153,23 @@ In computer science the data structure that allows this, is called [deque](https alert( fruits ); // Apple, Orange, Pear ``` - The call `fruits.push(...)` is equal to `fruits[fruits.length] = ...`. + Виклик `fruits.push(...)` рівнозначний `fruits[fruits.length] = ...`. -**Methods that work with the beginning of the array:** +**Методи, які працюють з початком масиву:** `shift` -: Extracts the first element of the array and returns it: +: Видаляє перший елемент з масиву та повертає його: ```js run let fruits = ["Apple", "Orange", "Pear"]; - alert( fruits.shift() ); // remove Apple and alert it + alert( fruits.shift() ); // видаляємо Apple and виводимо його alert( fruits ); // Orange, Pear ``` `unshift` -: Add the element to the beginning of the array: +: Додає елемент в початок масиву: ```js run let fruits = ["Orange", "Pear"]; @@ -175,7 +179,7 @@ In computer science the data structure that allows this, is called [deque](https alert( fruits ); // Apple, Orange, Pear ``` -Methods `push` and `unshift` can add multiple elements at once: +Методи `push` та `unshift` можуть додавати одразу декілька елементів: ```js run let fruits = ["Apple"]; @@ -187,97 +191,97 @@ fruits.unshift("Pineapple", "Lemon"); alert( fruits ); ``` -## Internals +## Внутрішня структура масивів -An array is a special kind of object. The square brackets used to access a property `arr[0]` actually come from the object syntax. That's essentially the same as `obj[key]`, where `arr` is the object, while numbers are used as keys. +Масив - це спеціальний тип об'єктів. Квадратні дужки використовують для доступу до властивості `arr[0]`, що в свою чергу прийшло з синтаксису об'єктів. Це теж саме, що доступ до властивості об'єкта `obj[key]`, де `arr` це об'єкт в якому числа використовуються як ключі. -They extend objects providing special methods to work with ordered collections of data and also the `length` property. But at the core it's still an object. +Масиви розширюють функціональність об'єкту тим, що надають можливість працювати з упорядкованими колекціями даних а також надають доступ до властивості `length`. Але в основі це досі об'єкт. -Remember, there are only 7 basic types in JavaScript. Array is an object and thus behaves like an object. +Запам'ятайте, JavaScript містить лише 7 базових типів даних. Масив це об'єкт, який веде себе як об'єкт. -For instance, it is copied by reference: +Наприклад, копіюється за посиланням: ```js run let fruits = ["Banana"] -let arr = fruits; // copy by reference (two variables reference the same array) +let arr = fruits; // копіюється за посиланням (дві змінні посилаються на один масив) alert( arr === fruits ); // true -arr.push("Pear"); // modify the array by reference +arr.push("Pear"); // зміна масиву за посиланням -alert( fruits ); // Banana, Pear - 2 items now +alert( fruits ); // Banana, Pear - наразі два елемента ``` -...But what makes arrays really special is their internal representation. The engine tries to store its elements in the contiguous memory area, one after another, just as depicted on the illustrations in this chapter, and there are other optimizations as well, to make arrays work really fast. +...Але те, що робить масиви дійсно особливими - це їх внутрішнє представлення. Двигун JS намагається зюерігати елементи масиву у неперервній області пам'яті, один за одним як це представленно на ілюстраціях в цій главі, а також і інші способи оптимізаціЇ, що дозвалють масивам працювати дуже швидко. -But they all break if we quit working with an array as with an "ordered collection" and start working with it as if it were a regular object. +Проте масиви втратять всю свою ефективність, якщо ми перестанемо працювати з ними як з "упорядкованою колекцією даний" і почнемо використовувати як звичайний об'єкт. -For instance, technically we can do this: +Наприклад, технічно ми можемо виконати наступне: ```js -let fruits = []; // make an array +let fruits = []; // створюємо масив -fruits[99999] = 5; // assign a property with the index far greater than its length +fruits[99999] = 5; // створюємо властивість, індекс якоЇ набагато перевищує довжину масиву -fruits.age = 25; // create a property with an arbitrary name +fruits.age = 25; // створюємо властивість з довільним ім'ям ``` -That's possible, because arrays are objects at their base. We can add any properties to them. +Це можливо тому, що в основі масивів - об'єкти. Ми можемо додати будь-які властивості до них. -But the engine will see that we're working with the array as with a regular object. Array-specific optimizations are not suited for such cases and will be turned off, their benefits disappear. +Але двигун зрозуміє, що ми використувуємо масиви, як звичайні об'єкти. Методи оптимізації, які викорустовуються для масивів в цьому випадку не підходять, тому будуть відключені і не принесуть ніякої користі. -The ways to misuse an array: +Варіанти неправильного використання масивів: -- Add a non-numeric property like `arr.test = 5`. -- Make holes, like: add `arr[0]` and then `arr[1000]` (and nothing between them). -- Fill the array in the reverse order, like `arr[1000]`, `arr[999]` and so on. +- Додавання нечислових властивостей, таких як `arr.test = 5`. +- Створення "дирок", наприклад: `arr[0]` а за ним `arr[1000]` (та нічого між цими елементами). +- Заповнення масиву в зворотньому порядку, наприклад: `arr[1000]`, `arr[999]` і т.к. -Please think of arrays as special structures to work with the *ordered data*. They provide special methods for that. Arrays are carefully tuned inside JavaScript engines to work with contiguous ordered data, please use them this way. And if you need arbitrary keys, chances are high that you actually require a regular object `{}`. +Будь-ласка, думайте про масив, як про особливу структуру з "впорядкованими даними". Вони надають спеціальні методи для цього. Масиви дуже ретельно налаштовані на роботу з неперервними впорядкованими даними, тому використовуйте їх саме в цей спосіб. Тому, якщо вам необхідні довільні ключі, дуже імовірно, що вам більше підійдуть звичайні об'єкти `{}`. -## Performance +## Ефективність -Methods `push/pop` run fast, while `shift/unshift` are slow. +Методи `push/pop` працюють швидко, на відміну від методів `shift/unshift` які працюють повільно. ![](array-speed.svg) -Why is it faster to work with the end of an array than with its beginning? Let's see what happens during the execution: +Чому працювати з кінцем масиву швидше, ніж з початком? Давайте переглянемо, що відбувається під час виконання: ```js -fruits.shift(); // take 1 element from the start +fruits.shift(); // видалити один елемент з початку ``` -It's not enough to take and remove the element with the number `0`. Other elements need to be renumbered as well. +Але недостатньо просто взяти на видалити елемент з номером `0`. В такому випадку, всі інші елементи також необхідно пронумерувати ще раз. -The `shift` operation must do 3 things: +Операція `shift` має виконати 3 дії: -1. Remove the element with the index `0`. -2. Move all elements to the left, renumber them from the index `1` to `0`, from `2` to `1` and so on. -3. Update the `length` property. +1. Видалити елемент з індексом `0`. +2. Передвинути всі елементи вліво змінивши в них нумерацію - індекс `1` на `0`, `2` на `1` і так далі. +3. Обновити властивість `length`. ![](array-shift.svg) -**The more elements in the array, the more time to move them, more in-memory operations.** +**Чим більше елементів у масиві, тим більше часу необхідно для того, щоб пересунути їх, більше операцій з пам'яттю.** -The similar thing happens with `unshift`: to add an element to the beginning of the array, we need first to move existing elements to the right, increasing their indexes. +Теж саме відбувається з методом `unshift`: для того, щоб додати елемент в початок масиву, необхідно спочатку перемістити всі елементи масиву вправо збільшуючи їх індекси. -And what's with `push/pop`? They do not need to move anything. To extract an element from the end, the `pop` method cleans the index and shortens `length`. +А що до методів `push/pop`? Вони нічого не переміщують. Для видалення елементу з кінця масиву метод `pop` очищає індек та скорочує властивість `length`. -The actions for the `pop` operation: +Дії при операції `pop`: ```js -fruits.pop(); // take 1 element from the end +fruits.pop(); // видаляємо один елемент з кінця масиву ``` ![](array-pop.svg) -**The `pop` method does not need to move anything, because other elements keep their indexes. That's why it's blazingly fast.** +**Метод `pop` не переміщує нічого, адже кожен елемент зберігає свій індекс. Саме тому цей метод так швидко працює.** -The similar thing with the `push` method. +Метод `push` працює аналогічно. -## Loops +## Цикли -One of the oldest ways to cycle array items is the `for` loop over indexes: +Один з найстаріших методів перебору елементів масиву це цикл `for` по індексах: ```js run let arr = ["Apple", "Orange", "Pear"]; @@ -289,20 +293,20 @@ for (let i = 0; i < arr.length; i++) { } ``` -But for arrays there is another form of loop, `for..of`: +Але для масивів можливий інший варіант циклу, `for..of`: ```js run let fruits = ["Apple", "Orange", "Plum"]; -// iterates over array elements +// ітерується по елементам масиву for (let fruit of fruits) { alert( fruit ); } ``` -The `for..of` doesn't give access to the number of the current element, just its value, but in most cases that's enough. And it's shorter. +Цикл `for..of` не надає доступу до індексу поточного елементу, тільки до його значення але у більшості випадків цього достатньо. Плюс це коротше. -Technically, because arrays are objects, it is also possible to use `for..in`: +Технічно, так як масив це об'єкт, ми можемо використовувати цикл `for..in`: ```js run let arr = ["Apple", "Orange", "Pear"]; @@ -314,22 +318,22 @@ for (let key in arr) { } ``` -But that's actually a bad idea. There are potential problems with it: +Але насправді це погана ідея. Існують потеційні проблеми: -1. The loop `for..in` iterates over *all properties*, not only the numeric ones. +1. Цикл `for..in` ітерується по *всім властивостям*, не тільки по числових. - There are so-called "array-like" objects in the browser and in other environments, that *look like arrays*. That is, they have `length` and indexes properties, but they may also have other non-numeric properties and methods, which we usually don't need. The `for..in` loop will list them though. So if we need to work with array-like objects, then these "extra" properties can become a problem. + В браузерах та різних програмних середовищах існують масивоподібні об'єкти, *які виглядають як масив*. Тобто вони мають властивість `length` та індекси, проте вони також містять інші нечислові властивості і методи, як нам часто не потрібні. Цикл `for..in` відобразить і їх. Тому, коли на необхідно працювати з масивами ці "екстра" властивості можуть стати проблемою. -2. The `for..in` loop is optimized for generic objects, not arrays, and thus is 10-100 times slower. Of course, it's still very fast. The speedup may only matter in bottlenecks. But still we should be aware of the difference. +2. Цикл `for..in` оптимізований для довільних об'єктів, не для масивів, і тому це в 10-100 разів повільніше. Звісно, це все одно дуже швидко. Збільшення швидкості виконання має значення лише у *вузьких місцях*. Але ми все одно повинні бути обережні з відмінностями. -Generally, we shouldn't use `for..in` for arrays. +Словом, не варто використовувати цикл `for..in` для масивів. -## A word about "length" +## Декілька слів про "length" -The `length` property automatically updates when we modify the array. To be precise, it is actually not the count of values in the array, but the greatest numeric index plus one. +Властивість `length` спрацьовує автоматично, коли масив змінився. Якщо бути точнішим, то `length` відображає не кількість елементів в масиві а індекс останнього елементу плюс один. -For instance, a single element with a large index gives a big length: +Наприклад, один елемент з великим індексом дасть велику довжину: ```js run let fruits = []; @@ -338,54 +342,54 @@ fruits[123] = "Apple"; alert( fruits.length ); // 124 ``` -Note that we usually don't use arrays like that. +Зверніть увагу, що зазвичай ми не використовуємо масив подібним чином. -Another interesting thing about the `length` property is that it's writable. +Інший цікавий момент стосовно властивості `length` - його можна перезаписати. -If we increase it manually, nothing interesting happens. But if we decrease it, the array is truncated. The process is irreversible, here's the example: +Якщо ми вручну збільшимо `length`, нічого цікавого не відбудеться. Але якщо змешимо, масив стане коротшим, цей процес незворотній, наприклад: ```js run let arr = [1, 2, 3, 4, 5]; -arr.length = 2; // truncate to 2 elements +arr.length = 2; // зкорочуємо до двох елементів alert( arr ); // [1, 2] -arr.length = 5; // return length back +arr.length = 5; // повертаємо попередню довжину alert( arr[3] ); // undefined: the values do not return ``` -So, the simplest way to clear the array is: `arr.length = 0;`. +Отож, найпростіший метод очистки масиву це: `arr.length = 0;`. ## new Array() [#new-array] -There is one more syntax to create an array: +Існує ще один варіант створення масиву: ```js let arr = *!*new Array*/!*("Apple", "Pear", "etc"); ``` -It's rarely used, because square brackets `[]` are shorter. Also there's a tricky feature with it. +Він використовується рідше, адже квадратні дужки коротші `[]`. А також має певну особливість. -If `new Array` is called with a single argument which is a number, then it creates an array *without items, but with the given length*. +Якщо `new Array` викликаєтсья з одним аргументом,а саме числом, він створить пустий масив з довжиную, яка дорівнює *цьому числу*. -Let's see how one can shoot themself in the foot: +Давайте подивимось, як можна завдати собі ведмежої послуги: ```js run -let arr = new Array(2); // will it create an array of [2] ? +let arr = new Array(2); // чи створиться масив [2] ? -alert( arr[0] ); // undefined! no elements. +alert( arr[0] ); // undefined! елементи відсутні. alert( arr.length ); // length 2 ``` -In the code above, `new Array(number)` has all elements `undefined`. +Як бачимо в цьому коді `new Array(number)` всі елементи `undefined`. -To evade such surprises, we usually use square brackets, unless we really know what we're doing. +Для того, щоб позбавитись таких сюрпризів, як правило, ми використовуємо квадратні дужки `[]`, якщо тільки ми дісно не маємо причини для використання методу `new Array`. -## Multidimensional arrays +## Багатовимірні масиви -Arrays can have items that are also arrays. We can use it for multidimensional arrays, for example to store matrices: +Масиви можуть містити елементи, які в свою чергу теж є масивами. Ми можемо використувати це для створення багатовимірних масивів, наприклад, для зберігання матриць: ```js run let matrix = [ @@ -394,14 +398,14 @@ let matrix = [ [7, 8, 9] ]; -alert( matrix[1][1] ); // 5, the central element +alert( matrix[1][1] ); // 5, центральний елемент ``` ## toString -Arrays have their own implementation of `toString` method that returns a comma-separated list of elements. +Масиви по-своєму реальзують метод `toString`, який повертає список елементів розділених комою. -For instance: +Наприклад: ```js run @@ -411,7 +415,7 @@ alert( arr ); // 1,2,3 alert( String(arr) === '1,2,3' ); // true ``` -Also, let's try this: +Давайте спробуємо це: ```js run alert( [] + 1 ); // "1" @@ -419,9 +423,9 @@ alert( [1] + 1 ); // "11" alert( [1,2] + 1 ); // "1,21" ``` -Arrays do not have `Symbol.toPrimitive`, neither a viable `valueOf`, they implement only `toString` conversion, so here `[]` becomes an empty string, `[1]` becomes `"1"` and `[1,2]` becomes `"1,2"`. +Масиви не мають `Symbol.toPrimitive`, або функціонуючого `valueOf`, вони реалізують лише метод `toString` таким чином, що `[]` стає пустою строкою, `[1]` стає `"1"` або `[1,2]` стає `"1,2"`. -When the binary plus `"+"` operator adds something to a string, it converts it to a string as well, so the next step looks like this: +Коли бінарний оператор `"+"` додає щось до строки, це конвертується в строку та виглядає наступним чином: ```js run alert( "" + 1 ); // "1" @@ -429,35 +433,35 @@ alert( "1" + 1 ); // "11" alert( "1,2" + 1 ); // "1,21" ``` -## Summary +## Підсумки -Array is a special kind of object, suited to storing and managing ordered data items. +Масив - це особливий тип об'єкту, створенний для зберігання та керування впорядкованих даних. -- The declaration: +- Об'явлення: ```js - // square brackets (usual) + // квадратні дужки (як правило) let arr = [item1, item2...]; - // new Array (exceptionally rare) + // new Array (набагато рідше) let arr = new Array(item1, item2...); ``` - The call to `new Array(number)` creates an array with the given length, but without elements. + Виклик `new Array(number)` створює масив з заданою довжиною але без елементів. -- The `length` property is the array length or, to be precise, its last numeric index plus one. It is auto-adjusted by array methods. -- If we shorten `length` manually, the array is truncated. +- Властивість `length` демонструє довжину масиву або, якщо точніше, останній цифровий індекс масиву плюс один. Це виконується автоматично методами масиву. +- Якщо ми вручну скорочуємо `length`, масив зменшується (нагадаємо, що ця операція незворотня). -We can use an array as a deque with the following operations: +Ми можемо використовувати масив як двухсторонню чергу за допомогою наступних оперцій: -- `push(...items)` adds `items` to the end. -- `pop()` removes the element from the end and returns it. -- `shift()` removes the element from the beginning and returns it. -- `unshift(...items)` adds `items` to the beginning. +- `push(...items)` додає `items` в кінець масиву. +- `pop()` видаляє елемент з кінця масиву та повертає його. +- `shift()` видаляє елемент з початку масиву та повертає його. +- `unshift(...items)` додає `items` в початок масиву. -To loop over the elements of the array: - - `for (let i=0; i. +Ми повернемось до масивів та вивчимо методи додавання, видалення, відокремлення елементів та сортування масивів у главі: . From 1364709b9bea9f6d2e2e7ce7bb114f86734e8d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D0=B5=D0=BC=20=D0=97=D1=83=D0=BD=D1=83?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= Date: Mon, 21 Sep 2020 23:38:39 +0300 Subject: [PATCH 02/30] fix errors --- .../04-array/1-item-value/solution.md | 2 +- .../04-array/10-maximal-subarray/solution.md | 16 ++--- .../04-array/10-maximal-subarray/task.md | 4 +- .../04-array/2-create-array/task.md | 2 +- .../04-array/3-call-array-this/solution.md | 2 +- .../04-array/5-array-input-sum/solution.md | 2 +- .../04-array/5-array-input-sum/task.md | 10 +-- 1-js/05-data-types/04-array/article.md | 66 +++++++++---------- 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/1-js/05-data-types/04-array/1-item-value/solution.md b/1-js/05-data-types/04-array/1-item-value/solution.md index faf4d140f..c73bcf0ab 100644 --- a/1-js/05-data-types/04-array/1-item-value/solution.md +++ b/1-js/05-data-types/04-array/1-item-value/solution.md @@ -13,5 +13,5 @@ alert( fruits.length ); // 4 */!* ``` -Це відбудеться тому, що масиви це об'єкти. Отже `shoppingCart` and `fruits` посилаються на одий і той самий об'єкт. +Це відбудеться тому, що масиви це об'єкти. Отже `shoppingCart` and `fruits` посилаються на один і той самий об'єкт. 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 e35410c32..cffbdcc38 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 @@ -2,7 +2,7 @@ Ми можемо порахувати всі можливі підсуми. -Найпростіший шлях, це порахувати суми всіх підмасивів, починаючи з кожного елемента. +Найпростіший шлях - це порахувати суми всіх підмасивів, починаючи з кожного елемента. Наприклад, для `[-1, 2, 3, -9, 11]`: @@ -57,15 +57,15 @@ alert( getMaxSubSum([1, 2, 3]) ); // 6 alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100 ``` -Це вирішення має оцінку часу виконання [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation). Іншими словами,якщо ми збільшимо розмір масиву в 2 рази: алгоритм буде працювати у 4 рази довше. +Це вирішення має оцінку часу виконання [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation). Іншими словами,якщо ми збільшимо розмір масиву в 2 рази, алгоритм буде працювати у 4 рази довше. -Для великих масивів (1000, 10000 або більше елементів) подібні алгоритми можуть призводити до серйозних "пригальмувань" роботи. +Для великих масивів (1000, 10000 або більше елементів) подібні алгоритми можуть призводити до серйозних "пригальмувань" роботі. -# Швидке ришення +# Швидке рішення -Йдемо по масиву і накопичуємо поточну часткову суму елементів в змінній `s`. Якщо, в певний момент `s` стає меншим за 0, призначаємо `s=0`. Максимальний з усіх `s` і буде відповідю. +Йдемо по масиву і накопичуємо поточну часткову суму елементів в змінній `s`. Якщо в певний момент `s` стає меншим за 0, призначаємо `s=0`. Максимальний з усіх `s` і буде відповіддю. -Якщо пояснення не дуже зрозуміле, подивіться, будь-ласка на код, він досить лаконічний: +Якщо пояснення не дуже зрозуміле, подивіться, будь ласка, на код - він досить лаконічний: ```js run demo function getMaxSubSum(arr) { @@ -89,6 +89,6 @@ alert( getMaxSubSum([1, 2, 3]) ); // 6 alert( getMaxSubSum([-1, -2, -3]) ); // 0 ``` -Це алгоритм потребує рівно один прохід по масиву, його оціночний час виконання O(n). +Цей алгоритм потребує рівно один прохід по масиву, його оціночний час виконання - O(n). -Ви можете знайти більше детальної інформації про алгоритм тут: [Maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem). Якщо досі не повністю зрозуміло, як це працює, будь-ласка, подивіться алгоритм у прикладах вище, це буде краще будь-яких слів. +Ви можете знайти більше детальної інформації про алгоритм тут: [Maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem). Якщо досі не повністю зрозуміло, як це працює, будь ласка, подивіться алгоритм у прикладах вище, це буде краще будь-яких слів. diff --git a/1-js/05-data-types/04-array/10-maximal-subarray/task.md b/1-js/05-data-types/04-array/10-maximal-subarray/task.md index b1f71b4ef..7a78126a3 100644 --- a/1-js/05-data-types/04-array/10-maximal-subarray/task.md +++ b/1-js/05-data-types/04-array/10-maximal-subarray/task.md @@ -21,10 +21,10 @@ getMaxSubSum([*!*100*/!*, -9, 2, -3, 5]) == 100 getMaxSubSum([*!*1, 2, 3*/!*]) == 6 (take all) ``` -Якщо всі елементи менші нуля, нічого не беремо, це значає, що підмасив пустий а сума рівна нулю: +Якщо всі елементи менші нуля, нічого не беремо, це означає, що підмасив пустий, а сума рівна нулю: ```js getMaxSubSum([-1, -2, -3]) = 0 ``` -Будь-ласка, подумайте над швидким рішенням: [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation) або над O(n) рішенням, якщо зможете. +Будь ласка, подумайте над швидким рішенням: [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation) або над O(n) рішенням, якщо зможете. 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 eea184e7b..555789130 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 @@ -8,7 +8,7 @@ 1. Створіть масив `styles` з елементами "Jazz" та "Blues". 2. Додайте "Rock-n-Roll" в кінець масиву. -3. Замініть значення в середені масиву на "Classics". Ваш код повинен шукати медіанний елемент у масивах будь-якої довжини. +3. Замініть значення в середині масиву на "Classics". Ваш код повинен шукати медіанний елемент у масивах будь-якої довжини. 4. Видаліть перший елемент масиву та покажіть його. 5. Вставте `Rap` та `Reggae` на початок масиву. diff --git a/1-js/05-data-types/04-array/3-call-array-this/solution.md b/1-js/05-data-types/04-array/3-call-array-this/solution.md index e2bfec1db..c908b832c 100644 --- a/1-js/05-data-types/04-array/3-call-array-this/solution.md +++ b/1-js/05-data-types/04-array/3-call-array-this/solution.md @@ -1,4 +1,4 @@ -Виклик `arr[2]()` це синтаксично старий та добрий `obj[method]()`, в ролі `obj` ми маємо `arr`, а в ролі `method` ми маємо `2`. +Виклик `arr[2]()` це - синтаксично старий та добрий `obj[method]()`, в ролі `obj` ми маємо `arr`, а в ролі `method` ми маємо `2`. Ми маємо виклик функції `arr[2]` як методу об'єкту. Відповідно, він отримає у якості `this` об'єкт `arr` та виводить масив: diff --git a/1-js/05-data-types/04-array/5-array-input-sum/solution.md b/1-js/05-data-types/04-array/5-array-input-sum/solution.md index 9bf2a43ed..fe0d9df9f 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/solution.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/solution.md @@ -1,4 +1,4 @@ -Будь-ласка, зверніть увагу на одну важливу деталь у вирішенні цієї задачі.Ми не конвертуємо `value` в число одразу після `prompt`, тому, що одразу після операції `value = +value` ми не зможемо відрізнити порожню строку (зупинення роботи функції) від нулю (валідне число). Тому ми робимо це пізніше. +Будь ласка, зверніть увагу на одну важливу деталь у вирішенні цієї задачі.Ми не конвертуємо `value` в число одразу після `prompt`, тому що одразу після операції `value = +value` ми не зможемо відрізнити порожню строку (зупинення роботи функції) від нуля (валідне число). Тому ми робимо це пізніше. ```js run demo diff --git a/1-js/05-data-types/04-array/5-array-input-sum/task.md b/1-js/05-data-types/04-array/5-array-input-sum/task.md index 39b844373..01bff93cb 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/task.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/task.md @@ -2,14 +2,14 @@ --- -# Сумв введених чисел +# Сума введених чисел Напишіть функцію `sumInput()` яка: -- Просить користувача ввесте значення за допомогою `prompt` та зберігає їх значення в масив. -- Закінчує робити запити в користувача, після того, як введено не числове значення, порожня строка або натиснуто "відмінити". -- Підраховує та повертає сумму елементів масиву. +- Просить користувача ввести дані за допомогою `prompt` та зберігає їх в масив. +- Закінчує робити запити в користувача після того, як введено не числове значення, порожня строка або натиснуто "відмінити". +- Підраховує та повертає суму елементів масиву. -P.S. Нуль `0` це валідне число, будь-ласка, не зупиняйте функцію при введені `0`. +P.S. Нуль `0` це - валідне число, будь ласка, не зупиняйте функцію при введені `0`. [demo] diff --git a/1-js/05-data-types/04-array/article.md b/1-js/05-data-types/04-array/article.md index 25b346973..efcfd76ce 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -1,10 +1,10 @@ # Масиви -Об'єкти дозволяють зберігати набори значеннь з ключами. Це чудово. +Об'єкти дозволяють зберігати набори значень з ключами. Це чудово. -Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го і т.п елементів. Наприклад, така колеція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та інше. +Але досить часто ми розуміємо, що нам необхідна впорядкована колекція даних, яка складається з 1-го, 2-го, 3-го і т.п елементів. Наприклад, така колеція може знадобитись для зберігання списку користувачів, товарів, HTML елементів та ін. -Використовувати об'єкти в такому випадку не зручно, тому що вони не надають методів управління порядком елементів. Ми не можемо вставити нову властивість "між" існуючих. Об'єкти просто не призначені до такого. +Використовувати об'єкти в такому випадку не зручно, тому що вони не надають методів управління порядком елементів. Ми не можемо вставити нову властивість "між" існуючих. Об'єкти просто не призначені для такого. Для зберігання впорядкованих колекцій існує інший тип даних, який має назву масив, `Array`. @@ -95,21 +95,21 @@ let fruits = [ ## Методи pop/push, shift/unshift -[Черга](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) один з найбільш популяних варіантів використання об'єкту. У комп'ютерних науках так позначають +[Черга](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) - один з найбільш популярних варіантів використання об'єкту. У комп'ютерних науках так позначають колекцію елементів, яка підтримує дві операції: - `push` додає елемент у кінець списку. -- `shift` видаляє елемент на початку, здвигаючи чергу, таким чином другий елемент стає першим. +- `shift` видаляє елемент на початку, зміщчуючи чергу, таким чином другий елемент стає першим. ![](queue.svg) Масиви підтримують обидві операції. -На практиці це дуже часто стає у нагоді. Наприклад, черга з повідомлень які необхідно показувати на екрані. +На практиці це дуже часто стає у нагоді. Наприклад, черга з повідомлень, які необхідно показувати на екрані. Існує також інший варіант використання масивів - структура даних, яка називається [стек](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). -Вона підтримує два типу операцій: +Вона підтримує два типи операцій: - `push` додає елементи в кінець. - `pop` видаляє крайній елемент. @@ -124,15 +124,15 @@ A stack is usually illustrated as a pack of cards: new cards are added to the to У стеках останній доданий елемент повертається першим, цей принцип також називають LIFO (з англ. Last-In-First-Out, "останій прийшов - перший пішов"). Для черг ми використовуємо принцип FIFO (з англ. First-In-First-Out, "перший прийшов - перший пішов"). -Масиви в JavaScript можуть працювати як стеки і як черги. Ми можемо додавати/видаляти елементи як у початок так і у кінець масиву. +Масиви в JavaScript можуть працювати як стеки і як черги. Ми можемо додавати/видаляти елементи як на початку так і у кінці масиву. -В комп'ютерних науках структури даних, які дозволяють це робити, мають назву [двухсторонні черги](https://en.wikipedia.org/wiki/Double-ended_queue). +В комп'ютерних науках структури даних, які дозволяють це робити, мають назву [двосторонні черги](https://en.wikipedia.org/wiki/Double-ended_queue). **Методи, які працюють з кінцем масиву:** `pop` -: Видаляє останій елемент масиву та повертає його: +: Видаляє останній елемент масиву та повертає його: ```js run let fruits = ["Apple", "Orange", "Pear"]; @@ -195,9 +195,9 @@ alert( fruits ); Масив - це спеціальний тип об'єктів. Квадратні дужки використовують для доступу до властивості `arr[0]`, що в свою чергу прийшло з синтаксису об'єктів. Це теж саме, що доступ до властивості об'єкта `obj[key]`, де `arr` це об'єкт в якому числа використовуються як ключі. -Масиви розширюють функціональність об'єкту тим, що надають можливість працювати з упорядкованими колекціями даних а також надають доступ до властивості `length`. Але в основі це досі об'єкт. +Масиви розширюють функціональність об'єкту тим, що надають можливість працювати з упорядкованими колекціями даних, а також надають доступ до властивості `length`. Але в основі це досі об'єкт. -Запам'ятайте, JavaScript містить лише 7 базових типів даних. Масив це об'єкт, який веде себе як об'єкт. +Запам'ятайте, JavaScript містить лише 7 базових типів даних. Масив - це об'єкт, який веде себе як об'єкт. Наприклад, копіюється за посиланням: @@ -213,7 +213,7 @@ arr.push("Pear"); // зміна масиву за посиланням alert( fruits ); // Banana, Pear - наразі два елемента ``` -...Але те, що робить масиви дійсно особливими - це їх внутрішнє представлення. Двигун JS намагається зюерігати елементи масиву у неперервній області пам'яті, один за одним як це представленно на ілюстраціях в цій главі, а також і інші способи оптимізаціЇ, що дозвалють масивам працювати дуже швидко. +...Але те, що робить масиви дійсно особливими - це їх внутрішнє представлення. Двигун JS намагається зберігати елементи масиву у неперервній області пам'яті, один за одним, як це представлено на ілюстраціях в цій главі, а також і інші способи оптимізації, що дозволяють масивам працювати дуже швидко. Проте масиви втратять всю свою ефективність, якщо ми перестанемо працювати з ними як з "упорядкованою колекцією даний" і почнемо використовувати як звичайний об'єкт. @@ -229,7 +229,7 @@ fruits.age = 25; // створюємо властивість з довільн Це можливо тому, що в основі масивів - об'єкти. Ми можемо додати будь-які властивості до них. -Але двигун зрозуміє, що ми використувуємо масиви, як звичайні об'єкти. Методи оптимізації, які викорустовуються для масивів в цьому випадку не підходять, тому будуть відключені і не принесуть ніякої користі. +Але двигун зрозуміє, що ми використувуємо масиви, як звичайні об'єкти. Методи оптимізації, які використовуються для масивів в цьому випадку не підходять, тому будуть відключені і не принесуть ніякої користі. Варіанти неправильного використання масивів: @@ -237,7 +237,7 @@ fruits.age = 25; // створюємо властивість з довільн - Створення "дирок", наприклад: `arr[0]` а за ним `arr[1000]` (та нічого між цими елементами). - Заповнення масиву в зворотньому порядку, наприклад: `arr[1000]`, `arr[999]` і т.к. -Будь-ласка, думайте про масив, як про особливу структуру з "впорядкованими даними". Вони надають спеціальні методи для цього. Масиви дуже ретельно налаштовані на роботу з неперервними впорядкованими даними, тому використовуйте їх саме в цей спосіб. Тому, якщо вам необхідні довільні ключі, дуже імовірно, що вам більше підійдуть звичайні об'єкти `{}`. +Будь ласка, думайте про масив як про особливу структуру з "впорядкованими даними". Вони надають спеціальні методи для цього. Масиви дуже ретельно налаштовані на роботу з неперервними впорядкованими даними, тому використовуйте їх саме в цей спосіб. Тому, якщо вам необхідні довільні ключі, дуже імовірно, що вам більше підійдуть звичайні об'єкти `{}`. ## Ефективність @@ -251,13 +251,13 @@ fruits.age = 25; // створюємо властивість з довільн fruits.shift(); // видалити один елемент з початку ``` -Але недостатньо просто взяти на видалити елемент з номером `0`. В такому випадку, всі інші елементи також необхідно пронумерувати ще раз. +Але недостатньо просто взяти та видалити елемент з номером `0`. В такому випадку всі інші елементи також необхідно пронумерувати ще раз. Операція `shift` має виконати 3 дії: 1. Видалити елемент з індексом `0`. -2. Передвинути всі елементи вліво змінивши в них нумерацію - індекс `1` на `0`, `2` на `1` і так далі. -3. Обновити властивість `length`. +2. Пересунути всі елементи вліво змінивши в них нумерацію - індекс `1` на `0`, `2` на `1` і так далі. +3. Оновити властивість `length`. ![](array-shift.svg) @@ -265,7 +265,7 @@ fruits.shift(); // видалити один елемент з початку Теж саме відбувається з методом `unshift`: для того, щоб додати елемент в початок масиву, необхідно спочатку перемістити всі елементи масиву вправо збільшуючи їх індекси. -А що до методів `push/pop`? Вони нічого не переміщують. Для видалення елементу з кінця масиву метод `pop` очищає індек та скорочує властивість `length`. +А що щодо методів `push/pop`? Вони нічого не переміщують. Для видалення елементу з кінця масиву метод `pop` очищає індекс та скорочує властивість `length`. Дії при операції `pop`: @@ -281,7 +281,7 @@ fruits.pop(); // видаляємо один елемент з кінця мас ## Цикли -Один з найстаріших методів перебору елементів масиву це цикл `for` по індексах: +Один з найстаріших методів перебору елементів масиву - це цикл `for` по індексах: ```js run let arr = ["Apple", "Orange", "Pear"]; @@ -304,7 +304,7 @@ for (let fruit of fruits) { } ``` -Цикл `for..of` не надає доступу до індексу поточного елементу, тільки до його значення але у більшості випадків цього достатньо. Плюс це коротше. +Цикл `for..of` не надає доступу до індексу поточного елементу, тільки до його значення, але у більшості випадків цього достатньо. До того ж, це коротше. Технічно, так як масив це об'єкт, ми можемо використовувати цикл `for..in`: @@ -320,9 +320,9 @@ for (let key in arr) { Але насправді це погана ідея. Існують потеційні проблеми: -1. Цикл `for..in` ітерується по *всім властивостям*, не тільки по числових. +1. Цикл `for..in` ітерується по *всіх властивостям*, не тільки по числових. - В браузерах та різних програмних середовищах існують масивоподібні об'єкти, *які виглядають як масив*. Тобто вони мають властивість `length` та індекси, проте вони також містять інші нечислові властивості і методи, як нам часто не потрібні. Цикл `for..in` відобразить і їх. Тому, коли на необхідно працювати з масивами ці "екстра" властивості можуть стати проблемою. + У браузерах та різних програмних середовищах існують масивоподібні об'єкти, *які виглядають як масив*. Тобто вони мають властивість `length` та індекси, проте вони також містять інші нечислові властивості і методи, які нам часто не потрібні. Цикл `for..in` відобразить і їх. Тому, коли нам необхідно працювати з масивами, ці "екстра" властивості можуть стати проблемою. 2. Цикл `for..in` оптимізований для довільних об'єктів, не для масивів, і тому це в 10-100 разів повільніше. Звісно, це все одно дуже швидко. Збільшення швидкості виконання має значення лише у *вузьких місцях*. Але ми все одно повинні бути обережні з відмінностями. @@ -331,7 +331,7 @@ for (let key in arr) { ## Декілька слів про "length" -Властивість `length` спрацьовує автоматично, коли масив змінився. Якщо бути точнішим, то `length` відображає не кількість елементів в масиві а індекс останнього елементу плюс один. +Властивість `length` спрацьовує автоматично, коли масив змінився. Якщо бути точнішим, то `length` відображає не кількість елементів в масиві, а індекс останнього елементу плюс один. Наприклад, один елемент з великим індексом дасть велику довжину: @@ -371,7 +371,7 @@ let arr = *!*new Array*/!*("Apple", "Pear", "etc"); Він використовується рідше, адже квадратні дужки коротші `[]`. А також має певну особливість. -Якщо `new Array` викликаєтсья з одним аргументом,а саме числом, він створить пустий масив з довжиную, яка дорівнює *цьому числу*. +Якщо `new Array` викликається з одним аргументом, а саме числом, він створить пустий масив з довжиною, яка дорівнює *цьому числу*. Давайте подивимось, як можна завдати собі ведмежої послуги: @@ -385,7 +385,7 @@ alert( arr.length ); // length 2 Як бачимо в цьому коді `new Array(number)` всі елементи `undefined`. -Для того, щоб позбавитись таких сюрпризів, як правило, ми використовуємо квадратні дужки `[]`, якщо тільки ми дісно не маємо причини для використання методу `new Array`. +Для того, щоб позбавитись таких сюрпризів, як правило, ми використовуємо квадратні дужки `[]`, якщо тільки ми дійсно не маємо причини для використання методу `new Array`. ## Багатовимірні масиви @@ -403,7 +403,7 @@ alert( matrix[1][1] ); // 5, центральний елемент ## toString -Масиви по-своєму реальзують метод `toString`, який повертає список елементів розділених комою. +Масиви по-своєму реалізують метод `toString`, який повертає список елементів розділених комою. Наприклад: @@ -435,9 +435,9 @@ alert( "1,2" + 1 ); // "1,21" ## Підсумки -Масив - це особливий тип об'єкту, створенний для зберігання та керування впорядкованих даних. +Масив - це особливий тип об'єкту, створений для зберігання та керування впорядкованих даних. -- Об'явлення: +- Оголошення: ```js // квадратні дужки (як правило) @@ -447,12 +447,12 @@ alert( "1,2" + 1 ); // "1,21" let arr = new Array(item1, item2...); ``` - Виклик `new Array(number)` створює масив з заданою довжиною але без елементів. + Виклик `new Array(number)` створює масив з заданою довжиною, але без елементів. - Властивість `length` демонструє довжину масиву або, якщо точніше, останній цифровий індекс масиву плюс один. Це виконується автоматично методами масиву. - Якщо ми вручну скорочуємо `length`, масив зменшується (нагадаємо, що ця операція незворотня). -Ми можемо використовувати масив як двухсторонню чергу за допомогою наступних оперцій: +Ми можемо використовувати масив як двосторонню чергу за допомогою наступних оперцій: - `push(...items)` додає `items` в кінець масиву. - `pop()` видаляє елемент з кінця масиву та повертає його. @@ -460,8 +460,8 @@ alert( "1,2" + 1 ); // "1,21" - `unshift(...items)` додає `items` в початок масиву. Для того, щоб пройтись циклом по елементах масиву: - - `for (let i=0; i. From ccf80a6744c28e13fa39c074c8004692864b84d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D0=B5=D0=BC=20=D0=97=D1=83=D0=BD=D1=83?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2?= Date: Mon, 21 Sep 2020 23:40:53 +0300 Subject: [PATCH 03/30] fix --- 1-js/05-data-types/04-array/1-item-value/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/1-item-value/solution.md b/1-js/05-data-types/04-array/1-item-value/solution.md index c73bcf0ab..e02dceff2 100644 --- a/1-js/05-data-types/04-array/1-item-value/solution.md +++ b/1-js/05-data-types/04-array/1-item-value/solution.md @@ -13,5 +13,5 @@ alert( fruits.length ); // 4 */!* ``` -Це відбудеться тому, що масиви це об'єкти. Отже `shoppingCart` and `fruits` посилаються на один і той самий об'єкт. +Це відбудеться тому, що масиви - це об'єкти. Отже `shoppingCart` and `fruits` посилаються на один і той самий об'єкт. From 0f5a84769f24c4fdf0422c935eafb55427e3c710 Mon Sep 17 00:00:00 2001 From: Vse Mozhe Buty Date: Fri, 18 Sep 2020 16:10:35 +0300 Subject: [PATCH 04/30] Address some possible issues in translation of 1.2.9 --- .../1-comparison-questions/solution.md | 6 +- .../1-comparison-questions/task.md | 2 +- 1-js/02-first-steps/09-comparison/article.md | 58 +++++++++---------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/1-js/02-first-steps/09-comparison/1-comparison-questions/solution.md b/1-js/02-first-steps/09-comparison/1-comparison-questions/solution.md index 0f323c1ff..4d7084e32 100644 --- a/1-js/02-first-steps/09-comparison/1-comparison-questions/solution.md +++ b/1-js/02-first-steps/09-comparison/1-comparison-questions/solution.md @@ -12,10 +12,10 @@ null === +"\n0\n" → false Ось чому такі результати: -1. Очевидно, 5 більше за 4. true. +1. Очевидно, 5 більше за 4. `true`. 2. Посимвольне порівняння, тому `false`. `"а"` менше за `"я"`. 3. Знову посимвольне порівняння. Перший символ рядка `"2"` більший за перший символ другого рядка — `"1"`. -4. Спеціальний випадок. Значення `null` і `undefined` рівні під час не строгого порівняння. +4. Спеціальний випадок. Значення `null` і `undefined` рівні лише один одному під час нестрогого порівняння. 5. Строге порівняння різних типів, тому `false`. -6. Аналогічно, як в кроці `(4)`, `null` рівне лише `undefined`. +6. Аналогічно, як в кроці `(4)`, `null` дорівнює лише `undefined`. 7. Строге порівняння різних типів. diff --git a/1-js/02-first-steps/09-comparison/1-comparison-questions/task.md b/1-js/02-first-steps/09-comparison/1-comparison-questions/task.md index 2c9637c67..b5204e74c 100644 --- a/1-js/02-first-steps/09-comparison/1-comparison-questions/task.md +++ b/1-js/02-first-steps/09-comparison/1-comparison-questions/task.md @@ -4,7 +4,7 @@ importance: 5 # Оператори порівняння -Який буде результат порівняння цих виразів? +Який буде результат цих виразів? ```js no-beautify 5 > 4 diff --git a/1-js/02-first-steps/09-comparison/article.md b/1-js/02-first-steps/09-comparison/article.md index fc4e634ee..ec82efb7b 100644 --- a/1-js/02-first-steps/09-comparison/article.md +++ b/1-js/02-first-steps/09-comparison/article.md @@ -1,24 +1,24 @@ # Оператори порівняння -Багато з операторів порівняння нам відомі з математики: +Багато з операторів порівняння нам відомі з математики. В JavaScript вони записуються ось так: - Більше/менше: a > b, a < b. -- Більше/менше або рівне: a >= b, a <= b. -- Рівне: `a == b`, зверніть увагу, для порівняння потрібно використовувати два знаки рівності `==`. Один знак рівності `a = b` означало б присвоєння. -- Не рівне. В математиці позначається символом , проте в JavaScript записується як a != b. +- Більше/менше або дорівнює: a >= b, a <= b. +- Дорівнює: `a == b`. Зверніть увагу, для порівняння потрібно використовувати два знаки рівності `==`. Один знак рівності `a = b` означав б присвоєння. +- Не дорівнює. В математиці позначається символом , проте в JavaScript записується як a != b. -В цьому розділі ми вивчимо про різні типи порівнянь, як JavaScript їх виконує та розглянемо важливі особливості. +В цьому розділі ми вивчимо різні типи порівнянь, узнаємо, як JavaScript їх виконує, та розглянемо важливі особливості. -В кінці ви знайдете корисні поради, як уникати специфічні "примхи JavaScript". +В кінці ви знайдете корисні поради, як уникати специфічних "примх" JavaScript. ## Результат порівняння має логічний тип Всі оператори порівняння повертають значення логічного типу: -- `true` -- означає "так", "правильно" або "правда". -- `false` -- означає "ні", "неправильно" або "не правда". +- `true` -- означає "так", "правильно" або "істина". +- `false` -- означає "ні", "неправильно" або "хибність". Наприклад: @@ -39,14 +39,14 @@ alert( result ); // true Щоб визначити, чи один рядок більший за інший, JavaScript використовує так званий "алфавітний" або "лексикографічний" порядок. -Іншими словами, рядки порівнюються посимвольно. +Інакше кажучи, рядки порівнюються посимвольно. Наприклад: ```js run alert( 'Я' > 'А' ); // true -alert( 'Кіт' > 'Код' ); // true -alert( 'Кома' > 'Комар' ); // false +alert( 'Соки' > 'Сода' ); // true +alert( 'Комар' > 'Кома' ); // true ``` Алгоритм порівняння рядків досить простий: @@ -57,16 +57,16 @@ alert( 'Кома' > 'Комар' ); // false 4. Порівняння продовжується до того часу, доки не закінчиться один з рядків. 5. Якщо два рядки закінчуються одночасно, то вони рівні. Інакше, довший рядок вважатиметься більшим. -В прикладах вище, порівняння `'Я' > 'А'` завершиться на першому кроці, тоді як `"Кіт"` і `"Код"` будуть порівнюватися посимвольно: +В прикладах вище, порівняння `'Я' > 'А'` завершиться на першому кроці, тоді як `'Соки'` і `'Сода'` будуть порівнюватися посимвольно: -1. `К` рівне `К`. -2. `і` більше за `о`. -3. На другому кроці порівнювання закінчується. Перший рядок більший. +1. `С` дорівнює `С`. +2. `о` дорівнює `о`. +3. `к` більше ніж `д`. На цьому кроці порівнювання закінчується. Перший рядок більший. ```smart header="Використовується кодування Unicode, а не справжній алфавіт" Такий алгоритм порівняння схожий на алгоритм сортування, який використовується в словниках і телефонних довідниках, проте вони не зовсім однакові. -Наприклад, в JavaScript має значення регістр символів. Велика буква `"А"` не рівна маленькій `"а"`. Але яка з них більше? Маленька буква `"а"`. Чому? Тому що маленькі букви мають більший код у внутрішній таблиці кодування, яку використовує JavaScript (Unicode). Ми розглянемо це детальніше в розділі . +Наприклад, в JavaScript має значення регістр символів. Велика буква `"А"` не рівна маленькій `"а"`. Але яка з них більше? Маленька буква `"а"`. Чому? Тому що маленькі букви мають більший код у внутрішній таблиці кодування, яку використовує JavaScript (Unicode). Ми розглянемо особливості і наслідки цього кодування в розділі . ``` ## Порівняння різних типів @@ -107,7 +107,7 @@ alert( Boolean(b) ); // true alert(a == b); // true! ``` -З точки зору JavaScript, результат очікуваний. Порівняння перетворює значення на числа (тому `"0"` стає `0`), тоді як явне перетворення `Boolean` використовує інший набір правил. +З погляду JavaScript, результат очікуваний. Порівняння перетворює значення на числа (тому `"0"` стає `0`), тоді як явне перетворення за допомогою `Boolean` використовує інший набір правил. ```` ## Строге порівняння @@ -146,14 +146,14 @@ alert( 0 === false ); // false, тому що порівнюються різн Поведінка `null` і `undefined` під час порівняння з іншими значеннями — особливе: -Під час строгого порівняння `===` +При строгому порівнянні `===` : Ці значення різні, тому що різні їхні типи. ```js run alert( null === undefined ); // false ``` -При не строгому порівнянні `==` +При нестрогому порівнянні `==` : Ці значення рівні. Водночас ці значення не рівні значенням інших типів. Це спеціальне правило мови. ```js run @@ -175,15 +175,15 @@ alert( null == 0 ); // (2) false alert( null >= 0 ); // (3) *!*true*/!* ``` -З точки зору математики це дивно. Результат останнього порівняння показує, що "`null` більше або рівне нуля", в такому випадку, результат одного з порівнянь вище повинен бути `true`, але обидва вони `false`. +З погляду математики це дивно. Результат останнього порівняння показує, що "`null` більше або дорівнює нулю", в такому випадку результат одного з порівнянь вище повинен бути `true`, але вони обидва `false`. -Причина в тому що не строге порівняння `==` і порівняння `> < >= <=` працюють по-різному. Останні оператори конвертують `null` в число, розглядаючи його як `0`. Ось чому вираз (3) `null >= 0` дає `true`, а вираз (1) `null > 0` — `false`. +Причина в тому що нестроге порівняння `==` і порівняння `> < >= <=` працюють по-різному. Останні оператори конвертують `null` в число, розглядаючи його як `0`. Ось чому вираз (3) `null >= 0` дає `true`, а вираз (1) `null > 0` — `false`. -З іншого боку, для не строгого порівняння `==` значень `undefined` і `null` діє окреме правило: ці значення не перетворюються на інші типи, вони рівні один одному і не рівні будь-чому іншому. Ось чому вираз (2) `null == 0` повертає результат `false`. +З іншого боку, для нестрогого порівняння `==` значень `undefined` і `null` діє окреме правило: ці значення не перетворюються на інші типи, вони рівні один одному і не рівні будь-чому іншому. Ось чому вираз (2) `null == 0` повертає результат `false`. -### Непорівнюване значення undefined +### Незрівнянне значення undefined -Значення `undefined` не рівне іншим значенням: +Значення `undefined` не має порівнюватись з іншими значеннями: ```js run alert( undefined > 0 ); // false (1) @@ -196,14 +196,14 @@ alert( undefined == 0 ); // false (3) Ми отримуємо такі результати, тому що: - Порівняння `(1)` і `(2)` повертає `false`, тому що `undefined` під час порівняння з "не null" значеннями завжди конвертується в `NaN`, а `NaN` — це спеціальне числове значення, яке завжди повертає `false` під час будь-яких порівнянь. -- Не строге порівняння `(3)` повертає `false`, тому що `undefined` рівне тільки `null` і ніяким іншим значенням. +- Нестроге порівняння `(3)` повертає `false`, тому що `undefined` рівне тільки `null`, `undefined` і жодним іншим значенням. -### Уникайте проблем +### Як уникати проблем -Чому ми переглядали ці приклади? Чи повинні ми постійно пам'ятати про всі ці особливості? Не обов'язково. З часом, всі ці заплутані правила стануть для вас знайомими, але можна уникнути проблем, якщо дотримуватися простих правил: +Чому ми переглядали ці приклади? Чи повинні ми постійно пам'ятати про всі ці особливості? Не обов'язково. З часом всі ці заплутані правила стануть для вас знайомими, але можна уникнути проблем, якщо дотримуватися надійних правил: - Будьте пильні під час порівняння будь-якого значення з `undefined/null`, за винятком строгого порівняння `===`. -- Не використовуйте порівняння `>= > < <=` зі змінними, які можуть приймати значення `null/undefined`, якщо не впевнені в тому, що робите. Якщо змінна може приймати ці значення, то додайте для них окремі перевірки. +- Не використовуйте порівняння `>= > < <=` зі змінними, які можуть приймати значення `null/undefined`, хіба що ви цілком впевнені в тому, що робите. Якщо змінна може приймати ці значення, то додайте для них окремі перевірки. ## Підсумки @@ -211,4 +211,4 @@ alert( undefined == 0 ); // false (3) - Рядки порівнюються посимвольно в лексикографічному порядку. - Значення різних типів під час порівняння конвертуються в числа. Винятками є порівняння за допомогою операторів строгої рівності/нерівності. - Значення `null` і `undefined` рівні `==` один одному і не рівні будь-якому іншому значенню. -- Будьте обережні під час використання операторів порівняння `>` чи `<` зі змінними, які можуть приймати значення `null/undefined`. Хорошою ідеєю буде зробити окрему перевірку на `null/undefined` для таких значень. +- Будьте обережні, використовуючи оператори порівняння на зразок `>` чи `<` зі змінними, які можуть приймати значення `null/undefined`. Хорошою ідеєю буде зробити окрему перевірку на `null/undefined` для таких значень. From 39fd6956850537a05f8030f33929d944440c991d Mon Sep 17 00:00:00 2001 From: Vse Mozhe Buty Date: Sun, 20 Sep 2020 14:32:57 +0300 Subject: [PATCH 05/30] Address some possible issues in 1.2.11 --- .../2-alert-or/solution.md | 6 +- .../3-alert-1-null-2/solution.md | 2 +- .../4-alert-and/solution.md | 2 +- .../11-logical-operators/4-alert-and/task.md | 2 +- .../6-check-if-in-range/task.md | 2 +- .../7-check-if-out-range/task.md | 6 +- .../8-if-question/solution.md | 4 +- .../8-if-question/task.md | 4 +- .../9-check-login/ifelse_task.svg | 2 +- .../9-check-login/solution.md | 12 +-- .../9-check-login/task.md | 8 +- .../11-logical-operators/article.md | 76 +++++++++---------- 12 files changed, 63 insertions(+), 63 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/2-alert-or/solution.md b/1-js/02-first-steps/11-logical-operators/2-alert-or/solution.md index b498fd001..9d442cc27 100644 --- a/1-js/02-first-steps/11-logical-operators/2-alert-or/solution.md +++ b/1-js/02-first-steps/11-logical-operators/2-alert-or/solution.md @@ -6,8 +6,8 @@ alert( alert(1) || 2 || alert(3) ); Виклик `alert` не повертає значення. Або, іншими словами, повертає `undefined`. -1. Перший АБО `||` обчислює його лівий операнд `alert(1)`. Це показує перше повідомлення з `1`. +1. Перший АБО `||` обчислює свій лівий операнд `alert(1)`. Це показує перше повідомлення з `1`. 2. `alert` повертає `undefined`, тому АБО переходить до другого операнда, шукаючи правдиве значення. -3. Другий операнд `2` є правдивим, тому виконання зупинено, повернуто `2` і потім показано зовнішнім alert. +3. Другий операнд `2` є правдивим, тому виконання зупинено, повернуто `2` і потім показано зовнішнім `alert`. -Не буде `3`, тому що обчислення на досягає `alert(3)`. +`3` не буде виведене, тому що обчислення не досягає `alert(3)`. diff --git a/1-js/02-first-steps/11-logical-operators/3-alert-1-null-2/solution.md b/1-js/02-first-steps/11-logical-operators/3-alert-1-null-2/solution.md index 5585844ae..03f91d329 100644 --- a/1-js/02-first-steps/11-logical-operators/3-alert-1-null-2/solution.md +++ b/1-js/02-first-steps/11-logical-operators/3-alert-1-null-2/solution.md @@ -1,4 +1,4 @@ -Відповідь: `null`, тому що це перше не правдиве значення зі списку. +Відповідь: `null`, тому що це перше хибне значення зі списку. ```js run alert( 1 && null && 2 ); diff --git a/1-js/02-first-steps/11-logical-operators/4-alert-and/solution.md b/1-js/02-first-steps/11-logical-operators/4-alert-and/solution.md index 4e42b67c2..74049ab02 100644 --- a/1-js/02-first-steps/11-logical-operators/4-alert-and/solution.md +++ b/1-js/02-first-steps/11-logical-operators/4-alert-and/solution.md @@ -6,5 +6,5 @@ alert( alert(1) && alert(2) ); Виклик `alert` повертає `undefined` (він просто показує повідомлення, тому не повертається значення, яке б мало сенс). -Через це `&&` обчислює лівий операнд (виводить `1`) і негайно зупиняється, оскільки `undefined` є не правдивим значенням. І `&&` шукає не правдиве значення і повертає його, як це і зроблено. +Через це `&&` обчислює лівий операнд (виводить `1`) і негайно зупиняється, оскільки `undefined` є хибним значенням. А `&&` шукає хибне значення і повертає його, як це і зроблено. diff --git a/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md b/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md index 7fdfa2c5a..19181cbb9 100644 --- a/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md +++ b/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md @@ -2,7 +2,7 @@ importance: 3 --- -# Який результат alerts, об'єднаних І? +# Який результат alerts, об'єднаних через І? Що виведе код нижче? 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/6-check-if-in-range/task.md index c1784ae9f..cbd3ea7a4 100644 --- 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/6-check-if-in-range/task.md @@ -4,6 +4,6 @@ importance: 3 # Перевірте діапазон -Напишіть умову "if", щоб перевірити, що `age` знаходиться між `14` та `90` включно. +Напишіть умову `if`, щоб перевірити, що `age` знаходиться між `14` та `90` включно. "Включно" означає, що `age` може досягати країв `14` або `90`. 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/7-check-if-out-range/task.md index 1084a0151..3d6aa3297 100644 --- 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/7-check-if-out-range/task.md @@ -2,8 +2,8 @@ importance: 3 --- -# Перевірте зовнішній діапазон +# Перевірте значення поза діапазоном -Напишіть умову `if`: щоб перевірити, що вік `age` НЕ знаходиться між 14 та 90 включно. +Напишіть умову `if`, щоб перевірити, що значення `age` НЕ знаходиться між `14` та `90` включно. -Створіть два варіанти: перший використовує НЕ `!`, другий -- без нього. +Створіть два варіанти: перший з оператором НЕ `!`, другий -- без нього. 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/8-if-question/solution.md index 9fdfa7fe5..7d4b3e03b 100644 --- a/1-js/02-first-steps/11-logical-operators/8-if-question/solution.md +++ b/1-js/02-first-steps/11-logical-operators/8-if-question/solution.md @@ -8,11 +8,11 @@ if (-1 || 0) alert( 'перший' ); // Не виконається -// -1 && 0 = 0, не правдивий +// -1 && 0 = 0, хибний if (-1 && 0) alert( 'другий' ); // Виконається -// Оператор && має більший приорітет, ніж || +// Оператор && має більший пріоритет, ніж || // тому -1 && 1 виконається першим, даючи нам послідовність: // null || -1 && 1 -> null || 1 -> 1 if (null || -1 && 1) alert( 'третій' ); 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/8-if-question/task.md index 12a14e6ea..0a1ebe221 100644 --- a/1-js/02-first-steps/11-logical-operators/8-if-question/task.md +++ b/1-js/02-first-steps/11-logical-operators/8-if-question/task.md @@ -4,9 +4,9 @@ importance: 5 # Питання про "if" -Який з цих `alert` буде виконано? +Які з цих `alert` буде виконано? -Які рузельтати виразів будуть у `if(...)`? +Якими будуть результати виразів у `if(...)`? ```js if (-1 || 0) alert( 'перший' ); 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 ca3e0aead..1b0322c35 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 @@ -BeginCanceledCanceledWelcome!I don't know youWrong passwordWho's there?Password?CancelCancelAdminTheMasterOtherOther \ No newline at end of file +ПочатокСкасованоСкасованоЛаскаво просимо!Я вас не знаюНеправильний парольХто там?Пароль?СкасованоСкасованоAdminГосподарІншеІнше \ No newline at end of file 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 b69b572cc..0a88094cd 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 @@ -1,24 +1,24 @@ ```js run demo -let userName = prompt("Хто там?", ''); +let userName = prompt('Хто там?', ''); -if (userName == 'Admin') { +if (userName === 'Admin') { let pass = prompt('Пароль?', ''); - if (pass == 'TheMaster') { + if (pass === 'Господар') { alert( 'Ласкаво просимо!' ); - } else if (pass == '' || pass == null) { + } else if (pass === '' || pass === null) { alert( 'Скасовано' ); } else { alert( 'Неправильний пароль' ); } -} else if (userName == '' || userName == null) { +} else if (userName === '' || userName === null) { alert( 'Скасовано' ); } else { - alert( "Я вас не знаю" ); + alert( 'Я вас не знаю' ); } ``` 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 d225513b2..a730e56de 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 @@ -6,19 +6,19 @@ importance: 3 Напишіть код, який запитує логін за допомогою `prompt`. -Якщо відвідувач вводить `"Admin"`, тоді запропонуйте за допомогою `prompt` ввести пароль, i якщо вхідні данні є порожнім рядком або `key:Esc` -- показати "Скасовано", якщо це інакший рядок -- тоді покажіть "Я вас не знаю". +Якщо відвідувач вводить `"Admin"`, тоді запропонуйте за допомогою `prompt` ввести пароль. Якщо введено порожній рядок або натиснуто `key:Esc` -- показати "Скасовано". Якщо введено інший рядок -- тоді покажіть "Я вас не знаю". Пароль перевіряється наступним чином: -- Якщо він дорівнює "TheMaster", тоді покажіть "Ласкаво просимо!", +- Якщо він дорівнює "Господар", тоді покажіть "Ласкаво просимо!", - Інший рядок -- покажіть "Неправильний пароль", -- Для порожнього рядка, або якщо введення було скасовано, покажіть "Скасовано" +- Для порожнього рядка, або якщо введення було скасовано, покажіть "Скасовано". Схема: ![](ifelse_task.svg) -Будь ласка, використовуйте вкладені `if` блоки. Майте на увазі загальну читабельність коду. +Будь ласка, використовуйте вкладені `if` блоки. Потурбуйтесь про загальну читабельність коду. Підказка: передача порожнього вводу до запиту повертає порожній рядок `''`. Натискання `key:ESC` протягом запиту повертає `null`. 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 5b2e6fe57..2ab3361d8 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -14,9 +14,9 @@ result = a || b; ``` -У класичному програмуванні логічний АБО призначений для маніпулювання лише булевими значеннями. Якщо будь-який з його аргументів `true`, він повертає `true`, інакше повертає `false`. +У класичному програмуванні логічний оператор АБО призначений для маніпулювання лише булевими значеннями. Якщо будь-який з його аргументів означає `true`, повертається `true`, інакше повертається `false`. -У JavaScript оператор більш складніший і потужніший. Але спочатку подивимося, що відбувається з булевими значеннями. +У JavaScript цей оператор складніший і потужніший. Але спочатку подивимося, що відбувається з булевими значеннями. Є чотири можливі логічні комбінації: @@ -27,7 +27,7 @@ alert( true || false ); // true alert( false || false ); // false ``` -Як бачимо, результат завжди `true`, за винятком випадку, коли обидва операнда `false`. +Як бачимо, результат завжди `true`, за винятком випадку, коли обидва операнди `false`. Якщо операнд не є булевим, він перетворюється на булевий для обчислення. @@ -39,7 +39,7 @@ if (1 || 0) { // працює так само, як ( true || false ) } ``` -У бильшості випадків АБО `||` використовується в операторі `if`, щоб перевірити, чи є *будь-яка* з заданих умов `true`. +У більшості випадків АБО `||` використовується в інструкціях `if`, щоб перевірити, чи є *будь-яка* із заданих умов `true`. Наприклад: @@ -70,7 +70,7 @@ if (hour < 10 || hour > 18 || isWeekend) { Розширений алгоритм працює наступним чином. -Дано кілька значень, розділених опертором АБО: +Дано кілька значень, розділених оператором АБО: ```js result = value1 || value2 || value3; @@ -84,7 +84,7 @@ result = value1 || value2 || value3; Значення повертається у первісному вигляді без конвертації. -Іншими словами, ланцюжок з АБО `"||"` повертає перше правдиве значення або останнє, якщо не знайдено правдивого значення. +Іншими словами, ланцюжок з АБО `||` повертає перше правдиве значення або останнє, якщо правдивого значення не знайдено. Наприклад: @@ -94,16 +94,16 @@ alert( 1 || 0 ); // 1 (1 є правдивим) alert( null || 1 ); // 1 (1 є першим правдивим значенням) alert( null || 0 || 1 ); // 1 (перше правдиве значення) -alert( undefined || null || 0 ); // 0 (усі не правдиві, повертає останнє значення) +alert( undefined || null || 0 ); // 0 (усі хибні, повертається останнє значення) ``` Це призводить до цікавого використання, у порівнянні з "чистим, класичним, виключно-булевим АБО". 1. **Отримання першого правдивого значення зі списку змінних або виразів.** - Наприклад, маємо змінні `firstName`, `lastName` та `nickName`, усі необов'язкові. + Наприклад, маємо змінні `firstName`, `lastName` та `nickName`, усі необов'язкові (тобто вони можуть бути невизначеними або мати неправдиві значення). - Використаємо АБО `||`, щоб вибрати ту змінну, яка має дані і виведемо її (або `анонімний` якщо немає даних): + Використаємо АБО `||`, щоб вибрати ту змінну, яка має дані, і виведемо її (або рядок `"Анонім"`, якщо жодна змінна не має даних): ```js run let firstName = ""; @@ -111,7 +111,7 @@ alert( undefined || null || 0 ); // 0 (усі не правдиві, повер let nickName = "СуперКодер"; *!* - alert( firstName || lastName || nickName || "Анонімний"); // СуперКодер + alert( firstName || lastName || nickName || "Анонім"); // СуперКодер */!* ``` @@ -120,21 +120,21 @@ alert( undefined || null || 0 ); // 0 (усі не правдиві, повер 2. **Обчислення короткого замикання.** Іншою особливістю оператора АБО `||` є так зване "обчислення короткого замикання". - + Це означає, що оператор `||` опрацьовує аргументи доти, доки не досягається перше правдиве значення, після чого це значення негайно повертається, без подальшого опрацювання решти аргументів. - - Важливість цієї особливості стає очевидною, коли операнд не проста змінна, а вираз з побічною дією, такі як присвоєння змінної, або виклик функції. - У наведеному нижче прикладі, виведеться лише друге повідомлення: + Важливість цієї поведінки стає очевидною, коли операнд не проста змінна, а вираз з побічною дією, як от визначення змінної або виклик функції. + + У наведеному нижче прикладі виведеться лише друге повідомлення: ```js run no-beautify *!*true*/!* || alert("не виведеться"); *!*false*/!* || alert("виведеться"); ``` - В першому рядку, оператор АБО `||` зупиняє виконання відразу після того, як "побачить" що лівий вираз `true`, тож `alert` не виконається. + В першому рядку оператор АБО `||` зупиняє виконання відразу після того, як "побачить" що лівий вираз є `true`, тож `alert` не виконається. - Деколи люди використовують таку конструкцію щоб виконати команди, якщо умова в лівій частині невірна. + Деколи таку конструкцію використовують, щоб виконувати команди лише за умови неправдивості умови ліворуч від оператора. ## && (І) @@ -144,7 +144,7 @@ alert( undefined || null || 0 ); // 0 (усі не правдиві, повер result = a && b; ``` -У класичному програмуванні І повертає `true`, якщо обидва оператора є правдивими і `false` у іншому випадку: +У класичному програмуванні І повертає `true`, якщо обидва оператори є правдивими, і `false` в іншому випадку: ```js run alert( true && true ); // true @@ -167,15 +167,15 @@ if (hour == 12 && minute == 30) { Так само, як з АБО, будь-яке значення дозволено як операнд І: ```js run -if (1 && 0) { // оцінюється як true && false - alert( "не буде працювати, тому що результат не правдивий" ); +if (1 && 0) { // обчислюється як true && false + alert( "не буде працювати, тому що результат хибний" ); } ``` -## І "&&" шукає перше не правдиве значення +## І "&&" шукає перше хибне значення -Дано декілька значень, об'єднаних І: +Дано декілька значень, об'єднаних кількома І: ```js result = value1 && value2 && value3; @@ -187,9 +187,9 @@ result = value1 && value2 && value3; - Перетворює кожен операнд на булевий. Якщо результат `false`, зупиняється і повертає оригінальне значення того операнда. - Якщо всі операнди були обчисленні (тобто усі були правдиві), повертає останній операнд. -Іншими словами, І повертає перше не правдиве значення, або останнє значення, якщо жодного не правдивого не було знайдено. +Іншими словами, І повертає перше хибне значення, або останнє значення, якщо жодного хибного не було знайдено. -Правила, наведені вище, подібні до АБО. Різниця полягає в тому, що І повертає перше *не правдиве* значення, тоді як АБО повертає перше *правдиве*. +Правила, наведені вище, подібні до правил АБО. Різниця полягає в тому, що І повертає перше *хибне* значення, тоді як АБО повертає перше *правдиве*. Приклади: @@ -199,13 +199,13 @@ result = value1 && value2 && value3; alert( 1 && 0 ); // 0 alert( 1 && 5 ); // 5 -// якщо перший операнд не правдивий, +// якщо перший операнд хибний, // І повертає саме його. Другий операнд ігнорується alert( null && 5 ); // null -alert( 0 && "не важливо" ); // 0 +alert( 0 && "неважливо" ); // 0 ``` -Ми також можемо передавати декілька значень поспіль. Подивіться, як повертається перший не правдивий: +Ми також можемо передавати декілька значень поспіль. Подивіться, як повертається перше хибне: ```js run alert( 1 && 2 && null && 3 ); // null @@ -217,14 +217,14 @@ alert( 1 && 2 && null && 3 ); // null alert( 1 && 2 && 3 ); // 3, останнє ``` -````smart header="Пріоритет І `&&` є більш високим за АБО `||`" -Пріоритет оператора І `&&` є більш високим за АБО `||`. +````smart header="Пріоритет І `&&` вище за АБО `||`" +Пріоритет оператора І `&&` вище за АБО `||`. -Отже, код `a && b || c && d` по суті є таким самим, як би вираз `&&` був у дужках: `(a && b) || (c && d)`. +Отже, код `a && b || c && d` по суті є таким самим, як код з виразами `&&` у дужках: `(a && b) || (c && d)`. ```` -````warn header="Не міняйте `if` на || чи &&" -Деколи люди використовують оператор І `&&` як "скорочений варіант `if`". +````warn header="Не міняйте `if` на `||` чи `&&`" +Деколи оператор І `&&` використовують як "скорочений варіант `if`". Наприклад: @@ -234,7 +234,7 @@ let x = 1; (x > 0) && alert( 'Більше за нуль!' ); ``` -Дія у правій частині `&&` буде виконуватися, тільки якщо обчислення дійде до неї. Тобто, тільки якщо `(x > 0)` є ічтинним. +Дія у правій частині `&&` буде виконуватися, тільки якщо обчислення дійде до неї. Тобто тільки якщо `(x > 0)` є істинним. Тому, власне, ми маємо аналог для: @@ -244,7 +244,7 @@ let x = 1; if (x > 0) alert( 'Більше за нуль!' ); ``` -Варіант з `&&` коротший. Але `if` є більш очевидним і зазвичай більш читабельний. Тому ми рекомендуємо використовувати кожну конструкцію за своїм призначенням: використовуємо `if`, якщо нам потрібен if і використовуємо `&&`, якщо нам потрібен І. +Хоча варіант з `&&` видається коротшим, конструкція з `if` є більш очевидною і зазвичай більш читабельною. Тому ми рекомендуємо використовувати кожну конструкцію за своїм призначенням: використовуємо `if`, якщо нам потрібна інструкція `if`, і використовуємо `&&`, якщо нам потрібен оператор І. ```` @@ -273,17 +273,17 @@ alert( !0 ); // true Подвійний НЕ `!!` іноді використовується для перетворення значення на булевий тип: ```js run -alert( !!"не пустий рядок" ); // true +alert( !!"непустий рядок" ); // true alert( !!null ); // false ``` -Тобто, перший НЕ перетворює значення на булево і повертає зворотне, а другий НЕ інвертує його знову. Зрештою, ми маємо просте перетворення значення на булевий тип. +Тобто, перший НЕ перетворює значення на булеве і повертає зворотне, а другий НЕ інвертує його знову. Зрештою ми маємо просте перетворення значень на булевий тип. -Є трохи більш детальний спосіб зробити те ж саме -- вбудована функція `Boolean`: +Є трохи довший спосіб зробити те ж саме -- вбудована функція `Boolean`: ```js run -alert( Boolean("не пустий рядок") ); // true +alert( Boolean("непустий рядок") ); // true alert( Boolean(null) ); // false ``` -Пріоритет НЕ `!` є навищим з усіх логічних операторів, тому він завжди виконується першим, перед `&&` або `||`. +Пріоритет НЕ `!` є найвищим з усіх логічних операторів, тому він завжди виконується першим, перед `&&` або `||`. From 4d0ed209afa5df5b3d2e7cee04ad41a99fdb1c6e Mon Sep 17 00:00:00 2001 From: Vse Mozhe Buty Date: Sat, 3 Oct 2020 18:28:17 +0300 Subject: [PATCH 06/30] Address review suggestions --- .../11-logical-operators/4-alert-and/task.md | 2 +- .../11-logical-operators/article.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md b/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md index 19181cbb9..06d54653d 100644 --- a/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md +++ b/1-js/02-first-steps/11-logical-operators/4-alert-and/task.md @@ -2,7 +2,7 @@ importance: 3 --- -# Який результат alerts, об'єднаних через І? +# Який результат alerts, об'єднаних за допомогою І? Що виведе код нижче? 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 2ab3361d8..91cfbf573 100644 --- a/1-js/02-first-steps/11-logical-operators/article.md +++ b/1-js/02-first-steps/11-logical-operators/article.md @@ -99,9 +99,9 @@ alert( undefined || null || 0 ); // 0 (усі хибні, повертаєтьс Це призводить до цікавого використання, у порівнянні з "чистим, класичним, виключно-булевим АБО". -1. **Отримання першого правдивого значення зі списку змінних або виразів.** +1. **Отримання першого істинного значення зі списку змінних або виразів.** - Наприклад, маємо змінні `firstName`, `lastName` та `nickName`, усі необов'язкові (тобто вони можуть бути невизначеними або мати неправдиві значення). + Наприклад, маємо змінні `firstName`, `lastName` та `nickName`, усі необов'язкові (тобто вони можуть бути невизначеними або мати хибні значення). Використаємо АБО `||`, щоб вибрати ту змінну, яка має дані, і виведемо її (або рядок `"Анонім"`, якщо жодна змінна не має даних): @@ -123,7 +123,7 @@ alert( undefined || null || 0 ); // 0 (усі хибні, повертаєтьс Це означає, що оператор `||` опрацьовує аргументи доти, доки не досягається перше правдиве значення, після чого це значення негайно повертається, без подальшого опрацювання решти аргументів. - Важливість цієї поведінки стає очевидною, коли операнд не проста змінна, а вираз з побічною дією, як от визначення змінної або виклик функції. + Важливість такої особливості стає очевидною, якщо операнд є не просто змінною, а виразом із побічним ефектом, як-от присвоєння змінної або виклик функції. У наведеному нижче прикладі виведеться лише друге повідомлення: @@ -134,7 +134,7 @@ alert( undefined || null || 0 ); // 0 (усі хибні, повертаєтьс В першому рядку оператор АБО `||` зупиняє виконання відразу після того, як "побачить" що лівий вираз є `true`, тож `alert` не виконається. - Деколи таку конструкцію використовують, щоб виконувати команди лише за умови неправдивості умови ліворуч від оператора. + Деколи таку конструкцію використовують, щоб виконувати команди лише при хибності умови ліворуч від оператора. ## && (І) @@ -218,7 +218,7 @@ alert( 1 && 2 && 3 ); // 3, останнє ``` ````smart header="Пріоритет І `&&` вище за АБО `||`" -Пріоритет оператора І `&&` вище за АБО `||`. +Оператор І `&&` має вищий пріоритет за АБО `||`. Отже, код `a && b || c && d` по суті є таким самим, як код з виразами `&&` у дужках: `(a && b) || (c && d)`. ```` @@ -273,7 +273,7 @@ alert( !0 ); // true Подвійний НЕ `!!` іноді використовується для перетворення значення на булевий тип: ```js run -alert( !!"непустий рядок" ); // true +alert( !!"не пустий рядок" ); // true alert( !!null ); // false ``` @@ -282,8 +282,8 @@ alert( !!null ); // false Є трохи довший спосіб зробити те ж саме -- вбудована функція `Boolean`: ```js run -alert( Boolean("непустий рядок") ); // true +alert( Boolean("не пустий рядок") ); // true alert( Boolean(null) ); // false ``` -Пріоритет НЕ `!` є найвищим з усіх логічних операторів, тому він завжди виконується першим, перед `&&` або `||`. +Пріоритет НЕ `!` є найвищим серед усіх логічних операторів, тому він завжди виконується першим, перед `&&` або `||`. From e63ed1ca3eb8bc00b8242328a629067d06af10cb Mon Sep 17 00:00:00 2001 From: Taras Date: Sat, 3 Oct 2020 20:51:23 +0300 Subject: [PATCH 07/30] Update 1-js/02-first-steps/09-comparison/article.md --- 1-js/02-first-steps/09-comparison/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/02-first-steps/09-comparison/article.md b/1-js/02-first-steps/09-comparison/article.md index ec82efb7b..0d48d50d8 100644 --- a/1-js/02-first-steps/09-comparison/article.md +++ b/1-js/02-first-steps/09-comparison/article.md @@ -181,7 +181,7 @@ alert( null >= 0 ); // (3) *!*true*/!* З іншого боку, для нестрогого порівняння `==` значень `undefined` і `null` діє окреме правило: ці значення не перетворюються на інші типи, вони рівні один одному і не рівні будь-чому іншому. Ось чому вираз (2) `null == 0` повертає результат `false`. -### Незрівнянне значення undefined +### Не порівнюйте значення undefined Значення `undefined` не має порівнюватись з іншими значеннями: From 0c138494d0ba125789130f4c0044a4d983fd982e Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:15:24 +0300 Subject: [PATCH 08/30] Update 1-js/05-data-types/04-array/1-item-value/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/1-item-value/solution.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/1-js/05-data-types/04-array/1-item-value/solution.md b/1-js/05-data-types/04-array/1-item-value/solution.md index e02dceff2..f70732314 100644 --- a/1-js/05-data-types/04-array/1-item-value/solution.md +++ b/1-js/05-data-types/04-array/1-item-value/solution.md @@ -13,5 +13,4 @@ alert( fruits.length ); // 4 */!* ``` -Це відбудеться тому, що масиви - це об'єкти. Отже `shoppingCart` and `fruits` посилаються на один і той самий об'єкт. - +Це відбувається тому, що масиви — це об’єкти. Отже, `shoppingCart` та `fruits` посилаються на один і той самий об’єкт. From e144e4c63227520d1c84f912a19fab4d9b333fc7 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:16:01 +0300 Subject: [PATCH 09/30] Update 1-js/05-data-types/04-array/1-item-value/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/1-item-value/task.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/1-js/05-data-types/04-array/1-item-value/task.md b/1-js/05-data-types/04-array/1-item-value/task.md index 4d692d762..807964da2 100644 --- a/1-js/05-data-types/04-array/1-item-value/task.md +++ b/1-js/05-data-types/04-array/1-item-value/task.md @@ -1,4 +1,4 @@ -важливість: 3 +importance: 3 --- @@ -16,4 +16,3 @@ shoppingCart.push("Banana"); // Що в fruits? alert( fruits.length ); // ? ``` - From f625bfdf5d1a6fe35a354e873ac06a748438f80e Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:17:13 +0300 Subject: [PATCH 10/30] Update 1-js/05-data-types/04-array/10-maximal-subarray/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/10-maximal-subarray/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cffbdcc38..f8e60828a 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 @@ -57,7 +57,7 @@ alert( getMaxSubSum([1, 2, 3]) ); // 6 alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100 ``` -Це вирішення має оцінку часу виконання [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation). Іншими словами,якщо ми збільшимо розмір масиву в 2 рази, алгоритм буде працювати у 4 рази довше. +Таке рішення має оцінку часу виконання [O(n2)](https://uk.wikipedia.org/wiki/Нотація_Ландау). Інакше кажучи, якщо ми збільшимо розмір масиву вдвічі, алгоритм буде виконуватися в 4 рази довше. Для великих масивів (1000, 10000 або більше елементів) подібні алгоритми можуть призводити до серйозних "пригальмувань" роботі. From b29233673edd70f9cb435b2fcd01a163f1dcb72e Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:19:45 +0300 Subject: [PATCH 11/30] Update 1-js/05-data-types/04-array/10-maximal-subarray/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/10-maximal-subarray/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f8e60828a..eccec378b 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 @@ -63,7 +63,7 @@ alert( getMaxSubSum([100, -9, 2, -3, 5]) ); // 100 # Швидке рішення -Йдемо по масиву і накопичуємо поточну часткову суму елементів в змінній `s`. Якщо в певний момент `s` стає меншим за 0, призначаємо `s=0`. Максимальний з усіх `s` і буде відповіддю. +Пройдемося по масиву і в процесі будемо накопичувати проміжну суму елементів в змінній `s`. Якщо в певний момент `s` стане меншою за 0, присвоїмо `s=0`. Максимальне значення з усіх `s` і буде відповіддю. Якщо пояснення не дуже зрозуміле, подивіться, будь ласка, на код - він досить лаконічний: From 18aa57dfcf7cd47aa814ad6640a3a183b580d3fc Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:20:15 +0300 Subject: [PATCH 12/30] Update 1-js/05-data-types/04-array/10-maximal-subarray/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/10-maximal-subarray/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 eccec378b..ca89aee31 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 Цей алгоритм потребує рівно один прохід по масиву, його оціночний час виконання - O(n). -Ви можете знайти більше детальної інформації про алгоритм тут: [Maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem). Якщо досі не повністю зрозуміло, як це працює, будь ласка, подивіться алгоритм у прикладах вище, це буде краще будь-яких слів. +Ви можете дізнатися більше про цей алгоритм тут: [Maximum subarray problem](http://en.wikipedia.org/wiki/Maximum_subarray_problem). Якщо досі не цілком зрозуміло, як це працює, будь ласка, подивіться алгоритм у прикладах вище, це буде краще за будь-які слова. From 346df19e51ae3e7adcc0c0d330c92dc56f061444 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:21:24 +0300 Subject: [PATCH 13/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 1a4c7d21f..c06696d64 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -89,7 +89,7 @@ let fruits = [ ]; ``` -Використання "завершальної коми" спрощує процес додавання/видалення елементів, тому що всі строки стають ідентичними. +Кома в кінці спрощує процес додавання/видалення елементів, тому що всі рядки стають ідентичними. ```` From 553d1bf4a7983b09c339e709325533eefb198645 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:21:38 +0300 Subject: [PATCH 14/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 c06696d64..e7be64e83 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -95,7 +95,7 @@ let fruits = [ ## Методи pop/push, shift/unshift -[Черга](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) - один з найбільш популярних варіантів використання об'єкту. У комп'ютерних науках так позначають +[Черга](https://uk.wikipedia.org/wiki/Черга_(структура_даних)) — один з найбільш популярних варіантів використання об’єкту. У ком’ютерних науках так позначають колекцію елементів, яка підтримує дві операції: колекцію елементів, яка підтримує дві операції: - `push` додає елемент у кінець списку. From 5c53bb047c43913fc24344e382a4cc2573176dd7 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:22:52 +0300 Subject: [PATCH 15/30] Update 1-js/05-data-types/04-array/10-maximal-subarray/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/10-maximal-subarray/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/10-maximal-subarray/task.md b/1-js/05-data-types/04-array/10-maximal-subarray/task.md index 7a78126a3..e9d3acd71 100644 --- a/1-js/05-data-types/04-array/10-maximal-subarray/task.md +++ b/1-js/05-data-types/04-array/10-maximal-subarray/task.md @@ -1,4 +1,4 @@ -Важливість: 2 +importance: 2 --- From 3428177e463e6ecc15cc419f8d89e1ac0201e66d Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:23:37 +0300 Subject: [PATCH 16/30] Update 1-js/05-data-types/04-array/10-maximal-subarray/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/10-maximal-subarray/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/10-maximal-subarray/task.md b/1-js/05-data-types/04-array/10-maximal-subarray/task.md index e9d3acd71..2a15b3ba8 100644 --- a/1-js/05-data-types/04-array/10-maximal-subarray/task.md +++ b/1-js/05-data-types/04-array/10-maximal-subarray/task.md @@ -4,7 +4,7 @@ importance: 2 # Максимальний підмасив -На вході мисив чисел, наприклад `arr = [1, -2, 3, 4, -9, 6]`. +На вході масив чисел, наприклад `arr = [1, -2, 3, 4, -9, 6]`. Завдання: знайти неперервний підмасив `arr` з максимальною сумою елементів. From 0a33c74ae25a644aa5809108ebc663a5b0503d5d Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:24:10 +0300 Subject: [PATCH 17/30] Update 1-js/05-data-types/04-array/2-create-array/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/2-create-array/task.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 555789130..231504f27 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 @@ -1,4 +1,4 @@ -Важливість: 5 +importance: 5 --- @@ -21,4 +21,3 @@ Jazz, Classics, Rock-n-Roll Classics, Rock-n-Roll Rap, Reggae, Classics, Rock-n-Roll ``` - From 9dda948b2bf44dd83c55eced93bbfa27d7f57ffe Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:24:39 +0300 Subject: [PATCH 18/30] Update 1-js/05-data-types/04-array/10-maximal-subarray/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/10-maximal-subarray/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/10-maximal-subarray/task.md b/1-js/05-data-types/04-array/10-maximal-subarray/task.md index 2a15b3ba8..525d326c7 100644 --- a/1-js/05-data-types/04-array/10-maximal-subarray/task.md +++ b/1-js/05-data-types/04-array/10-maximal-subarray/task.md @@ -27,4 +27,4 @@ getMaxSubSum([*!*1, 2, 3*/!*]) == 6 (take all) getMaxSubSum([-1, -2, -3]) = 0 ``` -Будь ласка, подумайте над швидким рішенням: [O(n2)](https://en.wikipedia.org/wiki/Big_O_notation) або над O(n) рішенням, якщо зможете. +Будь ласка, подумайте над швидким рішенням: [O(n2)](https://uk.wikipedia.org/wiki/Нотація_Ландау) або навіть над рішенням O(n), якщо зможете. From 2959f84f3fdbed8c228ac6fca462684e352d7c34 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:32:59 +0300 Subject: [PATCH 19/30] Update 1-js/05-data-types/04-array/5-array-input-sum/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/5-array-input-sum/solution.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/1-js/05-data-types/04-array/5-array-input-sum/solution.md b/1-js/05-data-types/04-array/5-array-input-sum/solution.md index fe0d9df9f..7a9e4bb43 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/solution.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/solution.md @@ -8,7 +8,7 @@ function sumInput() { while (true) { - let value = prompt("A number please?", 0); + let value = prompt("Введіть, будь ласка, номер", 0); // Обриваємо введення даних? if (value === "" || value === null || !isFinite(value)) break; @@ -25,4 +25,3 @@ function sumInput() { alert( sumInput() ); ``` - From f4a3cad94c18d7a5487878994bf0407eca913fe6 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:33:51 +0300 Subject: [PATCH 20/30] Update 1-js/05-data-types/04-array/3-call-array-this/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/3-call-array-this/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/3-call-array-this/solution.md b/1-js/05-data-types/04-array/3-call-array-this/solution.md index c908b832c..fc0d28581 100644 --- a/1-js/05-data-types/04-array/3-call-array-this/solution.md +++ b/1-js/05-data-types/04-array/3-call-array-this/solution.md @@ -1,6 +1,6 @@ Виклик `arr[2]()` це - синтаксично старий та добрий `obj[method]()`, в ролі `obj` ми маємо `arr`, а в ролі `method` ми маємо `2`. -Ми маємо виклик функції `arr[2]` як методу об'єкту. Відповідно, він отримає у якості `this` об'єкт `arr` та виводить масив: +Ми маємо виклик функції `arr[2]` як методу об’єкту. Відповідно, він отримає в якості `this` об’єкт `arr` та виведе масив: ```js run let arr = ["a", "b"]; From 3f3fd8de9efa98d93f85347fb06e22e985ab1b6f Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:34:29 +0300 Subject: [PATCH 21/30] Update 1-js/05-data-types/04-array/3-call-array-this/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/3-call-array-this/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/3-call-array-this/solution.md b/1-js/05-data-types/04-array/3-call-array-this/solution.md index fc0d28581..17b7c0c02 100644 --- a/1-js/05-data-types/04-array/3-call-array-this/solution.md +++ b/1-js/05-data-types/04-array/3-call-array-this/solution.md @@ -1,4 +1,4 @@ -Виклик `arr[2]()` це - синтаксично старий та добрий `obj[method]()`, в ролі `obj` ми маємо `arr`, а в ролі `method` ми маємо `2`. +Виклик `arr[2]()` це - синтаксично старий-добрий `obj[method]()`, в ролі `obj` ми маємо `arr`, а в ролі `method` ми маємо `2`. Ми маємо виклик функції `arr[2]` як методу об’єкту. Відповідно, він отримає в якості `this` об’єкт `arr` та виведе масив: From fbad78f9c17d57e303fa249340ef28b8eb01db0d Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:35:46 +0300 Subject: [PATCH 22/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 e7be64e83..789ad4acb 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -44,7 +44,7 @@ fruits[2] = 'Pear'; // зараз ["Apple", "Orange", "Pear"] ...Або додати новий: ```js -fruits[3] = 'Lemon'; // зараз ["Apple", "Orange", "Pear", "Lemon"] +fruits[3] = 'Lemon'; // тепер ["Apple", "Orange", "Pear", "Lemon"] ``` Загальна кількість елементів масиву зберігається у його властивості `length`: From e3b6dc3519924920488f7af4dd2807d3121f87b1 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:36:11 +0300 Subject: [PATCH 23/30] Update 1-js/05-data-types/04-array/3-call-array-this/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/3-call-array-this/task.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 e7f421955..01cc6d1d2 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 @@ -1,4 +1,4 @@ -Важливість: 5 +importance: 5 --- @@ -15,4 +15,3 @@ arr.push(function() { arr[2](); // ? ``` - From 37e4fec265ad4863b7bf6c2f6f1e6deba833c14f Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:37:43 +0300 Subject: [PATCH 24/30] Update 1-js/05-data-types/04-array/3-call-array-this/task.md Co-authored-by: Taras --- 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 01cc6d1d2..8a2ce50ba 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 @@ -4,7 +4,7 @@ importance: 5 # Виклик в контексті масиву -Який результат? Чому? +Яким буде результат? Чому? ```js let arr = ["a", "b"]; From c934ebfb0e758aaa9cd79aca115cf9de388602be Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:38:23 +0300 Subject: [PATCH 25/30] Update 1-js/05-data-types/04-array/5-array-input-sum/solution.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/5-array-input-sum/solution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/5-array-input-sum/solution.md b/1-js/05-data-types/04-array/5-array-input-sum/solution.md index 7a9e4bb43..7704d032e 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/solution.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/solution.md @@ -1,4 +1,4 @@ -Будь ласка, зверніть увагу на одну важливу деталь у вирішенні цієї задачі.Ми не конвертуємо `value` в число одразу після `prompt`, тому що одразу після операції `value = +value` ми не зможемо відрізнити порожню строку (зупинення роботи функції) від нуля (валідне число). Тому ми робимо це пізніше. +Зверніть увагу на одну важливу річ у вирішенні цієї задачі. Ми не конвертуємо `value` в число одразу після `prompt`, тому що одразу після операції `value = +value` ми не зможемо відрізнити порожній рядок (зупинення роботи функції) від нуля (дійсне число). Тому ми робимо це пізніше. ```js run demo From eab4e7e006bc5da513652e52985bfbe58cecec78 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:38:44 +0300 Subject: [PATCH 26/30] Update 1-js/05-data-types/04-array/5-array-input-sum/task.md Co-authored-by: Taras --- 1-js/05-data-types/04-array/5-array-input-sum/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/04-array/5-array-input-sum/task.md b/1-js/05-data-types/04-array/5-array-input-sum/task.md index 01bff93cb..661678f9d 100644 --- a/1-js/05-data-types/04-array/5-array-input-sum/task.md +++ b/1-js/05-data-types/04-array/5-array-input-sum/task.md @@ -1,4 +1,4 @@ -Важливість: 4 +importance: 4 --- From 3daeba3c033e2e13a50ae9a161443cac5b8c5256 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:39:59 +0300 Subject: [PATCH 27/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 789ad4acb..9812d0085 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -79,7 +79,7 @@ arr[3](); // hello ``` -````smart header="Завершальна кома" +````smart header="Кома в кінці" Список елементів масиву, як і список елементів об'єкту може закінчуватись комою: ```js let fruits = [ From 6695273f6b5a45d53af5fdc23e87c40dcb4d68e4 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:40:20 +0300 Subject: [PATCH 28/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 9812d0085..ec222e65d 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -10,7 +10,7 @@ ## Оголошення -Існує два типу синтаксу для створення пустого масиву: +Існує два типи синтаксу для створення порожнього масиву: ```js let arr = new Array(); From 91552644afa4fcffc12e3c955ba9861afa5bba8d Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:43:18 +0300 Subject: [PATCH 29/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 ec222e65d..ae7d954dc 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -38,7 +38,7 @@ alert( fruits[2] ); // Plum Можемо замінити елемент: ```js -fruits[2] = 'Pear'; // зараз ["Apple", "Orange", "Pear"] +fruits[2] = 'Pear'; // тепер ["Apple", "Orange", "Pear"] ``` ...Або додати новий: From 6b611f00d35d6f85292f5fc39d95018292905169 Mon Sep 17 00:00:00 2001 From: ArtemZununov Date: Wed, 21 Oct 2020 14:43:39 +0300 Subject: [PATCH 30/30] Update 1-js/05-data-types/04-array/article.md Co-authored-by: Taras --- 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 ae7d954dc..a6c849025 100644 --- a/1-js/05-data-types/04-array/article.md +++ b/1-js/05-data-types/04-array/article.md @@ -47,7 +47,7 @@ fruits[2] = 'Pear'; // тепер ["Apple", "Orange", "Pear"] fruits[3] = 'Lemon'; // тепер ["Apple", "Orange", "Pear", "Lemon"] ``` -Загальна кількість елементів масиву зберігається у його властивості `length`: +Загальна кількість елементів масиву зберігається у його властивості `length`: ```js run let fruits = ["Apple", "Orange", "Plum"];