fixes, renovations
|
@ -108,7 +108,7 @@ var family = marry({
|
|||
|
||||
```
|
||||
delete family.father;
|
||||
delete family.wife.husband;
|
||||
delete family.mother.husband;
|
||||
```
|
||||
|
||||
Обратим внимание, удаление только одной из этих ссылок ни к чему бы не привело. Пока до объекта можно добраться из корня `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
|
||||
```
|
||||
|
||||
[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-разработчика"]
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
[importance 5]
|
||||
|
||||
Напишите *функцию-конструктор* `Calculator`, которая создает объект с двумя методами:
|
||||
Напишите *функцию-конструктор* `Calculator`, которая создает объект с тремя методами:
|
||||
<ul>
|
||||
<li>Метод `read()` запрашивает два значения при помощи `prompt` и запоминает их в свойствах объекта.</li>
|
||||
<li>Метод `sum()` возвращает сумму запомненных свойств.</li>
|
||||
|
|
|
@ -283,6 +283,8 @@ alert( pete.birthday ); // и дата рождения доступна
|
|||
alert( pete.age ); // и возраст
|
||||
```
|
||||
|
||||
Заметим, что `pete.age` снаружи как было свойством, так и осталось. То есть, переписывать внешний код на вызов функции `pete.age()` не нужно.
|
||||
|
||||
Таким образом, `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 |