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

<b>  for(var і = 0; і &lt; a.length; і++) // Цикл по всем элементам</b>

<b>    if (а[і] !== b[i]) return false; // Если хоть один элемент</b>

<b>                // отличается, массивы не равны </b>

<b>  return true;  // Иначе они равны</b>

<b>}</b>

3.8. Преобразование типов

JavaScript может гибко преобразовывать один тип в другой. Мы уже могли убедиться в этом на примере логических значений: везде, где интерпретатор JavaScript ожидает получить логическое значение, можно указать значение любого типа и JavaScript автоматически выполнит необходимое преобразование. Одни значения («истинные» значения) преобразуются в значение

<b>true</b>
, а другие («ложные») - в
<b>false</b>
. То же относится и к другим типам: если интерпретатор ожидает получить строку, он автоматически преобразует любое другое значение в строку. Если интерпретатор ожидает получить число, он попробует преобразовать имеющееся значение в число (в случае невозможности такого преобразования будет получено значение
<b>NaN</b>
). Например:

<b>10 + &quot; objects&quot; // =&gt; &quot;10 objects&quot;. Число 10 преобразуется в строку </b>

<b>&quot;7&quot; * &quot;4&quot; // =&gt; 28: обе строки преобразуются в числа</b>

<b>var n = 1 - &quot;x&quot;; // =&gt; NaN: строка &quot;x&quot; не может быть преобразована в число </b>

<b>n + &quot; objects&quot; // =&gt; &quot;NaN objects&quot;: NaN преобразуется в строку &quot;NaN&quot;</b>

В табл. 3.2 описывается, как в JavaScript выполняется преобразование значений из одного типа в другой. Жирным шрифтом в таблице выделены значения, соответствующие преобразованиям, которые могут преподносить сюрпризы. Пустые ячейки соответствуют ситуациям, когда преобразование не требуется и не выполняется.

Преобразования одного простого типа в другой, показанные в табл. 3.2, выполняются относительно просто. Преобразование в логический тип уже обсуждалось в разделе 3.3. Преобразование всех простых типов в строку четко определено. Преобразование в число выполняется немного сложнее. Строки, которые могут быть преобразованы в числа, преобразуются в числа. В строке допускается наличие пробельных символов в начале и в конце, но присутствие других непробельных символов, которые не могут быть частью числа, при преобразовании строки в число приводят к возврату значения

<b>NaN</b>
. Некоторые особенности преобразования значений в числа могут показаться странными: значение
<b>true</b>
преобразуется в число 1, а значение
<b>false</b>
и пустая строка "" преобразуются в 0.

Преобразование простых типов в объекты также выполняется достаточно просто: значения простых типов преобразуются в соответствующие объекты-обертки (раздел 3.6), как если бы вызывался конструктор

<b>String(), Number()</b>
или
<b>Boolean()</b>
.

Преобразование объектов в простые типы выполняется значительно сложнее и является темой обсуждения раздела 3.8.3.

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

3.8.1. Преобразования и равенство

Благодаря гибкости преобразований типов в JavaScript оператор равенства == также гибко определяет равенство значений. Например, все следующие сравнения возвращают true:

<b>null == undefined // Эти два значения считаются равными.</b>

<b>&quot;0&quot; == 0          // Перед сравнением строка преобразуется в число.</b>

<b>0 == false        // Перед сравнением логич. значение преобразуется в число.</b>

<b>&quot;0&quot; == false      // Перед сравнением оба операнда преобразуются в числа.</b>

В разделе 4.9.1 четко описывается, какие преобразования выполняет оператор

<b>==</b>
, чтобы определить, являются ли два значения равными, и в этом же разделе описывается оператор идентичности
<b>===</b>
, который не выполняет никаких преобразований перед сравнением.

Имейте в виду, что возможность преобразования одного значения в другое не означает равенства этих двух значений. Если, например, в логическом контексте используется значение

<b>undefined</b>
, оно будет преобразовано в значение
<b>false</b>
. Но это не означает, что
<b>undefined == false</b>
. Операторы и инструкции JavaScript ожидают получить значения определенных типов и выполняют преобразования в эти типы. Инструкция
<b>if</b>
преобразует значение
<b>undefined</b>
в
<b>false</b>
, но оператор
<b>==</b>
никогда не пытается преобразовать свои операнды в логические значения.

3.8.2. Явные преобразования

Несмотря на то что многие преобразования типов JavaScript выполняет автоматически, иногда может оказаться необходимым выполнить преобразование явно или окажется предпочтительным выполнить явное преобразование, чтобы обеспечить ясность программного кода.

Простейший способ выполнить преобразование типа явно заключается в использовании функций

<b>Boolean(), Number(), String()</b>
и
<b>Object().</b>
Мы уже видели, как эти функции используются в роли конструкторов объектов-оберток (раздел 3.6). При вызове без оператора
<b>new</b>
они действуют как функции преобразования и выполняют преобразования, перечисленные в табл. 3.2:

<b>Number(&quot;3&quot;) // =&gt; 3</b>

<b>String(false) // =&gt; &quot;false&quot; или можно использовать false.toString()</b>

<b>Boolean([]) // =&gt; true</b>

<b>Object(3) // =&gt; new Number(3)</b>

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

<b>null</b>
или
<b>undefined</b>
, имеют метод
<b>toString()</b>
, результатом которого обычно является то же значение, которое возвращается функцией
<b>String()</b>
. Кроме того, обратите внимание, что в табл. 3.2 отмечается, что при попытке преобразовать значение
<b>null</b>
или
<b>undefined</b>
в объект возбуждается ошибка
<b>ТуреЕrror</b>
. Функция
<b>Object()</b>
в этом случае не возбуждает исключение, вместо этого она просто возвращает новый пустой объект.