fixes, renovations
|
@ -108,7 +108,7 @@ var family = marry({
|
||||||
|
|
||||||
```
|
```
|
||||||
delete family.father;
|
delete family.father;
|
||||||
delete family.wife.husband;
|
delete family.mother.husband;
|
||||||
```
|
```
|
||||||
|
|
||||||
Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `window`, объект остаётся жив.
|
Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `window`, объект остаётся жив.
|
||||||
|
|
|
@ -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-разработчика"]
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -283,6 +283,8 @@ alert( pete.birthday ); // и дата рождения доступна
|
||||||
alert( pete.age ); // и возраст
|
alert( pete.age ); // и возраст
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Заметим, что `pete.age` снаружи как было свойством, так и осталось. То есть, переписывать внешний код на вызов функции `pete.age()` не нужно.
|
||||||
|
|
||||||
Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику.
|
Таким образом, `defineProperty` позволяет нам начать с обычных свойств, а в будущем, при необходимости, можно в любой момент заменить их на функции, реализующие более сложную логику.
|
||||||
|
|
||||||
## Другие методы работы со свойствами
|
## Другие методы работы со свойствами
|
||||||
|
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
@ -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\]`.
|
|
@ -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]
|
||||||
|
```
|
||||||
|
|
Before Width: | Height: | Size: 1 KiB After Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |