Skip to content

Commit

Permalink
fixes, renovations
Browse files Browse the repository at this point in the history
  • Loading branch information
iliakan committed Mar 23, 2015
1 parent 3889056 commit bc34b2f
Show file tree
Hide file tree
Showing 133 changed files with 189 additions and 10 deletions.
2 changes: 1 addition & 1 deletion 1-js/5-functions-closures/6-memory-management/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ var family = marry({

```
delete family.father;
delete family.wife.husband;
delete family.mother.husband;
```

Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `window`, объект остаётся жив.
Expand Down
17 changes: 12 additions & 5 deletions 1-js/6-objects-more/2-object-conversion/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,9 @@ alert( +new Date() ); // valueOf: кол-во миллисекунд, проше

## Две стадии преобразования

Итак, объект преобразован в примитив при помощи `toString` или `valueOf`. Далее, вполне возможно,
Если необходимо, что полученный из объекта примитив будет преобразован дальше, уже по правилам для примитивов.
Итак, объект преобразован в примитив при помощи `toString` или `valueOf`.

Но на этом преобразования не обязательно заканчиваются. Вполне возможно, что в процессе вычислений этот примитив будет преобразован во что-то другое.

Например, рассмотрим применение к объекту операции `==`:

Expand Down Expand Up @@ -177,22 +178,28 @@ var b = {
}
};

alert( a + b ); // "12"
alert( a - b ); // "1" - "2" = -1
```

[warn header="Исключение: `Date`"]
Объект `Date`, по историческим причинам, является исключением.

Бинарный оператор плюс `+` обычно использует числовое преобразование, но в случае с `Date` -- строковое:
Бинарный оператор плюс `+` обычно использует числовое преобразование и метод `valueOf`. Как мы уже знаем, если подходящего `valueOf` нет (а его нет у большинства объектов), то используется `toString`, так что в итоге преобразование происходит к строке. Но если есть `valueOf`, то используется `valueOf`. Выше в примере как раз `a + b` это демонстрируют.

У объектов `Date` есть и `valueOf` и `toString`. Но оператор `+` для `Date` использует именно `toString` (хотя должен бы `valueOf`).

Это и есть исключение:

```js
//+ run
// бинарный вариант, строчное преобразование
// бинарный плюс, строчное преобразование
alert( new Date + "" ); // "строка даты"

// унарный вариант, как и - * /, приводит к числу
// унарный плюс, как и - * /, приводит к числу
alert( +new Date ); // число миллисекунд
```
Других подобных исключений нет.
[/warn]

[warn header="Как испугать Java-разработчика"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[importance 5]

Напишите *функцию-конструктор* `Calculator`, которая создает объект с двумя методами:
Напишите *функцию-конструктор* `Calculator`, которая создает объект с тремя методами:
<ul>
<li>Метод `read()` запрашивает два значения при помощи `prompt` и запоминает их в свойствах объекта.</li>
<li>Метод `sum()` возвращает сумму запомненных свойств.</li>
Expand Down
2 changes: 2 additions & 0 deletions 1-js/6-objects-more/4-descriptors-getters-setters/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,8 @@ alert( pete.birthday ); // и дата рождения доступна
alert( pete.age ); // и возраст
```

Заметим, что `pete.age` снаружи как было свойством, так и осталось. То есть, переписывать внешний код на вызов функции `pete.age()` не нужно.

Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику.

## Другие методы работы со свойствами
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

Открывающий тег -- это <code class="pattern">\[(b|url|quote)\]</code>.

Для того, чтобы найти всё до закрывающего -- используем ленивый поиск <code class="pattern">[\s\S]*?</code> и обратную ссылку на открывающий тег.

Итого, получится: <code class="pattern">\[(b|url|quote)\][\s\S]*?\[/\1\]</code>.

В действии:

```js
//+ run
var re = /\[(b|url|quote)\][\s\S]*?\[\/\1\]/g;

var str1 = "..[url]http://ya.ru[/url]..";
var str2 = "..[url][b]http://ya.ru[/b][/url]..";

alert( str1.match(re) ); // [url]http://ya.ru[/url]
alert( str2.match(re) ); // [url][b]http://ya.ru[/b][/url]
```

Для закрывающего тега `[/1]` понадобилось дополнительно экранировать слеш: `\[\/1\]`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Найдите пары тегов

ББ-тег имеет вид `[имя]...[/имя]`, где имя -- слово, одно из: `b`, `url`, `quote`.

Например:
```
[b]текст[/b]
[url]http://ya.ru[/url]
```

ББ-теги могут быть вложенными, но сам в себя тег быть вложен не может, например:

```
Допустимо:
[url] [b]http://ya.ru[/b] [/url]
[quote] [b]текст[/b] [/quote]
Нельзя:
[b][b]текст[/b][/b]
```

Создайте регулярное выражение для поиска ББ-тегов и их содержимого.

Например:

```js
var re = /* регулярка */

var str = "..[url]http://ya.ru[/url]..";
alert( str.match(re) ); // [url]http://ya.ru[/url]
```

Если теги вложены, то нужно искать самый внешний тег (при желании можно будет продолжить поиск в его содержимом):

```js
var re = /* регулярка */

var str = "..[url][b]http://ya.ru[/b][/url]..";
alert( str.match(re) ); // [url][b]http://ya.ru[/b][/url]
```

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Регулярное выражение для поиска 3-значного цвета: <code class="pattern">/#[a-f0-9]{3}/i</code>.

Нужно добавить ещё три символа, причём нужны именно три, четыре или семь символов не нужны. Эти три символа либо есть, либо нет.

Самый простой способ добавить -- просто дописать в конец регэкспа: <code class="pattern">/#[a-f0-9]{3}([a-f0-9]{3})?/i</code>

Можно поступить и хитрее: <code class="pattern">/#([a-f0-9]{3}){1,2}/i</code>.

Здесь регэксп <code class="pattern">[a-f0-9]{3}</code> заключён в скобки, чтобы квантификатор <code class="pattern">{1,2}</code> применялся целиком ко всей этой структуре.

В действии:
```js
//+ run
var re = /#([a-f0-9]{3}){1,2}/gi;

var str = "color: #3f3; background-color: #AA00ef; and: #abcd";

alert( str.match(re) ); // #3f3 #AA0ef #abc
```


Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Найдите цвет в формате #abc или #abcdef

Напишите регулярное выражение, которое находит цвет в формате `#abc` или `#abcdef`. То есть, символ `#`, после которого идут 3 или 6 шестнадцатиричных символа.

Пример использования:
```js
var re = /* ваш регэксп */

var str = "color: #3f3; background-color: #AA00ef; and: #abcd";

alert( str.match(re) ); // #3f3 #AA0ef
```

P.S. Значения из четырёх и более букв, такие как `#abcd` мы в этой задаче также учитываем, но берём из них только необходимые для совпадения символы, то есть `#abc`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
Регулярное выражение для числа, возможно, дробного и отрицательного: <code class="pattern">-?\d+(\.\d+)?</code>. Мы уже разбирали его в предыдущих задачах.

Оператор -- это <code class="pattern">[-+*/]</code>. Заметим, что дефис <code class="pattern">-</code> идёт в списке первым, так как на любой позиции, кроме первой и последней, он имеет специальный смысл внутри <code class="pattern">[...]</code>, и его понадобилось бы экранировать.

Кроме того, когда мы оформим это в JavaScript-синтаксис <code class="pattern">/.../</code> -- понадобится заэкранировать слэш <code class="pattern">/</code>.

Нам нужно число, затем оператор, затем число, и необязательные пробелы между ними.

Полное регулярное выражение будет таким: <code class="pattern">-?\d+(\.\d+)?\s*[-+*/]\s*-?\d+(\.\d+)?</code>.

Чтобы получить результат в виде массива, добавим скобки вокруг тех данных, которые нам интересны, то есть -- вокруг чисел и оператора: <code class="pattern">(-?\d+(\.\d+)?)\s*([-+*/])\s*(-?\d+(\.\d+)?)</code>.

Посмотрим в действии:
```js
//+ run
var re = /(-?\d+(\.\d+)?)\s*([-+*\/])\s*(-?\d+(\.\d+)?)/;

alert( "1.2 + 12".match(re) );
```

Итоговый массив будет включать в себя компоненты:

<ul>
<li>`result[0] == "1.2 + 12"` (вначале всегда полное совпадение)</li>
<li>`result[1] == "1"` (первая скобка)</li>
<li>`result[2] == "2"` (вторая скобка -- дробная часть `(\.\d+)?`)</li>
<li>`result[3] == "+"` (...)</li>
<li>`result[4] == "12"` (...)</li>
<li>`result[5] == undefined` (последняя скобка, но у второго числа дробная часть отсутствует)</li>
</ul>

Нам из этого массива нужны только числа и оператор. А, скажем, дробная часть сама по себе -- не нужна.

Уберём её из запоминания, добавив в начало скобки <code class="pattern">?:</code>, то есть: <code class="pattern">(?:\.\d+)?</code>.

Итого, решение:

```js
//+ run
function parse(expr) {
var re = /(-?\d+(?:\.\d+)?)\s*([-+*\/])\s*(-?\d+(?:\.\d+)?)/;

var result = expr.match(re);

if (!result) return;
result.shift();

return result;
}

alert( parse("-1.23 * 3.45") ); // -1.23, *, 3.45
```

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Разобрать выражение

Арифметическое выражение состоит из двух чисел и операции между ними, например:
<ul>
<li>`1 + 2`</li>
<li>`1.2 * 3.4`</li>
<li>`-3 / -6`</li>
<li>-2 - 2`</li>
</ul>

Список операций: `"+"`, `"-"`, `"*"` и `"/"`.

Также могут присутсововать пробелы вокруг оператора и чисел.

Напишите функцию, которая будет получать выражение и возвращать массив из трёх аргументов:
<ol>
<li>Первое число.</li>
<li>Оператор.</li>
<li>Второе число.</li>
</ul>
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#text {
display: block;
height: 100px;
width: 400px;
width: 456px;
}

#table th {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#text {
display: block;
height: 100px;
width: 400px;
width: 456px;
}

#table th {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#text {
display: block;
height: 100px;
width: 400px;
width: 456px;
}

#table th {
Expand Down
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes.
File renamed without changes.

0 comments on commit bc34b2f

Please sign in to comment.