regexp renovations
This commit is contained in:
parent
b2f6df9d45
commit
bf85f46cf9
24 changed files with 311 additions and 132 deletions
|
@ -281,7 +281,7 @@ alert( 'Время walkLength: ' + bench(walkLength) + 'мс' );
|
|||
|
||||
Теперь представим себе, что во время первого бенчмаркинга `bench(walkIn)` компьютер что-то делал параллельно важное (вдруг) и это занимало ресурсы, а во время второго -- перестал. Реальная ситуация? Конечно реальна, особенно на современных ОС, где много процессов одновременно.
|
||||
|
||||
**Гораздо более надёжные результаты можно получить, весь пакет тестов прогнать много раз.**
|
||||
**Гораздо более надёжные результаты можно получить, если весь пакет тестов прогнать много раз.**
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
|
|
@ -121,7 +121,7 @@ if (x.getTime) {
|
|||
|
||||
## Полиморфизм
|
||||
|
||||
Пример полимофрной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому:
|
||||
Пример полиморфной функции -- `sayHi(who)`, которая будет говорить "Привет" своему аргументу, причём если передан массив -- то "Привет" каждому:
|
||||
|
||||
```js
|
||||
//+ run
|
||||
|
|
|
@ -166,6 +166,6 @@ for (var code in codes) {
|
|||
<ul>
|
||||
<li>Цикл по ключам: `for (key in obj)`.</li>
|
||||
<li>Порядок перебора соответствует порядку объявления для нечисловых ключей, а числовые -- сортируются (в современных браузерах).</li>
|
||||
<li>Для того, чтобы гарантировать перебор ключей в нужном порядке, их делают "нечисловыми", например добавляя в начало `+`, а потом, в процессе обработки, преобразуют ключи в числа.</li>
|
||||
<li>Если нужно, чтобы порядок перебора числовых ключей соответствовал их объявлению в объекте, то используют трюк: числовые ключи заменяют на похожие, но содержащие не только цифры. Например, добавляют в начало `+`, как описано в примере выше, а потом, в процессе обработки, преобразуют такие ключи в числа.</li>
|
||||
</ul>
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ fruits.push("Груша");
|
|||
alert( fruits ); // Яблоко, Апельсин, Груша
|
||||
```
|
||||
|
||||
Является полным аналогом `fruits[fruits.length] = ...`.
|
||||
Вызов `fruits.push(...)` равнозначен `fruits[fruits.length] = ...`.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
|
|
|
@ -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`), то второе такое же присваивание ничего не изменит.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue