JavaScript. Подробное руководство, 6-е издание, стр. 29

• В противном случае возбуждается исключение ТуреError.

Описанный алгоритм преобразования объекта в число объясняет, почему пустой массив преобразуется в число 0, а массив с единственным элементом может быть преобразован в обычное число. Массивы наследуют по умолчанию метод

<b>valueOf(),</b>
который возвращает сам объект, а не простое значение, поэтому при преобразовании массива в число интерпретатор опирается на метод
<b>toString().</b>
Пустые массивы преобразуются в пустую строку. А пустая строка преобразуется в число 0. Массив с единственным элементом преобразуется в ту же строку, что и единственный элемент массива. Если массив содержит единственное число, это число преобразуется в строку, а затем опять в число.

Оператор + в языке JavaScript выполняет сложение чисел и конкатенацию строк. Если какой-либо из его операндов является объектом, JavaScript преобразует объект, используя специальное преобразование объекта в простое значение вместо преобразования объекта в число, используемого другими арифметическими операторами. То же относится и к оператору равенства

<b>==</b>
. Если выполняется сравнение объекта с простым значением, оператор выполнит преобразование объекта с использованием правил преобразования в простое значение.

Преобразование объектов в простые значения, используемое операторами

<b>+</b>
и
<b>==</b>
, предусматривает особый подход для объектов
<b>Date</b>
. Класс
<b>Date</b>
является единственным типом данных в базовом JavaScript, который определяет осмысленные преобразования и в строку, и в число. Преобразование любого объекта, не являющегося датой, в простое значение основано на преобразовании в число (когда первым применяется метод
<b>valueOf()</b>
), тогда как для объектов типа
<b>Date</b>
используется преобразование в строку (первым применяется метод
<b>toString()</b>
). Однако преобразование выполняется не совсем так, как было описано выше: простое значение, возвращаемое методом
<b>valueOf()</b>
или
<b>toString(),</b>
используется непосредственно, без дополнительного преобразования в число или в строку.

Оператор

<b>&lt;</b>
и другие операторы отношений выполняют преобразование объектов в простые значения подобно оператору
<b>==</b>
, но не выделяя объекты Date: для любого объекта сначала предпринимается попытка применить метод
<b>valueOf()</b>
, а затем метод
<b>toString()</b>
. Любое простое значение, полученное таким способом, используется непосредственно, без дальнейшего преобразования в число или в строку.

<b>+, ==, !=</b>
и операторы отношений являются единственными, выполняющими специальное преобразование строки в простое значение. Другие операторы выполняют более явные преобразования в заданный тип и не предусматривают специальной обработки объектов
<b>Date</b>
. Оператор
<b>-</b>
, например, преобразует свои операнды в числа. Следующий фрагмент демонстрирует поведение операторов
<b>+, -, ==</b>
и
<b>&gt;</b>
при работе с объектами
<b>Date</b>
:

<b>var now = new Date(); // Создать объект Date</b>

<b>typeof (now +1) // =&gt; &quot;строка&quot;: + преобразует дату в строку</b>

<b>typeof (now - 1) // =&gt; &quot;число&quot;: - выполнит преобразование объекта в число</b>

<b>now == now.toString() // =&gt; true: неявное и явное преобразование в строку </b>

<b>now &gt; (now -1) // =&gt; true: &gt; преобразует объект Date в число</b>

3.9. Объявление переменных

Прежде чем использовать переменную в JavaScript, ее необходимо объявить. Переменные объявляются с помощью ключевого слова var следующим образом:

var і;

var sum;

Один раз использовав ключевое слово var, можно объявить несколько переменных:

var і, sum;

Объявление переменных можно совмещать с их инициализацией:

var message = "hello";

var i = 0, j = 0. k = 0;

Если начальное значение в инструкции var не задано, то переменная объявляется, но ее начальное значение остается неопределенным (

<b>undefined</b>
), пока не будет изменено программой.

Обратите внимание, что инструкция

<b>var</b>
также может включаться в циклы
<b>for</b>
и
<b>for/in</b>
(о которых рассказывается в главе 5), что позволяет объявлять переменную цикла непосредственно в самом цикле. Например:

<b>for(var і = 0; і &lt; 10; i++) console.log(i);</b>

<b>for(var і = 0, j=10; і &lt; 10; i++,J —) console.log(i*j);</b>

<b>for(var p in o) console.log(p);</b>

Если вы имеете опыт использования языков программирования со статическими типами данных, таких как С или Java, то можете заметить, что в объявлениях переменных в языке JavaScript отсутствует объявление типа. Переменные в языке JavaScript могут хранить значения любых типов. Например, в JavaScript допускается присвоить некоторой переменной число, а затем этой же переменной присвоить строку:

<b>var і = 10;</b>

<b> і = &quot;ten&quot;;</b>

3.9.1 Повторные и опущенные объявления

С помощью инструкции var МОЖНО объявить одну и ту же переменную несколько раз. Если повторное объявление содержит инициализатор, то оно действует как обычная инструкция присваивания.

Если попытаться прочитать значение необъявленной переменной, JavaScript сгенерирует ошибку. В строгом режиме, предусмотренном стандартом ECMAScript 5 (раздел 5.7.3), ошибка также возбуждается при попытке присвоить значение необъявленной переменной. Однако исторически и при выполнении не в строгом режиме, если присвоить значение переменной, не объявленной с помощью инструкции

<b>var</b>
, то JavaScript создаст эту переменную как свойство глобального объекта, и она будет действовать практически так же (но с некоторыми отличиями, описываемыми в разделе 3.10.2), как корректно объявленная переменная. Это означает, что глобальные переменные можно не объявлять. Однако это считается дурной привычкой и может явиться источником ошибок, поэтому всегда старайтесь объявлять свои переменные с помощью
<b>var</b>
.