Преобразование к типу Number
Явное преобразование к числовому типу выполняется с помощью функции Number()
— то есть по тому же принципу, который используется для типовBoolean
и String
.
Неявное приведение значения к числовому типу — тема более сложная, так как оно применяется, пожалуй, чаще чем преобразование в строку или в логическое значение. А именно, преобразование к типу Number
выполняют следующие операторы:
--- Операторы сравнения (>
, <
, <=
, >=
).
--- Побитовые операторы (|
, &
, ^
, ~
).
--- Арифметические операторы (-
, +
, *
, /
, %
). Обратите внимание на то, что оператор +
с двумя операндами не вызывает неявное преобразование к числовому типу, если хотя бы один оператор является строкой.
--- Унарный оператор+
.
--- Оператор нестрогого равенства==
(а также !=
). Обратите внимание на то, что оператор ==
не производит неявного преобразования в число, если оба операнда являются строками.
Number('123') // явное преобразование
+'123' // неявное преобразование
123 != '456' // неявное преобразование
4 > '5' // неявное преобразование
5/null // неявное преобразование
true | 0 // неявное преобразование
Вот как в числа преобразуются примитивные значения:
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number(" 12 ") // 12
Number("-12.34") // -12.34
Number("\n") // 0
Number(" 12s ") // NaN
Number(123) // 123
При преобразовании строк в числа система сначала обрезает пробелы, а также символы\n
и \t
, находящиеся в начале или в конце строки, и возвращает NaN
, если полученная строка не является действительным числом. Если строка пуста — возвращается 0
.
Значения null
и undefined
обрабатываются иначе: null
преобразуется в 0
, в то время как undefined
превращается в NaN
.
Специальные значения
Посмотрим на поведение специальных значений более внимательно.
Интуитивно, значенияnull/undefined
ассоциируются с нулём, но при преобразованиях ведут себя иначе.
Специальные значения преобразуются к числу так:
undefined |
NaN |
---|---|
null |
0 |
Это преобразование осуществляется при арифметических операциях и сравнениях >, >=, <, <=,
но не при проверке равенства ==
. Алгоритм проверки равенства для этих значений в спецификации прописан отдельно (пункт 11.9.3). В нём считается, что null
и undefined
равны "=="
между собой, но эти значения не равны никакому другому значению.
Это ведёт к забавным последствиям.
Например,null
не подчиняется законам математики – он «больше либо равен нулю»:null>=0
, но не больше и не равен:
alert( null >= 0 ); // true, т.к. null преобразуется к 0
alert( null > 0 ); // false (не больше), т.к. null преобразуется к 0
alert( null == 0 ); // false (и не равен!), т.к. == рассматривает null особо.
Значение undefined
вообще «несравнимо»:
alert( undefined > 0 ); // false, т.к. undefined -> NaN
alert( undefined == 0 ); // false, т.к. это undefined (без преобразования)
alert( undefined < 0 ); // false, т.к. undefined -> NaN
Значение NaN
не равно ничему, включая себя. В следующем примере, если значение не равно самому себе, значит мы имеем дело с NaN
if (value !== value) { console.log("we're dealing with NaN here") }