diff --git a/1-js/4-data-structures/11-datetime/article.md b/1-js/4-data-structures/11-datetime/article.md index ec7e1af9..5cd1fa55 100644 --- a/1-js/4-data-structures/11-datetime/article.md +++ b/1-js/4-data-structures/11-datetime/article.md @@ -281,7 +281,7 @@ alert( 'Время walkLength: ' + bench(walkLength) + 'мс' ); Теперь представим себе, что во время первого бенчмаркинга `bench(walkIn)` компьютер что-то делал параллельно важное (вдруг) и это занимало ресурсы, а во время второго -- перестал. Реальная ситуация? Конечно реальна, особенно на современных ОС, где много процессов одновременно. -**Гораздо более надёжные результаты можно получить, весь пакет тестов прогнать много раз.** +**Гораздо более надёжные результаты можно получить, если весь пакет тестов прогнать много раз.** ```js //+ run diff --git a/1-js/4-data-structures/12-typeof-duck-typing/article.md b/1-js/4-data-structures/12-typeof-duck-typing/article.md index 7c36628c..733bf476 100644 --- a/1-js/4-data-structures/12-typeof-duck-typing/article.md +++ b/1-js/4-data-structures/12-typeof-duck-typing/article.md @@ -121,7 +121,7 @@ if (x.getTime) { ## Полиморфизм -Пример полимофрной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому: +Пример полиморфной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому: ```js //+ run diff --git a/1-js/4-data-structures/5-object-for-in/article.md b/1-js/4-data-structures/5-object-for-in/article.md index 51828370..8418af31 100644 --- a/1-js/4-data-structures/5-object-for-in/article.md +++ b/1-js/4-data-structures/5-object-for-in/article.md @@ -166,6 +166,6 @@ for (var code in codes) { diff --git a/1-js/4-data-structures/7-array/article.md b/1-js/4-data-structures/7-array/article.md index 00574634..60a7d170 100644 --- a/1-js/4-data-structures/7-array/article.md +++ b/1-js/4-data-structures/7-array/article.md @@ -124,7 +124,7 @@ fruits.push("Груша"); alert( fruits ); // Яблоко, Апельсин, Груша ``` -Является полным аналогом `fruits[fruits.length] = ...`. +Вызов `fruits.push(...)` равнозначен `fruits[fruits.length] = ...`. diff --git a/1-js/4-data-structures/8-array-methods/11-array-unique/solution.md b/1-js/4-data-structures/8-array-methods/11-array-unique/solution.md index 6fbf93a4..e49f17b2 100644 --- a/1-js/4-data-structures/8-array-methods/11-array-unique/solution.md +++ b/1-js/4-data-structures/8-array-methods/11-array-unique/solution.md @@ -7,7 +7,6 @@ ```js //+ run function unique(arr) { - var obj = {}; var result = []; nextInput: @@ -52,7 +51,7 @@ alert( unique(strings) ); // кришна, харе, 8-() # Решение с объектом (быстрое) -Наилучшая техника для выбора уникальных строк -- использование вспомогательного объекта. Ведь название свойства в объекте, с одной стороны -- строка, а с другой -- всегда уникально. Повторная запись в свойство с тем же именем перезапишет его. +Наилучшая техника для выбора уникальных строк -- использование вспомогательного объекта `obj`. Ведь название свойства в объекте, с одной стороны -- строка, а с другой -- всегда уникально. Повторная запись в свойство с тем же именем перезапишет его. Например, если `"харе"` попало в объект один раз (`obj["харе"] = true`), то второе такое же присваивание ничего не изменит. diff --git a/1-js/4-data-structures/8-array-methods/article.md b/1-js/4-data-structures/8-array-methods/article.md index 5e6f3408..331738e6 100644 --- a/1-js/4-data-structures/8-array-methods/article.md +++ b/1-js/4-data-structures/8-array-methods/article.md @@ -99,10 +99,12 @@ alert( arr[1] ); // undefined
`arr.splice(index[, deleteCount, elem1, ..., elemN])`
-
Удалить `deleteCount` элементов, начиная с номера `index`, а затем вставить `elem1, ..., elemN` на их место.
+
Удалить `deleteCount` элементов, начиная с номера `index`, а затем вставить `elem1, ..., elemN` на их место. Возвращает массив из удалённых элементов.
-Посмотрим примеры. +Этот метод проще всего понять, рассмотрев примеры. + +Начнём с удаления: ```js //+ run @@ -115,20 +117,7 @@ arr.splice(1, 1); // начиная с позиции 1, удалить 1 эле alert( arr ); // осталось ["Я", "JavaScript"] ``` -Ниже продемонстрировано, как использовать `splice` для удаления одного элемента. Следующие за удаленным элементы сдвигаются, чтобы заполнить его место. - -```js -//+ run -var arr = ["Я", "изучаю", "JavaScript"]; - -*!* -arr.splice(0, 1); // удалить 1 элемент, начиная с позиции 0 -*/!* - -alert( arr[0] ); // "изучаю" стал первым элементом -``` - -Следующий пример показывает, как *заменять элементы*: +В следующем примере мы удалим 3 элемента и вставим другие на их место: ```js //+ run @@ -140,7 +129,7 @@ arr.splice(0, 3, "Мы", "изучаем") alert( arr ) // теперь [*!*"Мы", "изучаем"*/!*, "JavaScript"] ``` -Метод `splice` возвращает массив из удаленных элементов: +Здесь видно, что `splice` возвращает массив из удаленных элементов: ```js //+ run diff --git a/1-js/5-functions-closures/2-closures/article.md b/1-js/5-functions-closures/2-closures/article.md index c511312f..6f0d51ab 100644 --- a/1-js/5-functions-closures/2-closures/article.md +++ b/1-js/5-functions-closures/2-closures/article.md @@ -63,7 +63,7 @@ sayHi('Вася'); ``` -
  • В конце выполнения функции объект с переменными обычно выбрасывается и память очищается.
  • +
  • В конце выполнения функции объект с переменными обычно выбрасывается и память очищается. В примерах выше так и происходит. Через некоторое время мы рассмотрим более сложные ситуации, при которых объект с переменными сохраняется и после завершения функции.
  • [smart header="Тонкости спецификации"] @@ -144,8 +144,7 @@ say('Вася'); // Пока, Вася (**) На момент первого запуска `(*)`, переменная `phrase` имела значение `'Привет'`, а ко второму `(**)` изменила его на `'Пока'`. -Это естественно, ведь для доступа к внешним переменным функция хранит ссылку `[[Scope]]` на весь внешний объект с ними, а не на каждое его свойство (переменную) по отдельности. - +Это естественно, ведь для доступа к внешней переменной функция по ссылке `[[Scope]]` обращается во внешний объект переменных и берёт то значение, которое там есть на момент обращения. ## Вложенные функции @@ -182,7 +181,7 @@ getFullName.[[Scope]] = объект переменных текущего за Благодаря этому `getFullName()` получает снаружи `firstName` и `lastName`. -Заметим, что если переменная не найдена во внешнем объекте переменных, то она ищется ещё более внешнем (через `[[Scope]]` внешней функции), то есть, такой пример тоже будет работать: +Заметим, что если переменная не найдена во внешнем объекте переменных, то она ищется в ещё более внешнем (через `[[Scope]]` внешней функции), то есть, такой пример тоже будет работать: ```js //+ run diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/solution.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/solution.md new file mode 100644 index 00000000..083b3044 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/solution.md @@ -0,0 +1,6 @@ + +Результат: `123 456`. + +Ленивый `\d+?` будет брать цифры до пробела, то есть `123`. После каждой цифры он будет останавливаться, проверять -- не пробел ли дальше? Если нет -- брать ещё цифру, в итоге возьмёт `123`. + +З в дело вступит `\d+`, который по-максимуму возьмёт дальнейшие цифры, то есть `456`. \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md new file mode 100644 index 00000000..ee0fd5a0 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/1-lazy-greedy/task.md @@ -0,0 +1,13 @@ +# Совпадение для /d+? d+/ + +Мы разобрали совпадение: +```js +"123 456".match(/\d+ \d+?/g) ); // 123 4 +``` + +А что будет, если сначала поставить ленивый, а потом жадный квантификаторы? + +```js +"123 456".match(/\d+? \d+/g) ); // какой результат? +``` + diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md index e8610df7..18aa9da4 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/article.md @@ -1,4 +1,4 @@ -# Жадные и ленивые квантификаторы [todo] +# Жадные и ленивые квантификаторы Квантификаторы -- с виду очень простая, но на самом деле очень хитрая штука. @@ -55,7 +55,7 @@ alert( str.match(reg) ); // "witch" and her "broom"
  • Кавычка найдена, далее движок проверяет, есть ли соответствие для остальной части паттерна. -В данном случае следующий символ паттерна -- `.` (точка). Она обозначает "любой символ", так что следующая буква строки 'w' вполне подходит: +В данном случае следующий символ шаблона: . (точка). Она обозначает "любой символ", так что следующая буква строки 'w' вполне подходит:
  • Далее "любой символ" повторяется, так как стоит квантификатор .+. Движок регулярных выражений берёт один символ за другим, до тех пор, пока у него это получается. @@ -63,32 +63,40 @@ alert( str.match(reg) ); // "witch" and her "broom" В данном случае это означает "до конца строки":
  • -
  • Итак, текст закончился, движок регулярных выражений больше не может найти "любой символ", он закончил строить соответствие для .+ и очень рад по этому поводу. +
  • Итак, текст закончился, движок регулярных выражений больше не может найти "любой символ", он закончил повторения для .+ и переходит к следующему символу шаблона. Следующий символ шаблона -- это кавычка. Её тоже необходимо найти, чтобы соответствие было полным. А тут -- беда, ведь поисковый текст завершился! -Движок регулярных выражений понимает, что, наверное, взял многовато .+ и начинает отступать обратно ("фаза бэктрекинга" -- backtracking на англ.). +Движок регулярных выражений понимает, что, наверное, взял многовато .+ и начинает отступать обратно. Иными словами, он сокращает текущее совпадение на один символ: - + -После этого он ещё раз пытается подобрать соответствие для остатка паттерна. Но кавычка '"' не совпадает с 'e'.
  • -
  • ...Так что движок уменьшает число повторений .+ ещё раз: +Это называется "фаза возврата" или "фаза бэктрекинга" (backtracking -- англ.). - +Теперь .+ соответствует почти вся оставшаяся строка, за исключением одного символа, и движок регулярных выражений ещё раз пытается подобрать соответствие для остатка шаблона, начиная с оставшейся части строки. + +Если бы последним символом строки была кавычка '"', то на этом бы всё и закончилось. Но последний символ 'e', так что совпадения нет.
  • +
  • ...Поэтому движок уменьшает число повторений .+ ещё на один символ: + + Кавычка '"' не совпадает с 'n'. Опять неудача.
  • -
  • Движок продолжает отступать, он уменьшает количество повторений точки '.' до тех пор, пока остаток паттерна не совпадёт: +
  • Движок продолжает отступать, он уменьшает количество повторений точки '.' до тех пор, пока остаток паттерна, то есть в данном случае кавычка '"', не совпадёт: - +
  • -
  • Мы получили результат. Так как у регэкспа есть флаг `g`, то поиск продолжится, однако это произойдёт после первого совпадения и не даст новых результатов.
  • +
  • Совпадение получено. Дальнейший поиск по оставшейся части строки is one новых совпадений не даст.
  • +Возможно, это не совсем то, что мы ожидали. + **В жадном режиме (по умолчанию) регэксп повторяет квантификатор настолько много раз, насколько это возможно, чтобы найти соответствие.** -Возможно, это не совсем то, что мы хотели, но так это работает. +То есть, любой символ .+ повторился максимальное количество раз, что и привело к такой длинной строке. + +А мы, наверное, хотели, чтобы каждая строка в кавычках была независимым совпадением? Для этого можно переключить квантификатор `+` в "ленивый" режим, о котором будет речь далее. ## Ленивый режим @@ -109,40 +117,38 @@ var str = 'a "witch" and her "broom" is one'; alert( str.match(reg) ); // witch, broom ``` -Чтобы в точности понять, что происходим, разберём в деталях, как ищется ".+?". +Чтобы в точности понять, как поменялась работа квантификатора, разберём поиск по шагам.
    1. Первый шаг -- тот же, кавычка '"' найдена на 3й позиции: - +
    2. Второй шаг -- тот же, находим произвольный символ '.': - +
    3. -
    4. А вот дальше -- так как стоит ленивый режим работы `+`, то движок пытается повторять точку (произвольный символ) *минимальное количество раз*. +
    5. А вот дальше -- так как стоит ленивый режим работы `+`, то движок не повторет точку (произвольный символ) ещё раз, а останавливается на достигнутом и пытается проверить, есть ли соответствие остальной части шаблона, то есть '"': + -Так что он тут же пытается проверить, достаточно ли повторить 1 раз -- и для этого пытается найти соответствие остальной части шаблона, то есть '"': - - -Нет, один раз повторить недостаточно. В данном случае, символ `'i' != '"'`, но если бы оставшаяся часть паттерна была бы более сложной -- алгоритм остался бы тем же. Если остаток шаблона не находится -- увеличиваем количество повторений. +Если бы остальная часть шаблона на данной позиции совпала, то совпадение было бы найдено. Но в данном случе -- нет, символ `'i'` не равен '"'.
    6. Движок регулярных выражений увиличивает количество повторений точки на одно и пытается найти соответствие остатку шаблона ещё раз: - + Опять неудача. Тогда поисковой движок увеличивает количество повторений ещё и ещё...
    7. Только на 5м шаге поисковой движок наконец находит соответствие для остатка паттерна: - +
    8. Так как поиск происходит с флагом `g`, то он продолжается с конца текущего совпадения, давая ещё один результат: - +
    -В примере выше продемонстрирована работа ленивого режима для +?. Квантификаторы +? и ?? ведут себя аналогично -- "ленивый" движок увеличивает количество повторений только в том случае, если для остальной части шаблона на данной позиции нет соответствия, в то время как жадный сначала берёт столько повторений, сколько возможно, а потом отступает назад. +В примере выше продемонстрирована работа ленивого режима для +?. Квантификаторы +? и ?? ведут себя аналогично -- "ленивый" движок увеличивает количество повторений только в том случае, если для остальной части шаблона на данной позиции нет соответствия. **Ленивость распространяется только на тот квантификатор, после которого стоит `?`.** @@ -156,14 +162,17 @@ alert( "123 456".match(/\d+ \d+?/g) ); // 123 4 ```
      -
    1. Подпаттерн \d+ пытается найти столько символов, сколько возможно (работает жадно), так что он находит 123 и останавливается, поскольку символ пробела ' ' не подходит под \d.
    2. -
    3. Далее идёт пробел, и в игру вступает \d+?. +
    4. Подшаблон \d+ пытается найти столько цифр, сколько возможно (работает жадно), так что он находит 123 и останавливается, поскольку символ пробела ' ' не подходит под \d.
    5. +
    6. Далее в шаблоне пробел, он совпадает.
    7. +
    8. Далее в шаблоне идёт \d+?. -Он находит один символ '4' и пытатся проверить, есть ли совпадение с остатком шаблона (после \d+?). +Квантификатор указан в ленивом режиме, поэтому он находит одну цифру 4 и пытается проверить, есть ли совпадение с остатком шаблона. -Здесь мы ещё раз заметим -- ленивый режим без необходимости ничего не возьмёт. +Но после \d+? в шаблоне ничего нет. -Так как шаблон закончился, то поиск завершается и 123 4 становится результатом.
    9. +**Ленивый режим без необходимости лишний раз квантификатор не повторит.** + +Так как шаблон завершился, то искать дальше, в общем-то нечего. Получено совпадение 123 4.
    10. Следующий поиск продолжится с `5`, но ничего не найдёт.
    @@ -188,7 +197,139 @@ var str = 'a "witch" and her "broom" is one'; alert( str.match(reg) ); // witch, broom ``` -Регэксп "[^"]+" даст правильные результаты, поскольку ищет кавычку '"', за которой идут столько не-кавычек (исключающие квадратные скобки), сколько возможно. Так что вторая кавычка автоматически прекращает повторения [^"]+ и позволяет найти остаток шаблона ". +Регэксп "[^"]+" даст правильные результаты, поскольку ищет кавычку '"', за которой идут столько не-кавычек (исключающие квадратные скобки), сколько возможно. + +Так что вторая кавычка автоматически прекращает повторения [^"]+ и позволяет найти остаток шаблона ". + +**Эта логика ни в коей мере не заменяет ленивые квантификаторы!** + + +Она просто другая. И то и другое бывает полезно. + +Давайте посмотрим пример, когда нужен именно такой вариант, а ленивые квантификаторы не подойдут. + +Например, мы хотим найти в тексте ссылки вида ``, с любым содержанием `href`. + +Какое регулярное выражение для этого подойдёт? + +Первый вариант может выглядеть так: /<a href=".*" class="doc">/g. + +Проверим его: +```js +//+ run +var str = '......'; +var reg = //g; + +// Сработало! +alert( str.match(reg) ); // +``` + +А если в тексте несколько ссылок? + +```js +//+ run +var str = '...... ...'; +var reg = //g; + +// Упс! Сразу две ссылки! +alert( str.match(reg) ); // ... +``` + +На этот раз результат неверен. + +Жадный .* взял слишком много символов. + +Соответствие получилось таким: +``` + +... +``` + +Модифицируем шаблон -- добавим ленивость квантификатору .*?: + +```js +//+ run +var str = '...... ...'; +var reg = //g; + +// Сработало! +alert( str.match(reg) ); // , +``` + +Теперь всё верно, два результата: + +``` + +... +``` + +Почему теперь всё в порядке -- для внимательного читателя, после объяснений, данных выше в этой главе, должно быть полностью очевидно. + +Поэтому не будем останавливаться здесь на деталях, а попробуем ещё пример: + +```js +//+ run +var str = '......

    ...'; +var reg = //g; + +// Неправильное совпадение! +alert( str.match(reg) ); // ...

    +``` + +Совпадение -- не ссылка, а более длинный текст. + +Получилось следующее: +

      +
    1. Найдено совпадение <a href=".
    2. +
    3. Лениво ищем .*?, после каждого символа проверяя, есть ли совпадение остальной части шаблона. + +Подшаблон .*? будет брать символы до тех пор, пока не найдёт class="doc">. + +В данном случае этот поиск закончится уже за пределами ссылки, в теге `

      `, вообще не имеющем отношения к ``. +

    4. +
    5. Получившееся совпадение: + +``` + +...

      +``` +

    6. +
    + +Итак, ленивость нам не помогла. + +Необходимо как-то прекратить поиск .*, чтобы он не вышел за пределы кавычек. + +Для этого мы используем более точное указание, какие символы нам подходят, а какие нет. + +Правильный вариант: [^"]*. Этот шаблон будет брать все символы до ближайшей кавычки, как раз то, что требуется. + +Рабочий пример: + +```js +//+ run +var str1 = '......

    ...'; +var str2 = '...... ...'; +var reg = //g; + +// Работает! +alert( str1.match(reg) ); // null, совпадений нет, и это верно +alert( str2.match(reg) ); // , +``` + +## Итого + +Квантификаторы имеют два режима работы: +

    +
    Жадный
    +
    Режим по умолчанию -- движок регулярных выражений повторяет его по-максимуму. Когда повторять уже нельзя, например нет больше цифр для `\d+`, он продолжает поиск с оставшейся части текста. Если совпадение найти не удалось -- отступает обратно, уменьшая количество повторений.
    +
    Ленивый
    +
    При указании после квантификатора символа `?` он работает в ленивом режиме. То есть, он перед каждым повторением проверяет совпадение оставшейся части шаблона на текущей позиции.
    +
    + +Как мы видели в примере выше, ленивый режим -- не панацея от "слишком жадного" забора символов. Альтернатива -- более аккуратно настроенный "жадный", с исключением символов. Как мы увидим далее, можно исключать не только символы, но и целые подшаблоны. + + diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg index 9db83ff6..28a19210 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy1.svg @@ -1,5 +1,5 @@ - + witch_greedy1.svg Created with bin/sketchtool. @@ -7,14 +7,12 @@ - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - " - - - - + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg index 4ffbd589..d88a073a 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy2.svg @@ -1,5 +1,5 @@ - + witch_greedy2.svg Created with bin/sketchtool. @@ -7,14 +7,13 @@ - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - ". - - - - + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg index a73b5063..8a75fffb 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy3.svg @@ -1,20 +1,20 @@ - + witch_greedy3.svg Created with bin/sketchtool. + + - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - "...................... - ....... - - - + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg index d76d61de..a007df6b 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy4.svg @@ -1,21 +1,25 @@ - + witch_greedy4.svg Created with bin/sketchtool. + - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - "...................... - ...... - " - - - + + + + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg index 09c28004..fceb75c4 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy5.svg @@ -1,21 +1,23 @@ - + witch_greedy5.svg Created with bin/sketchtool. + - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - "...................... - ..... - ". - - - + + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg index f292ebc1..7a2db4c8 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_greedy6.svg @@ -1,5 +1,5 @@ - + witch_greedy6.svg Created with bin/sketchtool. @@ -7,14 +7,14 @@ - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - "....................." - ....... - - - + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg index efb9a034..afb45e9e 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy3.svg @@ -1,5 +1,5 @@ - + witch_lazy3.svg Created with bin/sketchtool. @@ -7,14 +7,14 @@ - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - ". - " - - - + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg index 36a03d38..7913aed0 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy4.svg @@ -1,5 +1,5 @@ - + witch_lazy4.svg Created with bin/sketchtool. @@ -7,14 +7,14 @@ - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - ".. - " - - - + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy5.png b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy5.png deleted file mode 100644 index a98ac431..00000000 Binary files a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy5.png and /dev/null differ diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy5.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy5.svg new file mode 100644 index 00000000..4775caa3 --- /dev/null +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy5.svg @@ -0,0 +1,18 @@ + + + + witch_lazy5.svg + Created with bin/sketchtool. + + + + + a "witch" and her "broom" is one + + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg index 5ad6b9e2..76880084 100644 --- a/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg +++ b/10-regular-expressions-javascript/8-regexp-greedy-and-lazy/witch_lazy6.svg @@ -1,5 +1,5 @@ - + witch_lazy6.svg Created with bin/sketchtool. @@ -7,13 +7,15 @@ - a "witch" and her "broom" is one + a "witch" and her "broom" is one - - "....." "....." - - - + + + + + + + \ No newline at end of file diff --git a/10-regular-expressions-javascript/9-regexp-groups/article.md b/10-regular-expressions-javascript/9-regexp-groups/article.md index 8e8a9685..192401ae 100644 --- a/10-regular-expressions-javascript/9-regexp-groups/article.md +++ b/10-regular-expressions-javascript/9-regexp-groups/article.md @@ -1,4 +1,4 @@ -# Группы +# Группы [todo] Часть шаблона может быть заключена в скобки (...). Такие выделенные части шаблона называют "скобочными выражениями" или "скобочными группами". diff --git a/2-ui/1-document/17-coordinates/article.md b/2-ui/1-document/17-coordinates/article.md index 332e27be..6dc9480b 100644 --- a/2-ui/1-document/17-coordinates/article.md +++ b/2-ui/1-document/17-coordinates/article.md @@ -97,7 +97,16 @@ elem.style.background = ""; Аналогично предыдущему методу, используются координаты относительно окна, так что, в зависимости от прокрутки страницы, в центре может быть разный элемент. -## Вместе с position:fixed +[warn header="Для координат вне окна `elementFromPoint` возвращает `null`"] +Метод `document.elementFromPoint(x,y)` работает только если координаты `(x,y)` находятся в пределах окна. + +Если одна из них отрицательна или больше чем ширина/высота окна -- он возвращает `null`. + +В большинстве сценариев использования это не является проблемой, но нужно проверять, что результат -- не `null`. +[/warn] + + +## Координаты для position:fixed Координаты обычно требуются не просто так, а, например, чтобы переместить элемент на них. diff --git a/figures.sketch b/figures.sketch index ec2f20bc..264784b2 100644 Binary files a/figures.sketch and b/figures.sketch differ