regexp renovations

This commit is contained in:
Ilya Kantor 2015-03-19 17:20:12 +03:00
parent b2f6df9d45
commit bf85f46cf9
24 changed files with 311 additions and 132 deletions

View file

@ -281,7 +281,7 @@ alert( 'Время walkLength: ' + bench(walkLength) + 'мс' );
Теперь представим себе, что во время первого бенчмаркинга `bench(walkIn)` компьютер что-то делал параллельно важное (вдруг) и это занимало ресурсы, а во время второго -- перестал. Реальная ситуация? Конечно реальна, особенно на современных ОС, где много процессов одновременно.
**Гораздо более надёжные результаты можно получить, весь пакет тестов прогнать много раз.**
**Гораздо более надёжные результаты можно получить, если весь пакет тестов прогнать много раз.**
```js
//+ run

View file

@ -121,7 +121,7 @@ if (x.getTime) {
## Полиморфизм
Пример полимофрной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому:
Пример полиморфной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому:
```js
//+ run

View file

@ -166,6 +166,6 @@ for (var code in codes) {
<ul>
<li>Цикл по ключам: `for (key in obj)`.</li>
<li>Порядок перебора соответствует порядку объявления для нечисловых ключей, а числовые -- сортируются (в современных браузерах).</li>
<li>Для того, чтобы гарантировать перебор ключей в нужном порядке, их делают "нечисловыми", например добавляя в начало `+`, а потом, в процессе обработки, преобразуют ключи в числа.</li>
<li>Если нужно, чтобы порядок перебора числовых ключей соответствовал их объявлению в объекте, то используют трюк: числовые ключи заменяют на похожие, но содержащие не только цифры. Например, добавляют в начало `+`, как описано в примере выше, а потом, в процессе обработки, преобразуют такие ключи в числа.</li>
</ul>

View file

@ -124,7 +124,7 @@ fruits.push("Груша");
alert( fruits ); // Яблоко, Апельсин, Груша
```
Является полным аналогом `fruits[fruits.length] = ...`.
Вызов `fruits.push(...)` равнозначен `fruits[fruits.length] = ...`.
</dd>
</dl>

View file

@ -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`), то второе такое же присваивание ничего не изменит.

View file

@ -99,10 +99,12 @@ alert( arr[1] ); // undefined
<dl>
<dt>`arr.splice(index[, deleteCount, elem1, ..., elemN])`</dt>
<dd>Удалить `deleteCount` элементов, начиная с номера `index`, а затем вставить `elem1, ..., elemN` на их место.</dd>
<dd>Удалить `deleteCount` элементов, начиная с номера `index`, а затем вставить `elem1, ..., elemN` на их место. Возвращает массив из удалённых элементов.</dd>
</dl>
Посмотрим примеры.
Этот метод проще всего понять, рассмотрев примеры.
Начнём с удаления:
```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

View file

@ -63,7 +63,7 @@ sayHi('Вася');
```
</li>
<li>В конце выполнения функции объект с переменными обычно выбрасывается и память очищается.</li>
<li>В конце выполнения функции объект с переменными обычно выбрасывается и память очищается. В примерах выше так и происходит. Через некоторое время мы рассмотрим более сложные ситуации, при которых объект с переменными сохраняется и после завершения функции.</li>
</ol>
[smart header="Тонкости спецификации"]
@ -144,8 +144,7 @@ say('Вася'); // Пока, Вася (**)
На момент первого запуска `(*)`, переменная `phrase` имела значение `'Привет'`, а ко второму `(**)` изменила его на `'Пока'`.
Это естественно, ведь для доступа к внешним переменным функция хранит ссылку `[[Scope]]` на весь внешний объект с ними, а не на каждое его свойство (переменную) по отдельности.
Это естественно, ведь для доступа к внешней переменной функция по ссылке `[[Scope]]` обращается во внешний объект переменных и берёт то значение, которое там есть на момент обращения.
## Вложенные функции
@ -182,7 +181,7 @@ getFullName.[[Scope]] = объект переменных текущего за
Благодаря этому `getFullName()` получает снаружи `firstName` и `lastName`.
Заметим, что если переменная не найдена во внешнем объекте переменных, то она ищется ещё более внешнем (через `[[Scope]]` внешней функции), то есть, такой пример тоже будет работать:
Заметим, что если переменная не найдена во внешнем объекте переменных, то она ищется в ещё более внешнем (через `[[Scope]]` внешней функции), то есть, такой пример тоже будет работать:
```js
//+ run