Чтение онлайн

на главную - закладки

Жанры

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

10 + " objects" // => "10 objects". Число 10 преобразуется в строку

"7" * "4" // => 28: обе строки преобразуются в числа

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

n + " objects" // => "NaN objects": NaN преобразуется в строку "NaN"

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

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

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

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

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

String, Number
или
Boolean
.

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

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

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

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

"0" == 0 // Перед сравнением строка преобразуется в число.

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

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

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

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

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

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

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

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

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

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

Number("3") // => 3

String(false) // => "false" или можно использовать false.toString

Boolean([]) // => true

Object(3) // => new Number(3)

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

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

Определенные операторы в языке JavaScript неявно выполняют преобразования и иногда могут использоваться для преобразования типов. Если один из операндов оператора

+
является строкой, то другой операнд также преобразуется в строку. Унарный оператор
+
преобразует свой операнд в число. А унарный оператор
!
преобразует операнд в логическое значение и инвертирует его. Все это стало причиной появления следующих своеобразных способов преобразования типов, которые можно встретить на практике:

x + "" // То же, что и String(х)

+x // То же, что и Number(x). Можно также встретить x-0

!!x //То же, что и Boolean(x). Обратите внимание на два знака !

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

Метод

toString
класса
Number
принимает необязательный аргумент, определяющий основание системы счисления для преобразования. Если этот аргумент не определен, преобразование выполняется в десятичной системе счисления. Но вы можете производить преобразование в любой системе счисления (с основанием от 2 до 36). Например:

var n = 17;

binary_string = n.toString(2); // Вернет "10001"

Поделиться:
Популярные книги

Антракт. Поминки. Жизнеописание. Шатало

Эдлис Юлиу
5.00
рейтинг книги
Антракт. Поминки. Жизнеописание. Шатало

Универсальный энциклопедический справочник

Исаева Елена Львовна
Справочная литература:
справочники
энциклопедии
5.00
рейтинг книги
Универсальный энциклопедический справочник

Арбан Саеш. Трилогия

Малицкий Сергей Вацлавович
50. В одном томе
Фантастика:
фэнтези
8.17
рейтинг книги
Арбан Саеш. Трилогия

Официант-бармен. Пособие для учащихся средних профессионально-технических училищ

Барановский Виктор Александрович
Научно-образовательная:
прочая научная литература
5.00
рейтинг книги
Официант-бармен. Пособие для учащихся средних профессионально-технических училищ

100 легенд рока. Живой звук в каждой фразе

Цалер Игорь
Документальная литература:
биографии и мемуары
7.50
рейтинг книги
100 легенд рока. Живой звук в каждой фразе

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Случайности Судьбы. О том, как все начиналось…

Нитина Мария Константиновна
Фантастика:
фэнтези
юмористическое фэнтези
ироническое фэнтези
8.85
рейтинг книги
Случайности Судьбы. О том, как все начиналось…

Добыча. Всемирная история борьбы за нефть, деньги и власть

Ергин Дэниел
Документальная литература:
публицистика
5.00
рейтинг книги
Добыча. Всемирная история борьбы за нефть, деньги и власть

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

РКВМФ перед грозным испытанием

Иринархов Руслан Сергеевич
Неизвестные войны
Научно-образовательная:
военная история
5.00
рейтинг книги
РКВМФ перед грозным испытанием

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Адепт

Я иду искать. История третья и четвертая

Верещагин Олег Николаевич
3. Я иду искать
Фантастика:
боевая фантастика
6.25
рейтинг книги
Я иду искать. История третья и четвертая

Гром Раскатного. Том 6

Володин Григорий Григорьевич
6. Штормовой Предел
Фантастика:
боевая фантастика
городское фэнтези
попаданцы
аниме
6.25
рейтинг книги
Гром Раскатного. Том 6

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.25
рейтинг книги
Потомок бога