В чем разница между Number (...) и parseFloat (...) - программирование

В чем разница между Number (...) и parseFloat (...)

В чем разница между parseInt (string) и Number (string) в JavaScript ранее задавалась.

Но ответы в основном были сосредоточены на radix и способности parseInt взять строку как "123htg" и превратить ее в 123.

То, что я задаю здесь, заключается в том, что существует большая разница между результатами возврата Number(...) и parseFloat(...) при передаче строки фактического номера без каких-либо оснований.

4b9b3361

Ответ 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() вернет число, за исключением случая с пробелом.
  • Число возвращает число во всех случаях, за исключением нечисловых символов, кроме белого пробела.

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