diff --git a/1-js/4-data-structures/1-properties-and-methods/article.md b/1-js/4-data-structures/1-properties-and-methods/article.md index 7dae7e5a..21b8d568 100644 --- a/1-js/4-data-structures/1-properties-and-methods/article.md +++ b/1-js/4-data-structures/1-properties-and-methods/article.md @@ -1,4 +1,4 @@ -# Методы и свойства +# Введение в методы и свойства Все значения в JavaScript, за исключением `null` и `undefined`, содержат набор вспомогательных функций и значений, доступных "через точку". @@ -109,6 +109,10 @@ alert( 12..toFixed(1) ); // 12.0 [/warn] +## Итого +В этой главе мы познакомились с методами и свойствами. -Мы еще встретимся со [строками](/string) и [числами](/number) в последующих главах и глубже познакомимся с их свойствами и методами. \ No newline at end of file +Почти все значения в JavaScript, кроме разве что `null` и `undefined` имеют их и предоставляют через них разный функционал. + +Далее мы подробно разберём основные свойства и методы структур данных в JavaScript. \ No newline at end of file diff --git a/1-js/4-data-structures/1-string/1-ucfirst/_js.view/solution.js b/1-js/4-data-structures/1-string/1-ucfirst/_js.view/solution.js deleted file mode 100644 index 5f8c8226..00000000 --- a/1-js/4-data-structures/1-string/1-ucfirst/_js.view/solution.js +++ /dev/null @@ -1,9 +0,0 @@ -function ucFirst(str) { - var newStr = str.charAt(0).toUpperCase(); - - for(var i=1; i
  • Пустая строка и строка из пробельных символов преобразуются к `0`, поэтому считаются числами.
  • +
  • Если применить такую проверку не к строке, то могут быть сюрпризы, в частности `isNaN` посчитает числами значения `false, true, null`, так как они хотя и не числа, но преобразуются к ним.
  • + ```js //+ run -alert( parseInt('010') ) // в некоторых браузерах 8 +alert( isNaN(null) ); // false - не NaN, т.е. "число" +alert( isNaN("\n \n") ); // false - не NaN, т.е. "число" ``` -Если вы хотите быть уверенным, что число, начинающееся с нуля, будет интерпретировано верно -- используйте второй необязательный аргумент `parseInt` -- основание системы счисления: +Если такое поведение допустимо, то `isNaN` -- приемлемый вариант. -```js -//+ run -alert( parseInt('010', 10) ); // во всех браузерах 10 -``` - -[/warn] - -## Проверка на число для всех типов - -Если вам нужна действительно точная проверка на число, которая не считает числом строку из пробелов, логические и специальные значения -- используйте следующую функцию `isNumeric`: +Если же нужна действительно точная проверка на число, которая не считает числом строку из пробелов, логические и специальные значения, а также отсекает `Infinity` -- используйте следующую функцию `isNumeric`: ```js function isNumeric(n) { @@ -318,10 +306,12 @@ var n = 255; alert( n.toString(16) ); // ff ``` +В частности, это используют для работы с цветовыми значениями в браузере, вида `#AABBCC`. + Основание может быть любым от `2` до `36`. @@ -386,14 +376,14 @@ alert( 1.2 + 1.3 ^ 0); // 2, приоритет ^ меньше, чем + Это удобно в первую очередь тем, что легко читается и не заставляет ставить дополнительные скобки как `Math.floor(...)`: ```js -var x = a * b / c ^ 0; // читается так: "a*b/c *!*и округлить*/!*" +var x = a * b / c ^ 0; // читается как "a * b / c и округлить" ``` [/smart] ### Округление до заданной точности -Обычный трюк -- это умножить и поделить на 10 с нужным количеством нулей. Например, округлим `3.456` до 2го знака после запятой: +Для округления до нужной цифры после запятой можно умножить и поделить на 10 с нужным количеством нулей. Например, округлим `3.456` до 2го знака после запятой: ```js //+ run @@ -405,7 +395,7 @@ alert( Math.round( n * 100 ) / 100 ); // 3.456 -> 345.6 -> 346 -> 3.46 ### num.toFixed(precision) -Существует специальный метод `num.toFixed(precision)`, который округляет число `num` до точности `precision` и возвращает результат *в виде строки*: +Существует также специальный метод `num.toFixed(precision)`, который округляет число `num` до точности `precision` и возвращает результат *в виде строки*: ```js //+ run @@ -438,14 +428,14 @@ alert( +n.toFixed(5) ); // 12.34 ``` [warn header="Метод `toFixed` не эквивалентен `Math.round`!"] -Например, произведём округление до одного знака после запятой с использованием двух способов: +Например, произведём округление до одного знака после запятой с использованием двух способов: `toFixed` и `Math.round` с умножением и делением: ```js //+ run var price = 6.35; alert( price.toFixed(1) ); // 6.3 -alert( Math.round(price*10)/10 ); // 6.4 +alert( Math.round(price * 10) / 10 ); // 6.4 ``` Как видно, результат разный! Вариант округления через `Math.round` получился более корректным, так как по общепринятым правилам `5` округляется вверх. А `toFixed` может округлить его как вверх, так и вниз. Почему? Скоро узнаем! @@ -463,7 +453,7 @@ alert(0.1 + 0.2 == 0.3); Запустили? Если нет -- все же сделайте это. -Ок, вы запустили его. Результат несколько странный, не так ли? Возможно, ошибка в браузере? Поменяйте браузер, запустите еще раз. +Ок, вы запустили его. Он вывел `false`. Результат несколько странный, не так ли? Возможно, ошибка в браузере? Поменяйте браузер, запустите еще раз. Хорошо, теперь мы можем быть уверены: `0.1 + 0.2` это не `0.3`. Но тогда что же это? @@ -472,20 +462,25 @@ alert(0.1 + 0.2 == 0.3); alert(0.1 + 0.2); // 0.30000000000000004 ``` -Как видите, произошла небольшая вычислительная ошибка. +Как видите, произошла небольшая вычислительная ошибка, результат сложения `0.1 + 0.2` немного больше, чем `0.3`. -Дело в том, что в стандарте IEEE 754 на число выделяется ровно 8 байт(=64 бита), не больше и не меньше. +```js +//+ run +alert(0.1 + 0.2 > 0.3); // true +``` -Число `0.1 (=1/10)` короткое в десятичном формате, а в двоичной системе счисления это бесконечная дробь ([перевод десятичной дроби в двоичную систему](http://www.klgtu.ru/students/literature/inf_asu/1760.html)). Также бесконечной дробью является `0.2 (=2/10)`. +Всё дело в том, что в стандарте IEEE 754 на число выделяется ровно 8 байт(=64 бита), не больше и не меньше. -Двоичное значение бесконечных дробей хранится только до определенного знака, поэтому возникает неточность. Это даже можно увидеть: +Число `0.1 (одна десятая)` записывается просто в десятичном формате, а в двоичной системе счисления это бесконечная дробь ([перевод десятичной дроби в двоичную систему](http://www.klgtu.ru/students/literature/inf_asu/1760.html)). Также бесконечной дробью является `0.2 (=2/10)`. + +Двоичное значение бесконечных дробей хранится только до определенного знака, поэтому возникает неточность. Её даже можно увидеть: ```js //+ run alert( 0.1.toFixed(20) ); // 0.10000000000000000555 ``` -Когда мы складываем `0.1` и `0.2`, то две неточности складываются, получаем третью. +Когда мы складываем `0.1` и `0.2`, то две неточности складываются, получаем незначительную, но всё же ошибку в вычислениях. Конечно, это не означает, что точные вычисления для таких чисел невозможны. Они возможны. И даже необходимы. @@ -518,7 +513,7 @@ alert( +result.toFixed(10) ); // 0.3 ```js //+ run -alert(9999999999999999); +alert(9999999999999999); // выведет 10000000000000000 ``` Причина та же -- потеря точности. diff --git a/1-js/4-data-structures/3-object/objectLiteral.png b/1-js/4-data-structures/3-object/objectLiteral.png deleted file mode 100755 index fac01eb8..00000000 Binary files a/1-js/4-data-structures/3-object/objectLiteral.png and /dev/null differ diff --git a/1-js/4-data-structures/3-string/1-ucfirst/_js.view/solution.js b/1-js/4-data-structures/3-string/1-ucfirst/_js.view/solution.js new file mode 100644 index 00000000..9d8e469b --- /dev/null +++ b/1-js/4-data-structures/3-string/1-ucfirst/_js.view/solution.js @@ -0,0 +1,5 @@ +function ucFirst(str) { + if (!str) return str; + + return str[0].toUpperCase() + str.slice(1); +} diff --git a/1-js/4-data-structures/1-string/1-ucfirst/_js.view/test.js b/1-js/4-data-structures/3-string/1-ucfirst/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/1-string/1-ucfirst/_js.view/test.js rename to 1-js/4-data-structures/3-string/1-ucfirst/_js.view/test.js diff --git a/1-js/4-data-structures/3-string/1-ucfirst/solution.md b/1-js/4-data-structures/3-string/1-ucfirst/solution.md new file mode 100644 index 00000000..49062b64 --- /dev/null +++ b/1-js/4-data-structures/3-string/1-ucfirst/solution.md @@ -0,0 +1,27 @@ +Мы не можем просто заменить первый символ, т.к. строки в JavaScript неизменяемы. + +Но можно пересоздать строку на основе существующей, с заглавным первым символом: + +```js +var newStr = str[0].toUpperCase() + str.slice(1); +``` + +Однако, есть небольшая проблемка -- в случае, когда строка пуста, будет ошибка. + +Ведь `str[0] == undefined`, а у `undefined` нет метода `toUpperCase()`. + +Выхода два. Первый -- использовать `str.charAt(0)`, он всегда возвращает строку, для пустой строки -- пустую, но не `undefined`. Второй -- отдельно проверить на пустую строку, вот так: + +```js +//+ run +function ucFirst(str) { + // только пустая строка в логическом контексте даст false + if (!str) return str; + + return str[0].toUpperCase() + str.slice(1); +} + +alert( ucFirst("вася") ); +``` + +P.S. Возможны и более короткие решения, использующие методы для работы со строками, которые мы пройдём далее. \ No newline at end of file diff --git a/1-js/4-data-structures/1-string/1-ucfirst/task.md b/1-js/4-data-structures/3-string/1-ucfirst/task.md similarity index 100% rename from 1-js/4-data-structures/1-string/1-ucfirst/task.md rename to 1-js/4-data-structures/3-string/1-ucfirst/task.md diff --git a/1-js/4-data-structures/1-string/2-check-spam/_js.view/solution.js b/1-js/4-data-structures/3-string/2-check-spam/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/1-string/2-check-spam/_js.view/solution.js rename to 1-js/4-data-structures/3-string/2-check-spam/_js.view/solution.js diff --git a/1-js/4-data-structures/1-string/2-check-spam/_js.view/test.js b/1-js/4-data-structures/3-string/2-check-spam/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/1-string/2-check-spam/_js.view/test.js rename to 1-js/4-data-structures/3-string/2-check-spam/_js.view/test.js diff --git a/1-js/4-data-structures/1-string/2-check-spam/solution.md b/1-js/4-data-structures/3-string/2-check-spam/solution.md similarity index 100% rename from 1-js/4-data-structures/1-string/2-check-spam/solution.md rename to 1-js/4-data-structures/3-string/2-check-spam/solution.md diff --git a/1-js/4-data-structures/1-string/2-check-spam/task.md b/1-js/4-data-structures/3-string/2-check-spam/task.md similarity index 100% rename from 1-js/4-data-structures/1-string/2-check-spam/task.md rename to 1-js/4-data-structures/3-string/2-check-spam/task.md diff --git a/1-js/4-data-structures/1-string/3-truncate/_js.view/solution.js b/1-js/4-data-structures/3-string/3-truncate/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/1-string/3-truncate/_js.view/solution.js rename to 1-js/4-data-structures/3-string/3-truncate/_js.view/solution.js diff --git a/1-js/4-data-structures/1-string/3-truncate/_js.view/test.js b/1-js/4-data-structures/3-string/3-truncate/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/1-string/3-truncate/_js.view/test.js rename to 1-js/4-data-structures/3-string/3-truncate/_js.view/test.js diff --git a/1-js/4-data-structures/1-string/3-truncate/solution.md b/1-js/4-data-structures/3-string/3-truncate/solution.md similarity index 100% rename from 1-js/4-data-structures/1-string/3-truncate/solution.md rename to 1-js/4-data-structures/3-string/3-truncate/solution.md diff --git a/1-js/4-data-structures/1-string/3-truncate/task.md b/1-js/4-data-structures/3-string/3-truncate/task.md similarity index 100% rename from 1-js/4-data-structures/1-string/3-truncate/task.md rename to 1-js/4-data-structures/3-string/3-truncate/task.md diff --git a/1-js/4-data-structures/1-string/article.md b/1-js/4-data-structures/3-string/article.md similarity index 91% rename from 1-js/4-data-structures/1-string/article.md rename to 1-js/4-data-structures/3-string/article.md index 2309ba44..c9da01eb 100644 --- a/1-js/4-data-structures/1-string/article.md +++ b/1-js/4-data-structures/3-string/article.md @@ -16,11 +16,11 @@ var anotherText = 'еще строка'; var str = "012345"; ``` -В JavaScript **нет разницы между двойными и одинарными кавычками**. +В JavaScript нет разницы между двойными и одинарными кавычками. ### Специальные символы -Строки могут содержать специальные символы. Самый часто используемый из таких символов -- это *перевод строки*. +Строки могут содержать специальные символы. Самый часто используемый из таких символов -- это "перевод строки". Он обозначается как `\n`, например: @@ -56,10 +56,10 @@ var str = '*!*I\'m*/!* a JavaScript programmer'; ```js //+ run var str = "I'm a JavaScript \"programmer\" "; -alert(str); +alert(str); // I'm a JavaScript "programmer" ``` -Экранирование служит исключительно для правильного восприятия строки JavaScript. **В памяти строка будет содержать сам символ без `'\'`**. Вы можете увидеть это, запустив пример выше. +Экранирование служит исключительно для правильного восприятия строки JavaScript. В памяти строка будет содержать сам символ без `'\'`. Вы можете увидеть это, запустив пример выше. Сам символ обратного слэша `'\'` является служебным, поэтому всегда экранируется, т.е пишется как `\\`: @@ -106,8 +106,7 @@ alert( str.charAt(0) ); // "j" В JavaScript **нет отдельного типа "символ"**, так что `charAt` возвращает строку, состоящую из выбранного символа. -[smart] -В современных браузерах (не IE7-) для доступа к символу можно также использовать квадратные скобки: +Также (кроме IE7-) для доступа к символу можно также использовать квадратные скобки: ```js //+ run @@ -123,7 +122,7 @@ alert( "".charAt(0) ); // пустая строка alert( ""[0] ); // undefined, IE8+ ``` -[/smart] +Вообще же метод `charAt` существует по историческим причинам, ведь квадратные скобки -- проще и короче. [warn header="Вызов метода -- всегда со скобками"] @@ -144,7 +143,7 @@ alert( ""[0] ); // undefined, IE8+ //+ run var str = "строка"; -str = str.charAt(3) + str.charAt(4) + str.charAt(5); +str = str[3] + str[4] + str[5]; alert(str); // ока ``` @@ -161,7 +160,7 @@ alert( "Интерфейс".toUpperCase() ); // ИНТЕРФЕЙС Пример ниже получает первый символ и приводит его к нижнему регистру: ```js -alert( "Интерфейс".charAt(0).toLowerCase() ); // 'и' +alert( "Интерфейс"[0].toLowerCase() ); // 'и' ``` ### Поиск подстроки @@ -348,14 +347,7 @@ alert( "testme".slice(1, -1) ); // "estm", от 1 позиции до перво Отрицательное значение первого параметра поддерживается в `substr` во всех браузерах, кроме IE8-. -[summary] -Самый удобный метод из списка -- это `slice(start, end)`. Очень забавно, что не `substr`, не `substring`, а именно метод `slice`, название которого наименее очевидно. - -Впрочем, `substr(start, length)` тоже можно использовать, но с оглядкой на IE8-, который не поддерживает отрицательный `start`. -[/summary] - - - +Если выбирать из этих трёх метод один, для использования в большинстве ситуаций -- то это будет `slice`: он и отрицательные аргументы поддерживает и работает наиболее очевидно. ## Кодировка Юникод @@ -478,9 +470,9 @@ alert( "ö" > "z" ); // true Сравнение строк `s1` и `s2` обрабатывается по следующему алгоритму: -
    1. Сравниваются первые символы: `a = s1.charAt(0)` и `b = s2.charAt(0)`. Если они разные, то сравниваем их и, в зависимости от результата их сравнения, возвратить `true` или `false`. Если же они одинаковые, то...
    2. -
    3. Сравниваются вторые символы `a = s1.charAt(1)` и `b = s2.charAt(1)`
    4. -
    5. Затем третьи `a = s1.charAt(2)` и `b = s2.charAt(2)` и так далее, пока символы не будут наконец разными, и тогда какой символ больше -- та строка и больше. Если же в какой-либо строке закончились символы, то считаем, что она меньше, а если закончились в обеих -- они равны.
    6. +
      1. Сравниваются первые символы: `s1[0]` и `s2[0]`. Если они разные, то сравниваем их и, в зависимости от результата их сравнения, возвратить `true` или `false`. Если же они одинаковые, то...
      2. +
      3. Сравниваются вторые символы `s1[1]` и `s2[1]`
      4. +
      5. Затем третьи `s1[2]` и `s2[2]` и так далее, пока символы не будут наконец разными, и тогда какой символ больше -- та строка и больше. Если же в какой-либо строке закончились символы, то считаем, что она меньше, а если закончились в обеих -- они равны.
      Спецификация языка определяет этот алгоритм более детально. Если же говорить простыми словами, смысл алгоритма в точности соответствует порядку, по которому имена заносятся в орфографический словарь. diff --git a/1-js/4-data-structures/3-object/1-hello-object/solution.md b/1-js/4-data-structures/4-object/1-hello-object/solution.md similarity index 100% rename from 1-js/4-data-structures/3-object/1-hello-object/solution.md rename to 1-js/4-data-structures/4-object/1-hello-object/solution.md diff --git a/1-js/4-data-structures/3-object/1-hello-object/task.md b/1-js/4-data-structures/4-object/1-hello-object/task.md similarity index 100% rename from 1-js/4-data-structures/3-object/1-hello-object/task.md rename to 1-js/4-data-structures/4-object/1-hello-object/task.md diff --git a/1-js/4-data-structures/3-object/article.md b/1-js/4-data-structures/4-object/article.md similarity index 88% rename from 1-js/4-data-structures/3-object/article.md rename to 1-js/4-data-structures/4-object/article.md index 568ecdf4..23feca35 100644 --- a/1-js/4-data-structures/3-object/article.md +++ b/1-js/4-data-structures/4-object/article.md @@ -1,6 +1,6 @@ # Объекты как ассоциативные массивы -Объекты в JavaScript являются "двуличными". Они сочетают в себе два важных функционала. +Объекты в JavaScript сочетают в себе два важных функционала. Первый -- это ассоциативный массив: структура, пригодная для хранения любых данных. В этой главе мы рассмотрим использование объектов именно как массивов. @@ -13,13 +13,15 @@ Её можно легко представить как шкаф с подписанными ящиками. Все данные хранятся в ящичках. По имени можно легко найти ящик и взять то значение, которое в нём лежит. + + В отличие от реальных шкафов, в ассоциативный массив можно в любой момент добавить новые именованные "ящики" или удалить существующие. Далее мы увидим примеры, как это делается. Кстати, в других языках программирования такую структуру данных также называют *"словарь"* и *"хэш"*. ## Создание объектов -Пустой объект (*"пустой шкаф"*) может быть создан одним из двух синтаксисов: +Пустой объект ("пустой шкаф") может быть создан одним из двух синтаксисов: ```js 1. o = new Object(); @@ -38,47 +40,52 @@ var person = {}; // пока пустой ``` -Основные операции с объектами -- это: -
        -
      1. **Присвоение свойства по ключу.**
      2. -
      3. **Чтение свойства по ключу.**
      4. -
      5. **Удаление свойства по ключу.**
      6. -
      + -Для обращения к свойствам используется запись "через точку", вида `объект.свойство`: + +Основные операции с объектами -- это создание, получение и удаление свойств. + +Для обращения к свойствам используется запись "через точку", вида `объект.свойство`, например: ```js -//+ run -var person = {}; - -// *!*1. присвоение*/!* // при присвоении свойства в объекте автоматически создаётся "ящик" // с именем "name" и в него записывается содержимое 'Вася' person.name = 'Вася'; person.age = 25; // запишем ещё одно свойство: с именем 'age' и значением 25 - -// *!*2. чтение*/!* -alert(person.name + ': ' + person.age); // вывести значения - -// *!*3. удаление*/!* -delete person.name; // удалить "ящик" с именем "name" вместе со значением в нём ``` + + +Значения хранятся "внутри" ящиков. Обратим внимание -- любые значения, любых типов: число, строка -- не важно. + +Чтобы прочитать их -- также обратимся через точку: +```js +alert(person.name + ': ' + person.age); // "Вася: 25" +``` + +Удаление осуществляется оператором `delete`: + +```js +delete person.age; +``` + +Осталось только свойство `name`: + + + Следующая операция:
      1. **Проверка существования свойства с определенным ключом.**
      -Например, есть объект `person`, и нужно проверить, существует ли в нем свойство `age`. +Для проверки существования свойства в объекте есть оператор `in`. -Для проверки существования есть оператор `in`. Его синтаксис: `"prop" in obj`, причем имя свойства -- в виде строки, например: +Его синтаксис: `"prop" in obj`, причем имя свойства -- в виде строки, например: ```js -var person = { }; - -if (*!*"age" in person*/!*) { - alert("Свойство age существует!"); +if ("name" in person) { + alert("Свойство name существует!"); } ``` @@ -192,11 +199,7 @@ alert( person[key] ); // выведет person['age'] Объект можно заполнить значениями при создании, указав их в фигурных скобках: `{ ключ1: значение1, ключ2: значение2, ... }`. -Такой синтаксис называется *литеральным* (оригинал - *literal*), например: - - - -Следующие два фрагмента кода создают одинаковый объект: +Такой синтаксис называется *литеральным* (оригинал - *literal*), cледующие два фрагмента кода создают одинаковый объект: ```js var menuSetup = { @@ -213,7 +216,7 @@ menuSetup.height = 200; menuSetup.title = 'Menu'; ``` -**Названия свойств можно перечислять в кавычках или без, если они удовлетворяют ограничениям для имён переменных.** +Названия свойств можно перечислять как в кавычках, так и без, если они удовлетворяют ограничениям для имён переменных. Например: @@ -225,7 +228,7 @@ var menuSetup = { }; ``` -**Значение у свойства может быть любое, в том числе и другой объект, который можно указать тут же:** +В качестве значения можно тут же указать и другой объект: ```js var user = { diff --git a/1-js/4-data-structures/4-object/object-person-1.svg b/1-js/4-data-structures/4-object/object-person-1.svg new file mode 100644 index 00000000..5cc157cc --- /dev/null +++ b/1-js/4-data-structures/4-object/object-person-1.svg @@ -0,0 +1,28 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + + name + + + age + + + \ No newline at end of file diff --git a/1-js/4-data-structures/4-object/object-person-2.svg b/1-js/4-data-structures/4-object/object-person-2.svg new file mode 100644 index 00000000..fd0e20a0 --- /dev/null +++ b/1-js/4-data-structures/4-object/object-person-2.svg @@ -0,0 +1,22 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + name + + + \ No newline at end of file diff --git a/1-js/4-data-structures/4-object/object-person-empty.svg b/1-js/4-data-structures/4-object/object-person-empty.svg new file mode 100644 index 00000000..6953b96c --- /dev/null +++ b/1-js/4-data-structures/4-object/object-person-empty.svg @@ -0,0 +1,27 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + пусто + + + person + + + \ No newline at end of file diff --git a/1-js/4-data-structures/4-object/object.svg b/1-js/4-data-structures/4-object/object.svg new file mode 100644 index 00000000..3ef58134 --- /dev/null +++ b/1-js/4-data-structures/4-object/object.svg @@ -0,0 +1,35 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + ключ1 + + + ключ2 + + + ключ3 + + + \ No newline at end of file diff --git a/1-js/4-data-structures/4-object-for-in/1-is-empty/_js.view/solution.js b/1-js/4-data-structures/5-object-for-in/1-is-empty/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/1-is-empty/_js.view/solution.js rename to 1-js/4-data-structures/5-object-for-in/1-is-empty/_js.view/solution.js diff --git a/1-js/4-data-structures/4-object-for-in/1-is-empty/_js.view/test.js b/1-js/4-data-structures/5-object-for-in/1-is-empty/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/1-is-empty/_js.view/test.js rename to 1-js/4-data-structures/5-object-for-in/1-is-empty/_js.view/test.js diff --git a/1-js/4-data-structures/4-object-for-in/1-is-empty/solution.md b/1-js/4-data-structures/5-object-for-in/1-is-empty/solution.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/1-is-empty/solution.md rename to 1-js/4-data-structures/5-object-for-in/1-is-empty/solution.md diff --git a/1-js/4-data-structures/4-object-for-in/1-is-empty/task.md b/1-js/4-data-structures/5-object-for-in/1-is-empty/task.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/1-is-empty/task.md rename to 1-js/4-data-structures/5-object-for-in/1-is-empty/task.md diff --git a/1-js/4-data-structures/4-object-for-in/2-sum-salaries/solution.md b/1-js/4-data-structures/5-object-for-in/2-sum-salaries/solution.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/2-sum-salaries/solution.md rename to 1-js/4-data-structures/5-object-for-in/2-sum-salaries/solution.md diff --git a/1-js/4-data-structures/4-object-for-in/2-sum-salaries/task.md b/1-js/4-data-structures/5-object-for-in/2-sum-salaries/task.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/2-sum-salaries/task.md rename to 1-js/4-data-structures/5-object-for-in/2-sum-salaries/task.md diff --git a/1-js/4-data-structures/4-object-for-in/3-max-salary/solution.md b/1-js/4-data-structures/5-object-for-in/3-max-salary/solution.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/3-max-salary/solution.md rename to 1-js/4-data-structures/5-object-for-in/3-max-salary/solution.md diff --git a/1-js/4-data-structures/4-object-for-in/3-max-salary/task.md b/1-js/4-data-structures/5-object-for-in/3-max-salary/task.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/3-max-salary/task.md rename to 1-js/4-data-structures/5-object-for-in/3-max-salary/task.md diff --git a/1-js/4-data-structures/4-object-for-in/4-multiply-numeric/_js.view/solution.js b/1-js/4-data-structures/5-object-for-in/4-multiply-numeric/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/4-multiply-numeric/_js.view/solution.js rename to 1-js/4-data-structures/5-object-for-in/4-multiply-numeric/_js.view/solution.js diff --git a/1-js/4-data-structures/4-object-for-in/4-multiply-numeric/_js.view/source.js b/1-js/4-data-structures/5-object-for-in/4-multiply-numeric/_js.view/source.js similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/4-multiply-numeric/_js.view/source.js rename to 1-js/4-data-structures/5-object-for-in/4-multiply-numeric/_js.view/source.js diff --git a/1-js/4-data-structures/4-object-for-in/4-multiply-numeric/_js.view/test.js b/1-js/4-data-structures/5-object-for-in/4-multiply-numeric/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/4-multiply-numeric/_js.view/test.js rename to 1-js/4-data-structures/5-object-for-in/4-multiply-numeric/_js.view/test.js diff --git a/1-js/4-data-structures/4-object-for-in/4-multiply-numeric/solution.md b/1-js/4-data-structures/5-object-for-in/4-multiply-numeric/solution.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/4-multiply-numeric/solution.md rename to 1-js/4-data-structures/5-object-for-in/4-multiply-numeric/solution.md diff --git a/1-js/4-data-structures/4-object-for-in/4-multiply-numeric/task.md b/1-js/4-data-structures/5-object-for-in/4-multiply-numeric/task.md similarity index 100% rename from 1-js/4-data-structures/4-object-for-in/4-multiply-numeric/task.md rename to 1-js/4-data-structures/5-object-for-in/4-multiply-numeric/task.md diff --git a/1-js/4-data-structures/4-object-for-in/article.md b/1-js/4-data-structures/5-object-for-in/article.md similarity index 90% rename from 1-js/4-data-structures/4-object-for-in/article.md rename to 1-js/4-data-structures/5-object-for-in/article.md index 75940780..bac15db6 100644 --- a/1-js/4-data-structures/4-object-for-in/article.md +++ b/1-js/4-data-structures/5-object-for-in/article.md @@ -1,6 +1,6 @@ # Объекты: перебор свойств -Для перебора всех свойств из объекта используется цикл по свойствам `for..in`. Это специальная синтаксическая конструкция, которая работает не так, как обычный цикл. +Для перебора всех свойств из объекта используется цикл по свойствам `for..in`. Эта синтаксическая конструкция отличается от рассмотренного ранее цикла `for(;;)`. [cut] @@ -14,11 +14,10 @@ for (key in obj) { } ``` -При этом в `key` будут последовательно записаны имена свойств. Конечно, вместо `key` может быть любое другое имя переменной. - +При этом `for..in` последовательно переберёт свойства объекта `obj`, имя каждого свойства будет записано в `key` и вызвано тело цикла. [smart header="Объявление переменной в цикле `for (var key in obj)`"] -Переменную можно объявить прямо в цикле: +Вспомогательную переменную `key` можно объявить прямо в цикле: ```js for (*!*var key*/!* in menu) { @@ -26,11 +25,10 @@ for (*!*var key*/!* in menu) { } ``` -Так иногда пишут для краткости кода. +Так иногда пишут для краткости кода. Можно использовать и любое другое название, кроме `key`, например `for(var propName in menu)`. [/smart] - -Например: +Пример итерации по свойствам: ```js //+ run diff --git a/1-js/4-data-structures/5-object-reference/box-message-hello.png b/1-js/4-data-structures/5-object-reference/box-message-hello.png deleted file mode 100755 index 1a0a7efa..00000000 Binary files a/1-js/4-data-structures/5-object-reference/box-message-hello.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/message_box_hello.png b/1-js/4-data-structures/5-object-reference/message_box_hello.png deleted file mode 100755 index 44e39e66..00000000 Binary files a/1-js/4-data-structures/5-object-reference/message_box_hello.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/object-reference-console.png b/1-js/4-data-structures/5-object-reference/object-reference-console.png deleted file mode 100644 index 864f1f94..00000000 Binary files a/1-js/4-data-structures/5-object-reference/object-reference-console.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/phrase_box_hello.png b/1-js/4-data-structures/5-object-reference/phrase_box_hello.png deleted file mode 100755 index cd963668..00000000 Binary files a/1-js/4-data-structures/5-object-reference/phrase_box_hello.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/referenceUser.png b/1-js/4-data-structures/5-object-reference/referenceUser.png deleted file mode 100755 index 8884c2cd..00000000 Binary files a/1-js/4-data-structures/5-object-reference/referenceUser.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/referenceUser@2x.png b/1-js/4-data-structures/5-object-reference/referenceUser@2x.png deleted file mode 100755 index 74768628..00000000 Binary files a/1-js/4-data-structures/5-object-reference/referenceUser@2x.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/referenceUserAdmin.png b/1-js/4-data-structures/5-object-reference/referenceUserAdmin.png deleted file mode 100755 index 24910f93..00000000 Binary files a/1-js/4-data-structures/5-object-reference/referenceUserAdmin.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/referenceUserAdmin@2x.png b/1-js/4-data-structures/5-object-reference/referenceUserAdmin@2x.png deleted file mode 100755 index 3ffccfe6..00000000 Binary files a/1-js/4-data-structures/5-object-reference/referenceUserAdmin@2x.png and /dev/null differ diff --git a/1-js/4-data-structures/6-array/pop.png b/1-js/4-data-structures/6-array/pop.png deleted file mode 100755 index 80551a8c..00000000 Binary files a/1-js/4-data-structures/6-array/pop.png and /dev/null differ diff --git a/1-js/4-data-structures/6-array/shift.png b/1-js/4-data-structures/6-array/shift.png deleted file mode 100755 index 6c412948..00000000 Binary files a/1-js/4-data-structures/6-array/shift.png and /dev/null differ diff --git a/1-js/4-data-structures/6-array/shiftpush.png b/1-js/4-data-structures/6-array/shiftpush.png deleted file mode 100755 index 568b1b77..00000000 Binary files a/1-js/4-data-structures/6-array/shiftpush.png and /dev/null differ diff --git a/1-js/4-data-structures/5-object-reference/article.md b/1-js/4-data-structures/6-object-reference/article.md similarity index 70% rename from 1-js/4-data-structures/5-object-reference/article.md rename to 1-js/4-data-structures/6-object-reference/article.md index 7247f6d7..dc57f794 100644 --- a/1-js/4-data-structures/5-object-reference/article.md +++ b/1-js/4-data-structures/6-object-reference/article.md @@ -1,6 +1,6 @@ # Объекты: передача по ссылке -Фундаментальным отличием объектов от примитивов, является их копирование "по ссылке". +Фундаментальным отличием объектов от примитивов, является их хранение и копирование "по ссылке". [cut] @@ -15,7 +15,7 @@ var phrase = message; В результате такого копирования получились две полностью независимые переменные, в каждой из которых хранится значение `"Привет"`. - + ## Копирование по ссылке @@ -23,23 +23,15 @@ var phrase = message; **В переменной, которой присвоен объект, хранится не сам объект, а "адрес его места в памяти", иными словами -- "ссылка" на него.** -Например, обычную переменную можно изобразить как коробку с данными: - -```js -var message = "Привет"; // значение в переменной -``` - - - -А вот как выглядит переменная, которой присвоен объект: +Вот как выглядит переменная, которой присвоен объект: ```js var user = { name: "Вася" }; ``` - + -Внимание: объект -- вне переменной. В переменной -- лишь ссылка на него. +Внимание: объект -- вне переменной. В переменной -- лишь "адрес" (ссылка) для него. **При копировании переменной с объектом -- копируется эта ссылка, а объект по-прежнему остается в единственном экземпляре.** @@ -53,7 +45,7 @@ var admin = user; // скопировали ссылку Получили две переменные, в которых находятся ссылки на один и тот же объект: - + **Так как объект всего один, то изменения через любую переменную видны в других переменных:** @@ -71,12 +63,12 @@ alert(*!*user.name*/!*); // 'Петя', изменения видны в user [smart header="Переменная с объектом как \"ключ\" к сейфу с данными"] Ещё одна аналогия: переменная, в которую присвоен объект, на самом деле хранит не сами данные, а ключ к сейфу, где они хранятся. -При копировании её, получается что мы сделали копию ключа, но сейф по-прежнему один. По какому бы ключу мы не залезли в сейф, данные -- одни и те же. +При копировании её, получается что мы сделали копию ключа, но сейф по-прежнему один. [/smart] ## Клонирование объектов -Иногда, на практике -- очень редко, нужно скопировать объект целиком, создать именно полную копию, "независимый клон". +Иногда, на практике -- очень редко, нужно скопировать объект целиком, создать именно полную независимую копию, "клон" объекта. Что ж, можно сделать и это. Для этого нужно пройти по объекту, достать данные и скопировать на уровне примитивов. @@ -98,15 +90,15 @@ for(var key in user) { } */!* -// теперь clone -- полностью независимая копия +// теперь clone - полностью независимая копия clone.name = "Петя"; // поменяли данные в clone alert(user.name); // по-прежнем "Вася" ``` -В этом коде не учитывается, что свойства объектов, в свою очередь, могут хранить ссылки на другие объекты. Можно обойти такие подобъекты и тоже склонировать их. +В этом коде каждое свойство объекта `user` копируется в `clone`. Если предположить, что они примитивны, то каждое скопируется по значению и мы как раз получим полный клон. -Это называют "глубоким" клонированием. Для того, чтобы это сделать, нужно рекурсивно обойти объект вместе с подобъектами. +Если же свойства объектов, в свою очередь, могут хранить ссылки на другие объекты, то нужно обойти такие подобъекты и тоже склонировать их. Это называют "глубоким" клонированием. ## Вывод в консоли @@ -134,21 +126,21 @@ console.log(time); time.microsecond++; ``` -Как видно, некий объект выводится `(*)`, затем он меняется `(**)` и снова выводится, и так несколько раз. Пока ничего необычного, типичная ситуация -- скрипт делает какую-то работу с объектом и выводит в консоли то, как она продвигается. +Как видно, в нём некий объект выводится строкой `(*)`, затем он меняется в строке `(**)` и снова выводится, и так несколько раз. Пока ничего необычного, типичная ситуация -- скрипт делает какую-то работу с объектом и выводит в консоли то, как она продвигается. Необычное -- в другом! -При раскрытии каждый объект будет выглядеть примерно так (в Chrome): +При раскрытии каждый объект будет выглядеть примерно так (скриншот из Chrome): **Судя по выводу, свойство `microsecond` всегда было равно `123459`... Или нет?** -Конечно, нет! Консоль нас просто дурит. +Если посмотреть на код выше то, очевидно, нет! Это свойство меняется, а консоль нас просто дурит. **При "раскрытии" свойств объекта в консоли -- браузер всегда выводит их текущие (на момент раскрытия) значения.** -Так происходит именно потому, что вывод не делает "копию" текущего содержимого, а сохраняет лишь ссылку на объект. В будущем, при отладке скриптов у вас не раз возникнет подобная ситуация :) +Так происходит именно потому, что вывод не делает "копию" текущего содержимого, а сохраняет лишь ссылку на объект. Запомните эту особенность консоли, в будущем, при отладке скриптов у вас не раз возникнет подобная ситуация. ## Итого diff --git a/1-js/4-data-structures/5-object-reference/object-reference-console@2x.png b/1-js/4-data-structures/6-object-reference/object-reference-console@2x.png similarity index 100% rename from 1-js/4-data-structures/5-object-reference/object-reference-console@2x.png rename to 1-js/4-data-structures/6-object-reference/object-reference-console@2x.png diff --git a/1-js/4-data-structures/6-object-reference/variable-contains-reference.svg b/1-js/4-data-structures/6-object-reference/variable-contains-reference.svg new file mode 100644 index 00000000..6040266d --- /dev/null +++ b/1-js/4-data-structures/6-object-reference/variable-contains-reference.svg @@ -0,0 +1,47 @@ + + + + Slice 2 + Created with Sketch. + + + + + + + + + + + + + + + + + user + + + + + + + + + + + + + + name + + + + + + + + + + + \ No newline at end of file diff --git a/1-js/4-data-structures/6-object-reference/variable-copy-reference.svg b/1-js/4-data-structures/6-object-reference/variable-copy-reference.svg new file mode 100644 index 00000000..08c40a76 --- /dev/null +++ b/1-js/4-data-structures/6-object-reference/variable-copy-reference.svg @@ -0,0 +1,72 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + + user + + + + + + + + + + + + + + name + + + + + + + + + + + + + + + + + + + + + + + + admin + + + + + + + + + + + + \ No newline at end of file diff --git a/1-js/4-data-structures/6-object-reference/variable-copy-value.svg b/1-js/4-data-structures/6-object-reference/variable-copy-value.svg new file mode 100644 index 00000000..2aa5ef07 --- /dev/null +++ b/1-js/4-data-structures/6-object-reference/variable-copy-value.svg @@ -0,0 +1,49 @@ + + + + Diagrams + Created with Sketch. + + + + + + + + + + + + "Привет" + + + + + + + + message + + + + + + + + + + + + "Привет" + + + + + + + + phrase + + + + \ No newline at end of file diff --git a/1-js/4-data-structures/7-array-methods/9-output-single-linked-list/linkedlist.png b/1-js/4-data-structures/7-array-methods/9-output-single-linked-list/linkedlist.png deleted file mode 100755 index 20788957..00000000 Binary files a/1-js/4-data-structures/7-array-methods/9-output-single-linked-list/linkedlist.png and /dev/null differ diff --git a/1-js/4-data-structures/6-array/1-get-last-in-array/solution.md b/1-js/4-data-structures/7-array/1-get-last-in-array/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/1-get-last-in-array/solution.md rename to 1-js/4-data-structures/7-array/1-get-last-in-array/solution.md diff --git a/1-js/4-data-structures/6-array/1-get-last-in-array/task.md b/1-js/4-data-structures/7-array/1-get-last-in-array/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/1-get-last-in-array/task.md rename to 1-js/4-data-structures/7-array/1-get-last-in-array/task.md diff --git a/1-js/4-data-structures/6-array/10-maximal-subarray/_js.view/solution.js b/1-js/4-data-structures/7-array/10-maximal-subarray/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/6-array/10-maximal-subarray/_js.view/solution.js rename to 1-js/4-data-structures/7-array/10-maximal-subarray/_js.view/solution.js diff --git a/1-js/4-data-structures/6-array/10-maximal-subarray/_js.view/test.js b/1-js/4-data-structures/7-array/10-maximal-subarray/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/6-array/10-maximal-subarray/_js.view/test.js rename to 1-js/4-data-structures/7-array/10-maximal-subarray/_js.view/test.js diff --git a/1-js/4-data-structures/6-array/10-maximal-subarray/solution.md b/1-js/4-data-structures/7-array/10-maximal-subarray/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/10-maximal-subarray/solution.md rename to 1-js/4-data-structures/7-array/10-maximal-subarray/solution.md diff --git a/1-js/4-data-structures/6-array/10-maximal-subarray/task.md b/1-js/4-data-structures/7-array/10-maximal-subarray/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/10-maximal-subarray/task.md rename to 1-js/4-data-structures/7-array/10-maximal-subarray/task.md diff --git a/1-js/4-data-structures/6-array/2-add-item-to-array/solution.md b/1-js/4-data-structures/7-array/2-add-item-to-array/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/2-add-item-to-array/solution.md rename to 1-js/4-data-structures/7-array/2-add-item-to-array/solution.md diff --git a/1-js/4-data-structures/6-array/2-add-item-to-array/task.md b/1-js/4-data-structures/7-array/2-add-item-to-array/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/2-add-item-to-array/task.md rename to 1-js/4-data-structures/7-array/2-add-item-to-array/task.md diff --git a/1-js/4-data-structures/6-array/3-create-array/solution.md b/1-js/4-data-structures/7-array/3-create-array/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/3-create-array/solution.md rename to 1-js/4-data-structures/7-array/3-create-array/solution.md diff --git a/1-js/4-data-structures/6-array/3-create-array/task.md b/1-js/4-data-structures/7-array/3-create-array/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/3-create-array/task.md rename to 1-js/4-data-structures/7-array/3-create-array/task.md diff --git a/1-js/4-data-structures/6-array/4-random-from-array/solution.md b/1-js/4-data-structures/7-array/4-random-from-array/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/4-random-from-array/solution.md rename to 1-js/4-data-structures/7-array/4-random-from-array/solution.md diff --git a/1-js/4-data-structures/6-array/4-random-from-array/task.md b/1-js/4-data-structures/7-array/4-random-from-array/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/4-random-from-array/task.md rename to 1-js/4-data-structures/7-array/4-random-from-array/task.md diff --git a/1-js/4-data-structures/6-array/5-calculator-for-input/solution.md b/1-js/4-data-structures/7-array/5-calculator-for-input/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/5-calculator-for-input/solution.md rename to 1-js/4-data-structures/7-array/5-calculator-for-input/solution.md diff --git a/1-js/4-data-structures/6-array/5-calculator-for-input/task.md b/1-js/4-data-structures/7-array/5-calculator-for-input/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/5-calculator-for-input/task.md rename to 1-js/4-data-structures/7-array/5-calculator-for-input/task.md diff --git a/1-js/4-data-structures/6-array/6-item-value/solution.md b/1-js/4-data-structures/7-array/6-item-value/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/6-item-value/solution.md rename to 1-js/4-data-structures/7-array/6-item-value/solution.md diff --git a/1-js/4-data-structures/6-array/6-item-value/task.md b/1-js/4-data-structures/7-array/6-item-value/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/6-item-value/task.md rename to 1-js/4-data-structures/7-array/6-item-value/task.md diff --git a/1-js/4-data-structures/6-array/7-array-find/_js.view/solution.js b/1-js/4-data-structures/7-array/7-array-find/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/6-array/7-array-find/_js.view/solution.js rename to 1-js/4-data-structures/7-array/7-array-find/_js.view/solution.js diff --git a/1-js/4-data-structures/6-array/7-array-find/_js.view/test.js b/1-js/4-data-structures/7-array/7-array-find/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/6-array/7-array-find/_js.view/test.js rename to 1-js/4-data-structures/7-array/7-array-find/_js.view/test.js diff --git a/1-js/4-data-structures/6-array/7-array-find/solution.md b/1-js/4-data-structures/7-array/7-array-find/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/7-array-find/solution.md rename to 1-js/4-data-structures/7-array/7-array-find/solution.md diff --git a/1-js/4-data-structures/6-array/7-array-find/task.md b/1-js/4-data-structures/7-array/7-array-find/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/7-array-find/task.md rename to 1-js/4-data-structures/7-array/7-array-find/task.md diff --git a/1-js/4-data-structures/6-array/8-filter-range/_js.view/solution.js b/1-js/4-data-structures/7-array/8-filter-range/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/6-array/8-filter-range/_js.view/solution.js rename to 1-js/4-data-structures/7-array/8-filter-range/_js.view/solution.js diff --git a/1-js/4-data-structures/6-array/8-filter-range/_js.view/test.js b/1-js/4-data-structures/7-array/8-filter-range/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/6-array/8-filter-range/_js.view/test.js rename to 1-js/4-data-structures/7-array/8-filter-range/_js.view/test.js diff --git a/1-js/4-data-structures/6-array/8-filter-range/solution.md b/1-js/4-data-structures/7-array/8-filter-range/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/8-filter-range/solution.md rename to 1-js/4-data-structures/7-array/8-filter-range/solution.md diff --git a/1-js/4-data-structures/6-array/8-filter-range/task.md b/1-js/4-data-structures/7-array/8-filter-range/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/8-filter-range/task.md rename to 1-js/4-data-structures/7-array/8-filter-range/task.md diff --git a/1-js/4-data-structures/6-array/9-eratosthenes-sieve/solution.md b/1-js/4-data-structures/7-array/9-eratosthenes-sieve/solution.md similarity index 100% rename from 1-js/4-data-structures/6-array/9-eratosthenes-sieve/solution.md rename to 1-js/4-data-structures/7-array/9-eratosthenes-sieve/solution.md diff --git a/1-js/4-data-structures/6-array/9-eratosthenes-sieve/task.md b/1-js/4-data-structures/7-array/9-eratosthenes-sieve/task.md similarity index 100% rename from 1-js/4-data-structures/6-array/9-eratosthenes-sieve/task.md rename to 1-js/4-data-structures/7-array/9-eratosthenes-sieve/task.md diff --git a/1-js/4-data-structures/7-array/array-pop.svg b/1-js/4-data-structures/7-array/array-pop.svg new file mode 100644 index 00000000..99e96810 --- /dev/null +++ b/1-js/4-data-structures/7-array/array-pop.svg @@ -0,0 +1,68 @@ + + + + Slice 1 + Created with Sketch. + + + + + + 0 + + + 1 + + + + 2 + + + + 3 + + + "Яблоко" + + + "Апельсин" + + + "Груша" + + + "Лимон" + + + length = 4 + + + + очистить + + + + + 0 + + + 1 + + + + 2 + + + "Яблоко" + + + "Апельсин" + + + "Груша" + + + length = 3 + + + \ No newline at end of file diff --git a/1-js/4-data-structures/7-array/array-shift.svg b/1-js/4-data-structures/7-array/array-shift.svg new file mode 100644 index 00000000..22efd09b --- /dev/null +++ b/1-js/4-data-structures/7-array/array-shift.svg @@ -0,0 +1,104 @@ + + + + Slice 1 + Created with Sketch. + + + + + + 0 + + + 1 + + + + 2 + + + + 3 + + + "Яблоко" + + + "Апельсин" + + + "Груша" + + + "Лимон" + + + length = 4 + + + + + 0 + + + 1 + + + + 2 + + + + 3 + + + "Апельсин" + + + "Груша" + + + "Лимон" + + + length = 4 + + + + очистить + + + + + 0 + + + 1 + + + + 2 + + + "Апельсин" + + + "Груша" + + + "Лимон" + + + length = + 3 + + + + переместить + + элементы + влево + + + \ No newline at end of file diff --git a/1-js/4-data-structures/7-array/array-speed.svg b/1-js/4-data-structures/7-array/array-speed.svg new file mode 100644 index 00000000..a67023df --- /dev/null +++ b/1-js/4-data-structures/7-array/array-speed.svg @@ -0,0 +1,59 @@ + + + + Slice 1 + Created with Sketch. + + + + + + 0 + + + 1 + + + + 2 + + + + 3 + + + + + pop + + + + + unshift + + + + + push + + + + + shift + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/1-js/4-data-structures/6-array/article.md b/1-js/4-data-structures/7-array/article.md similarity index 77% rename from 1-js/4-data-structures/6-array/article.md rename to 1-js/4-data-structures/7-array/article.md index fe381029..52a24f8b 100644 --- a/1-js/4-data-structures/6-array/article.md +++ b/1-js/4-data-structures/7-array/article.md @@ -1,10 +1,10 @@ # Массивы c числовыми индексами -*Массив с числовыми индексами* -- это коллекция данных, которая хранит сколько угодно значений, причем у каждого значения -- свой уникальный номер. +*Массив* -- разновидность объекта, которая предназначена для хранения пронумерованных значений и предлагает дополнительные методы для удобного манипулирования такой коллекцией. + +Они обычно используются для хранения упорядоченных коллекций данных, например -- списка товаров на странице, студентов в группе и т.п. -Если переменная -- это *коробка для данных*, то массив -- это *шкаф с нумерованными ячейками*, в каждой из которых могут быть свои данные. [cut] -Например, при создании электронного магазина нужно хранить список товаров -- для таких задач и придуман массив. ## Объявление @@ -22,7 +22,9 @@ var arr = []; var fruits = ["Яблоко", "Апельсин", "Слива"]; ``` -**Элементы нумеруются, начиная с нуля.** Чтобы получить нужный элемент из массива -- указывается его номер в квадратных скобках: +**Элементы нумеруются, начиная с нуля.** + +Чтобы получить нужный элемент из массива -- указывается его номер в квадратных скобках: ```js //+ run @@ -39,7 +41,7 @@ alert(fruits[2]); // Слива fruits[2] = 'Груша'; // теперь ["Яблоко", "Апельсин", "Груша"] ``` -... Или добавить: +...Или добавить: ```js fruits[3] = 'Лимон'; // теперь ["Яблоко", "Апельсин", "Груша", "Лимон"] @@ -54,7 +56,9 @@ var fruits = ["Яблоко", "Апельсин", "Груша"]; alert(fruits.length); // 3 ``` -**Через `alert` можно вывести и массив целиком.** При этом его элементы будут перечислены через запятую: +**Через `alert` можно вывести и массив целиком.** + +При этом его элементы будут перечислены через запятую: ```js //+ run @@ -63,7 +67,9 @@ var fruits = ["Яблоко", "Апельсин", "Груша"]; alert(fruits); // Яблоко,Апельсин,Груша ``` -**В массиве может храниться любое число элементов любого типа.** В том числе, строки, числа, объекты и т.п.: +**В массиве может храниться любое число элементов любого типа.** + +В том числе, строки, числа, объекты, вот например: ```js //+ run @@ -78,10 +84,14 @@ alert( arr[2].name ); // Петя Одно из применений массива -- это [очередь](http://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29). В классическом программировании так называют упорядоченную коллекцию элементов, такую что элементы добавляются в конец, а обрабатываются -- с начала. -В реальной жизни эта структура данных встречается очень часто. Например, очередь сообщений, которые надо отослать. + + +В реальной жизни эта структура данных встречается очень часто. Например, очередь сообщений, которые надо показать на экране. Очень близка к очереди еще одна структура данных: [стек](http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA). Это такая коллекция элементов, в которой новые элементы добавляются в конец и берутся с конца. + + Например, стеком является колода карт, в которую новые карты кладутся сверху, и берутся -- тоже сверху. Для того, чтобы реализовывать эти структуры данных, и просто для более удобной работы с началом и концом массива существуют специальные методы. @@ -147,8 +157,6 @@ alert(fruits); // Яблоко, Апельсин, Груша - - Методы `push` и `unshift` могут добавлять сразу по несколько элементов: ```js @@ -217,33 +225,41 @@ alert(a); // 0,,,,,5 Методы `push/pop` выполняются быстро, а `shift/unshift` -- медленно. -Чтобы понять, почему работать с концом массива -- быстрее, чем с его началом, разберём происходящее подробнее. + -Операция `shift` выполняет два действия: + +Чтобы понять, почему работать с концом массива -- быстрее, чем с его началом, разберём подробнее происходящее при операции: + +```js +fruits.shift(); // убрать 1 элемент с начала +``` + +При этом, так как все элементы находятся в своих ячейках, просто удалить элемент с номером `0` недостаточно. Нужно еще и переместить остальные элементы на их новые индексы. + +Операция `shift` должна выполнить целых три действия:
        -
      1. Удалить элемент в начале.
      2. -
      3. Обновить внутреннее свойство `length`.
      4. +
      5. Удалить нулевой элемент.
      6. +
      7. Переместить все свойства влево, с индекса `1` на `0`, с `2` на `1` и так далее.
      8. +
      9. Обновить свойство `length`.
      -При этом, так как все элементы находятся в своих ячейках, просто очистить ячейку с номером `0` недостаточно. Нужно еще и переместить все ячейки на `1` вниз (красным на рисунке подсвечены изменения): + + +**Чем больше элементов в массиве, тем дольше их перемещать, это много операций с памятью.** + +Аналогично работает `unshift`: чтобы добавить элемент в начало массива, нужно сначала перенести вправо, в увеличенные индексы, все существующие. + +А что же с `push/pop`? Им как раз перемещать ничего не надо. Для того, чтобы удалить элемент, метод `pop` очищает ячейку и укорачивает `length`. + +Действия при операции: ```js -*!*fruits.shift();*/!* // убрать 1 элемент с начала +fruits.pop(); // убрать 1 элемент с конца ``` - + -Чем больше элементов в массиве, тем дольше их перемещать. - -Аналогично работает `unshift`: чтобы добавить элемент в начало массива, нужно сначала перенести все существующие. - -У методов `push/pop` таких проблем нет. Для того, чтобы удалить элемент, метод `pop` очищает ячейку и укорачивает `length`. - -```js -*!*fruits.pop();*/!* // убрать 1 элемент с конца -``` - - +**Перемещать при `pop` не требуется, так как прочие элементы после этой операции остаются на тех же индексах.** Аналогично работает `push`. @@ -279,17 +295,17 @@ for (var key in arr) { Недостатки этого способа: - +
    -**Если кратко: цикл `for(var i=0; i
  • Не ставить массиву произвольные свойства, такие как `arr.test = 5`. То есть, работать именно как с массивом, а не как с объектом.
  • -
  • Заполнять массив непрерывно. Как только браузер встречает необычное поведение массива, например устанавливается значение `arr[0]`, а потом сразу `arr[1000]`, то он начинает работать с ним, как с обычным объектом. Как правило, это влечёт преобразование его в хэш-таблицу.
  • +
  • Заполнять массив непрерывно и по возрастающей. Как только браузер встречает необычное поведение массива, например устанавливается значение `arr[0]`, а потом сразу `arr[1000]`, то он начинает работать с ним, как с обычным объектом. Как правило, это влечёт преобразование его в хэш-таблицу.
  • diff --git a/1-js/4-data-structures/7-array/queue.svg b/1-js/4-data-structures/7-array/queue.svg new file mode 100644 index 00000000..0b512b75 --- /dev/null +++ b/1-js/4-data-structures/7-array/queue.svg @@ -0,0 +1,19 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/1-js/4-data-structures/7-array/stack.svg b/1-js/4-data-structures/7-array/stack.svg new file mode 100644 index 00000000..40bcc58b --- /dev/null +++ b/1-js/4-data-structures/7-array/stack.svg @@ -0,0 +1,15 @@ + + + + Slice 1 + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/1-js/4-data-structures/7-array-methods/1-add-class/_js.view/solution.js b/1-js/4-data-structures/8-array-methods/1-add-class/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/1-add-class/_js.view/solution.js rename to 1-js/4-data-structures/8-array-methods/1-add-class/_js.view/solution.js diff --git a/1-js/4-data-structures/7-array-methods/1-add-class/_js.view/test.js b/1-js/4-data-structures/8-array-methods/1-add-class/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/1-add-class/_js.view/test.js rename to 1-js/4-data-structures/8-array-methods/1-add-class/_js.view/test.js diff --git a/1-js/4-data-structures/7-array-methods/1-add-class/solution.md b/1-js/4-data-structures/8-array-methods/1-add-class/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/1-add-class/solution.md rename to 1-js/4-data-structures/8-array-methods/1-add-class/solution.md diff --git a/1-js/4-data-structures/7-array-methods/1-add-class/task.md b/1-js/4-data-structures/8-array-methods/1-add-class/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/1-add-class/task.md rename to 1-js/4-data-structures/8-array-methods/1-add-class/task.md diff --git a/1-js/4-data-structures/7-array-methods/10-filter-anagrams/_js.view/solution.js b/1-js/4-data-structures/8-array-methods/10-filter-anagrams/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/10-filter-anagrams/_js.view/solution.js rename to 1-js/4-data-structures/8-array-methods/10-filter-anagrams/_js.view/solution.js diff --git a/1-js/4-data-structures/7-array-methods/10-filter-anagrams/_js.view/test.js b/1-js/4-data-structures/8-array-methods/10-filter-anagrams/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/10-filter-anagrams/_js.view/test.js rename to 1-js/4-data-structures/8-array-methods/10-filter-anagrams/_js.view/test.js diff --git a/1-js/4-data-structures/7-array-methods/10-filter-anagrams/solution.md b/1-js/4-data-structures/8-array-methods/10-filter-anagrams/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/10-filter-anagrams/solution.md rename to 1-js/4-data-structures/8-array-methods/10-filter-anagrams/solution.md diff --git a/1-js/4-data-structures/7-array-methods/10-filter-anagrams/task.md b/1-js/4-data-structures/8-array-methods/10-filter-anagrams/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/10-filter-anagrams/task.md rename to 1-js/4-data-structures/8-array-methods/10-filter-anagrams/task.md diff --git a/1-js/4-data-structures/7-array-methods/11-array-unique/_js.view/solution.js b/1-js/4-data-structures/8-array-methods/11-array-unique/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/11-array-unique/_js.view/solution.js rename to 1-js/4-data-structures/8-array-methods/11-array-unique/_js.view/solution.js diff --git a/1-js/4-data-structures/7-array-methods/11-array-unique/_js.view/test.js b/1-js/4-data-structures/8-array-methods/11-array-unique/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/11-array-unique/_js.view/test.js rename to 1-js/4-data-structures/8-array-methods/11-array-unique/_js.view/test.js diff --git a/1-js/4-data-structures/7-array-methods/11-array-unique/solution.md b/1-js/4-data-structures/8-array-methods/11-array-unique/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/11-array-unique/solution.md rename to 1-js/4-data-structures/8-array-methods/11-array-unique/solution.md diff --git a/1-js/4-data-structures/7-array-methods/11-array-unique/task.md b/1-js/4-data-structures/8-array-methods/11-array-unique/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/11-array-unique/task.md rename to 1-js/4-data-structures/8-array-methods/11-array-unique/task.md diff --git a/1-js/4-data-structures/7-array-methods/2-camelcase/_js.view/solution.js b/1-js/4-data-structures/8-array-methods/2-camelcase/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/2-camelcase/_js.view/solution.js rename to 1-js/4-data-structures/8-array-methods/2-camelcase/_js.view/solution.js diff --git a/1-js/4-data-structures/7-array-methods/2-camelcase/_js.view/test.js b/1-js/4-data-structures/8-array-methods/2-camelcase/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/2-camelcase/_js.view/test.js rename to 1-js/4-data-structures/8-array-methods/2-camelcase/_js.view/test.js diff --git a/1-js/4-data-structures/7-array-methods/2-camelcase/solution.md b/1-js/4-data-structures/8-array-methods/2-camelcase/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/2-camelcase/solution.md rename to 1-js/4-data-structures/8-array-methods/2-camelcase/solution.md diff --git a/1-js/4-data-structures/7-array-methods/2-camelcase/task.md b/1-js/4-data-structures/8-array-methods/2-camelcase/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/2-camelcase/task.md rename to 1-js/4-data-structures/8-array-methods/2-camelcase/task.md diff --git a/1-js/4-data-structures/7-array-methods/3-remove-class/_js.view/solution.js b/1-js/4-data-structures/8-array-methods/3-remove-class/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/3-remove-class/_js.view/solution.js rename to 1-js/4-data-structures/8-array-methods/3-remove-class/_js.view/solution.js diff --git a/1-js/4-data-structures/7-array-methods/3-remove-class/_js.view/test.js b/1-js/4-data-structures/8-array-methods/3-remove-class/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/3-remove-class/_js.view/test.js rename to 1-js/4-data-structures/8-array-methods/3-remove-class/_js.view/test.js diff --git a/1-js/4-data-structures/7-array-methods/3-remove-class/solution.md b/1-js/4-data-structures/8-array-methods/3-remove-class/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/3-remove-class/solution.md rename to 1-js/4-data-structures/8-array-methods/3-remove-class/solution.md diff --git a/1-js/4-data-structures/7-array-methods/3-remove-class/task.md b/1-js/4-data-structures/8-array-methods/3-remove-class/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/3-remove-class/task.md rename to 1-js/4-data-structures/8-array-methods/3-remove-class/task.md diff --git a/1-js/4-data-structures/7-array-methods/4-filter-in-place/_js.view/solution.js b/1-js/4-data-structures/8-array-methods/4-filter-in-place/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/4-filter-in-place/_js.view/solution.js rename to 1-js/4-data-structures/8-array-methods/4-filter-in-place/_js.view/solution.js diff --git a/1-js/4-data-structures/7-array-methods/4-filter-in-place/_js.view/test.js b/1-js/4-data-structures/8-array-methods/4-filter-in-place/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/7-array-methods/4-filter-in-place/_js.view/test.js rename to 1-js/4-data-structures/8-array-methods/4-filter-in-place/_js.view/test.js diff --git a/1-js/4-data-structures/7-array-methods/4-filter-in-place/solution.md b/1-js/4-data-structures/8-array-methods/4-filter-in-place/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/4-filter-in-place/solution.md rename to 1-js/4-data-structures/8-array-methods/4-filter-in-place/solution.md diff --git a/1-js/4-data-structures/7-array-methods/4-filter-in-place/task.md b/1-js/4-data-structures/8-array-methods/4-filter-in-place/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/4-filter-in-place/task.md rename to 1-js/4-data-structures/8-array-methods/4-filter-in-place/task.md diff --git a/1-js/4-data-structures/7-array-methods/5-sort-back/solution.md b/1-js/4-data-structures/8-array-methods/5-sort-back/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/5-sort-back/solution.md rename to 1-js/4-data-structures/8-array-methods/5-sort-back/solution.md diff --git a/1-js/4-data-structures/7-array-methods/5-sort-back/task.md b/1-js/4-data-structures/8-array-methods/5-sort-back/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/5-sort-back/task.md rename to 1-js/4-data-structures/8-array-methods/5-sort-back/task.md diff --git a/1-js/4-data-structures/7-array-methods/6-copy-sort-array/solution.md b/1-js/4-data-structures/8-array-methods/6-copy-sort-array/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/6-copy-sort-array/solution.md rename to 1-js/4-data-structures/8-array-methods/6-copy-sort-array/solution.md diff --git a/1-js/4-data-structures/7-array-methods/6-copy-sort-array/task.md b/1-js/4-data-structures/8-array-methods/6-copy-sort-array/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/6-copy-sort-array/task.md rename to 1-js/4-data-structures/8-array-methods/6-copy-sort-array/task.md diff --git a/1-js/4-data-structures/7-array-methods/7-shuffle-array/solution.md b/1-js/4-data-structures/8-array-methods/7-shuffle-array/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/7-shuffle-array/solution.md rename to 1-js/4-data-structures/8-array-methods/7-shuffle-array/solution.md diff --git a/1-js/4-data-structures/7-array-methods/7-shuffle-array/task.md b/1-js/4-data-structures/8-array-methods/7-shuffle-array/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/7-shuffle-array/task.md rename to 1-js/4-data-structures/8-array-methods/7-shuffle-array/task.md diff --git a/1-js/4-data-structures/7-array-methods/8-sort-objects/solution.md b/1-js/4-data-structures/8-array-methods/8-sort-objects/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/8-sort-objects/solution.md rename to 1-js/4-data-structures/8-array-methods/8-sort-objects/solution.md diff --git a/1-js/4-data-structures/7-array-methods/8-sort-objects/task.md b/1-js/4-data-structures/8-array-methods/8-sort-objects/task.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/8-sort-objects/task.md rename to 1-js/4-data-structures/8-array-methods/8-sort-objects/task.md diff --git a/1-js/4-data-structures/8-array-methods/9-output-single-linked-list/linked-list.svg b/1-js/4-data-structures/8-array-methods/9-output-single-linked-list/linked-list.svg new file mode 100644 index 00000000..250672b6 --- /dev/null +++ b/1-js/4-data-structures/8-array-methods/9-output-single-linked-list/linked-list.svg @@ -0,0 +1,60 @@ + + + + Slice 1 + Created with Sketch. + + + + + value + + + 1 + + + + + next + + + + value + + + 2 + + + + + next + + + + value + + + 3 + + + + + next + + + + value + + + 4 + + + + + next + + + null + + + \ No newline at end of file diff --git a/1-js/4-data-structures/7-array-methods/9-output-single-linked-list/solution.md b/1-js/4-data-structures/8-array-methods/9-output-single-linked-list/solution.md similarity index 100% rename from 1-js/4-data-structures/7-array-methods/9-output-single-linked-list/solution.md rename to 1-js/4-data-structures/8-array-methods/9-output-single-linked-list/solution.md diff --git a/1-js/4-data-structures/7-array-methods/9-output-single-linked-list/task.md b/1-js/4-data-structures/8-array-methods/9-output-single-linked-list/task.md similarity index 98% rename from 1-js/4-data-structures/7-array-methods/9-output-single-linked-list/task.md rename to 1-js/4-data-structures/8-array-methods/9-output-single-linked-list/task.md index eb93d530..4d431dd3 100644 --- a/1-js/4-data-structures/7-array-methods/9-output-single-linked-list/task.md +++ b/1-js/4-data-structures/8-array-methods/9-output-single-linked-list/task.md @@ -23,7 +23,7 @@ var list = { ``` Графическое представление этого списка: - + Альтернативный способ создания: diff --git a/1-js/4-data-structures/7-array-methods/article.md b/1-js/4-data-structures/8-array-methods/article.md similarity index 87% rename from 1-js/4-data-structures/7-array-methods/article.md rename to 1-js/4-data-structures/8-array-methods/article.md index 99835e87..e25dbda7 100644 --- a/1-js/4-data-structures/7-array-methods/article.md +++ b/1-js/4-data-structures/8-array-methods/article.md @@ -140,7 +140,7 @@ arr.splice(0, 3, "Мы", "изучаем") alert( arr ) // теперь [*!*"Мы", "изучаем"*/!*, "JavaScript"] ``` -Метод **`splice` возвращает массив из удаленных элементов**: +Метод `splice` возвращает массив из удаленных элементов: ```js //+ run @@ -152,7 +152,7 @@ var removed = arr.splice(0, 2); alert( removed ); // "Я", "сейчас" <-- array of removed elements ``` -Метод **`splice` также может вставлять элементы без удаления**, для этого достаточно установить `deleteCount` в `0`: +Метод `splice` также может вставлять элементы без удаления, для этого достаточно установить `deleteCount` в `0`: ```js //+ run @@ -223,6 +223,10 @@ var fullCopy = arr.slice(); +[smart header="Совсем как в строках"] +Синтаксис метода `slice` одинаков для строк и для массивов. Тем проще его запомнить. +[/smart] + ## Сортировка, метод sort(fn) Метод `sort()` сортирует массив *на месте*. Например: @@ -238,11 +242,17 @@ alert( arr ); // *!*1, 15, 2*/!* Не заметили ничего странного в этом примере? -Порядок стал `1, 15, 2`. Это произошло потому, что **`sort` сортирует, преобразуя элементы к строке**. Поэтому и порядок у них строковый, ведь `"2" > "15"`. +Порядок стал `1, 15, 2`, это точно не сортировка чисел. Почему? + +**Это произошло потому, что по умолчанию `sort` сортирует, преобразуя элементы к строке.** + +Поэтому и порядок у них строковый, ведь `"2" > "15"`. ### Свой порядок сортировки -Внутренняя реализация метода `arr.sort(fn)` умеет сортировать любые массивы, если указать функцию `fn` от двух элементов, которая умеет сравнивать их. +Для указания своего порядка сортировки в метод `arr.sort(fn)` нужно передать функцию `fn` от двух элементов, которая умеет сравнивать их. + +Внутренний алгоритм функции сортировки умеет сортировать любые массивы -- апельсинов, яблок, пользователей, и тех и других и третьих -- чего угодно. Но для этого ему нужно знать, как их сравнивать. Эту роль и выполняет `fn`. Если эту функцию не указать, то элементы сортируются как строки. @@ -267,27 +277,24 @@ alert(arr); // *!*1, 2, 15*/!* Обратите внимание, мы передаём в `sort()` именно саму функцию `compareNumeric`, без вызова через скобки. Был бы ошибкой следующий код: ```js -*!* -arr.sort( compareNumeric() ); // не сработает -*/!* +arr.sort( compareNumeric*!*()*/!* ); // не сработает ``` -К функции, передаваемой `sort`, есть всего одно требование. +Как видно из примера выше, функция, передаваемая `sort`, должна иметь два аргумента. Алгоритм сортировки, встроенный в JavaScript, будет передавать ей для сравнения элементы массива. Она должна возвращать: + [smart header="Алгоритм сортировки"] В методе `sort`, внутри самого интерпретатора JavaScript, реализован универсальный алгоритм сортировки. Как правило, это ["\"быстрая сортировка\""](http://algolist.manual.ru/sort/quick_sort.php), дополнительно оптимизированная для небольших массивов. -Ему совершенно неважно, что сортировать -- строки, числа, яблоки с апельсинами или посетителей. Это и не должно быть важно, алгоритм сортировки просто сортирует абстрактные "элементы массива". Всё, что ему нужно о них знать -- как эти элементы сравнивать между собой. - -Для этого мы передаём в `sort` функцию сравнения. А там уже алгоритм решает, что с чем сравнивать, чтобы отсортировать побыстрее. +Он решает, какие пары элементов и когда сравнивать, чтобы отсортировать побыстрее. Мы даём ему функцию -- способ сравнения, дальше он вызывает её сам. Кстати, те значения, с которыми `sort` вызывает функцию сравнения, можно увидеть, если вставить в неё `alert`: @@ -300,6 +307,7 @@ arr.sort( compareNumeric() ); // не сработает [/smart] +[smart header="Сравнение `compareNumeric` в одну строку"] Функцию `compareNumeric` для сравнения элементов-чисел можно упростить до одной строчки. ```js @@ -309,7 +317,7 @@ function compareNumeric(a, b) { ``` Эта функция вполне подходит для `sort`, так как возвращает положительное число, если `a > b`, отрицательное, если наоборот, и `0`, если числа равны. - +[/smart] ## reverse @@ -340,13 +348,16 @@ var newArr = arr.concat(3,4); alert(newArr); // 1,2,3,4 ``` -**Если `value` -- массив, то `concat` добавляет его элементы.** +У `concat` есть одна забавная особенность. + +Если аргумент `concat` -- массив, то `concat` добавляет элементы из него. Например: ```js //+ run var arr = [1,2]; + *!* var newArr = arr.concat( [3,4], 5);// то же самое, что arr.concat(3,4,5) */!* diff --git a/1-js/4-data-structures/8-array-iteration/1-rewrite-for-map/solution.md b/1-js/4-data-structures/9-array-iteration/1-rewrite-for-map/solution.md similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/1-rewrite-for-map/solution.md rename to 1-js/4-data-structures/9-array-iteration/1-rewrite-for-map/solution.md diff --git a/1-js/4-data-structures/8-array-iteration/1-rewrite-for-map/task.md b/1-js/4-data-structures/9-array-iteration/1-rewrite-for-map/task.md similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/1-rewrite-for-map/task.md rename to 1-js/4-data-structures/9-array-iteration/1-rewrite-for-map/task.md diff --git a/1-js/4-data-structures/8-array-iteration/2-partial-sums-array/_js.view/solution.js b/1-js/4-data-structures/9-array-iteration/2-partial-sums-array/_js.view/solution.js similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/2-partial-sums-array/_js.view/solution.js rename to 1-js/4-data-structures/9-array-iteration/2-partial-sums-array/_js.view/solution.js diff --git a/1-js/4-data-structures/8-array-iteration/2-partial-sums-array/_js.view/test.js b/1-js/4-data-structures/9-array-iteration/2-partial-sums-array/_js.view/test.js similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/2-partial-sums-array/_js.view/test.js rename to 1-js/4-data-structures/9-array-iteration/2-partial-sums-array/_js.view/test.js diff --git a/1-js/4-data-structures/8-array-iteration/2-partial-sums-array/solution.md b/1-js/4-data-structures/9-array-iteration/2-partial-sums-array/solution.md similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/2-partial-sums-array/solution.md rename to 1-js/4-data-structures/9-array-iteration/2-partial-sums-array/solution.md diff --git a/1-js/4-data-structures/8-array-iteration/2-partial-sums-array/task.md b/1-js/4-data-structures/9-array-iteration/2-partial-sums-array/task.md similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/2-partial-sums-array/task.md rename to 1-js/4-data-structures/9-array-iteration/2-partial-sums-array/task.md diff --git a/1-js/4-data-structures/8-array-iteration/article.md b/1-js/4-data-structures/9-array-iteration/article.md similarity index 100% rename from 1-js/4-data-structures/8-array-iteration/article.md rename to 1-js/4-data-structures/9-array-iteration/article.md