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

@ -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-разработчика"]