fixes, renovations

This commit is contained in:
Ilya Kantor 2015-03-24 00:03:51 +03:00
parent 3889056599
commit bc34b2fc9d
133 changed files with 189 additions and 10 deletions

View file

@ -108,7 +108,7 @@ var family = marry({
``` ```
delete family.father; delete family.father;
delete family.wife.husband; delete family.mother.husband;
``` ```
Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `window`, объект остаётся жив. Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `window`, объект остаётся жив.

View file

@ -129,8 +129,9 @@ alert( +new Date() ); // valueOf: кол-во миллисекунд, проше
## Две стадии преобразования ## Две стадии преобразования
Итак, объект преобразован в примитив при помощи `toString` или `valueOf`. Далее, вполне возможно, Итак, объект преобразован в примитив при помощи `toString` или `valueOf`.
Если необходимо, что полученный из объекта примитив будет преобразован дальше, уже по правилам для примитивов.
Но на этом преобразования не обязательно заканчиваются. Вполне возможно, что в процессе вычислений этот примитив будет преобразован во что-то другое.
Например, рассмотрим применение к объекту операции `==`: Например, рассмотрим применение к объекту операции `==`:
@ -177,22 +178,28 @@ var b = {
} }
}; };
alert( a + b ); // "12"
alert( a - b ); // "1" - "2" = -1 alert( a - b ); // "1" - "2" = -1
``` ```
[warn header="Исключение: `Date`"] [warn header="Исключение: `Date`"]
Объект `Date`, по историческим причинам, является исключением. Объект `Date`, по историческим причинам, является исключением.
Бинарный оператор плюс `+` обычно использует числовое преобразование, но в случае с `Date` -- строковое: Бинарный оператор плюс `+` обычно использует числовое преобразование и метод `valueOf`. Как мы уже знаем, если подходящего `valueOf` нет (а его нет у большинства объектов), то используется `toString`, так что в итоге преобразование происходит к строке. Но если есть `valueOf`, то используется `valueOf`. Выше в примере как раз `a + b` это демонстрируют.
У объектов `Date` есть и `valueOf` и `toString`. Но оператор `+` для `Date` использует именно `toString` (хотя должен бы `valueOf`).
Это и есть исключение:
```js ```js
//+ run //+ run
// бинарный вариант, строчное преобразование // бинарный плюс, строчное преобразование
alert( new Date + "" ); // "строка даты" alert( new Date + "" ); // "строка даты"
// унарный вариант, как и - * /, приводит к числу // унарный плюс, как и - * /, приводит к числу
alert( +new Date ); // число миллисекунд alert( +new Date ); // число миллисекунд
``` ```
Других подобных исключений нет.
[/warn] [/warn]
[warn header="Как испугать Java-разработчика"] [warn header="Как испугать Java-разработчика"]

View file

@ -2,7 +2,7 @@
[importance 5] [importance 5]
Напишите *функцию-конструктор* `Calculator`, которая создает объект с двумя методами: Напишите *функцию-конструктор* `Calculator`, которая создает объект с тремя методами:
<ul> <ul>
<li>Метод `read()` запрашивает два значения при помощи `prompt` и запоминает их в свойствах объекта.</li> <li>Метод `read()` запрашивает два значения при помощи `prompt` и запоминает их в свойствах объекта.</li>
<li>Метод `sum()` возвращает сумму запомненных свойств.</li> <li>Метод `sum()` возвращает сумму запомненных свойств.</li>

View file

@ -283,6 +283,8 @@ alert( pete.birthday ); // и дата рождения доступна
alert( pete.age ); // и возраст alert( pete.age ); // и возраст
``` ```
Заметим, что `pete.age` снаружи как было свойством, так и осталось. То есть, переписывать внешний код на вызов функции `pete.age()` не нужно.
Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику. Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику.
## Другие методы работы со свойствами ## Другие методы работы со свойствами

View file

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

View file

@ -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\]`.

View file

@ -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]
```

Some files were not shown because too many files have changed in this diff Show more