Преобразование к типу 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") }

results matching ""

    No results matching ""