В чем разница между Number (...) и parseFloat (...)
В чем разница между parseInt (string) и Number (string) в JavaScript ранее задавалась.
Но ответы в основном были сосредоточены на radix
и способности parseInt
взять строку как "123htg"
и превратить ее в 123
.
То, что я задаю здесь, заключается в том, что существует большая разница между результатами возврата Number(...)
и parseFloat(...)
при передаче строки фактического номера без каких-либо оснований.
Ответы
Ответ 1
Нет. Оба будут вызывать внутреннюю функцию ToNumber(string)
.
От Раздел ES5 15.7.1 (Конструктор чисел, вызываемый как функция):
Когда Number
вызывается как функция, а не как конструктор, он выполняет преобразование типа...
Возвращает значение Number (а не объект Number), вычисленное ToNumber(value)
, если значение было предоставлено, else возвращает +0
.
От раздел ES5 15.1.2.3 (parseFloat (строка)):
... Если ни trimmedString
, ни префикс trimmedString
не удовлетворяют синтаксису StrDecimalLiteral
(см. 9.3.1)...
И 9.3.1 - это раздел под названием "ToNumber Applied to String Type", который является первой цитатой, относящейся к тому, когда это говорит ToNumber(value)
.
Обновление (см. комментарии)
Вызывая конструктор Number
с помощью оператора new
, вы получите экземпляр объекта Number
, а не числовой литерал. Например:
typeof new Number(10); //object
typeof Number(10); //number
Это определено в разделе раздел 15.7.2 (Конструктор чисел):
Когда Number
вызывается как часть выражения new
, он является конструктором: он инициализирует вновь созданный объект.
Ответ 2
Внутренняя работа не такая уж иная, как уже ответил @James Allardic. Однако есть разница. Используя parseFloat
, строка (обрезанная), начинающаяся с одного или нескольких числовых символов, сопровождаемых буквенно-цифровыми символами, может преобразовать в число с Number
, которая не будет выполнена. Как в:
parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN
В обоих преобразованиях строка ввода обрезается, кстати:
parseFloat(' 3.23abc '); //=> 3.23
Number(' 3.23 '); //=> 3.23
Ответ 3
Не большая разница, если вы уверены, что в строке нет ничего, кроме цифр. Если есть, Number
вернет NaN
.
Еще одна проблема, которая может возникнуть при использовании конструктора Number
, состоит в том, что сотрудники могут подумать, что вы забыли ключевое слово new
, и добавьте его позже, в результате чего строгое сравнение с ошибкой new Number(123) === 123
→ false, тогда как Number(123) === 123
→ true.
В общем, я предпочитаю оставить конструктор Number
для того, что он есть, и просто использовать кратчайший синтаксис, который нужно передать в int/float: +numString
или использовать parse*
.
Ответ 4
Если вы не используете new
для создания объекта-оболочки для числового значения, Number
отбрасывается на простое преобразование типов из строки в число.
'parseFloat', с другой стороны, как вы сказали, может анализировать число с плавающей запятой из любой строки, которая начинается с цифры, десятичной или +/-
Итак, если вы работаете только со строками, которые содержат только числовые значения, Number(x)
и parseFloat(x)
приведут к тем же значениям
Ответ 5
Пожалуйста, извините, что я опубликовал еще один ответ, но я только что попал сюда через поиск Google и не нашел всех деталей, которые я хотел. Выполнение следующего кода в Node.js:
var vals = ["1", "1.1", "0", "1.1abc", "", " ", null];
for(var i = 0; i < vals.length; i++){
var ifTest = false;
if(vals[i])
{
ifTest = true;
}
console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest);
}
дает следующий результат:
val=1, Number()=1, parseFloat()=1, if()=true
val=1.1, Number()=1.1, parseFloat()=1.1, if()=true
val=0, Number()=0, parseFloat()=0, if()=true
val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true
val=, Number()=0, parseFloat()=NaN, if()=false
val= , Number()=0, parseFloat()=NaN, if()=true
val=null, Number()=0, parseFloat()=NaN, if()=false
Некоторые примечательные вынос:
- Если вы защитите с помощью if (val), прежде чем пытаться преобразовать в число, тогда parseFloat() вернет число, за исключением случая с пробелом.
- Число возвращает число во всех случаях, за исключением нечисловых символов, кроме белого пробела.
Пожалуйста, не стесняйтесь добавлять какие-либо тестовые примеры, которые могут отсутствовать.