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

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

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

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

5 ответов


нет. Оба приведут к внутреннему ToNumber(string) функция вызывается.

С 15.7.2 (Количество Конструктор):

, когда Number вызывается как часть new expression это конструктор: он инициализирует вновь созданный объект.


внутренняя работа не так уж отличается, как уже ответил @James Allardic. Но есть разница. Используя parseFloat, (обрезанная) строка, начинающаяся с одного или нескольких числовых символов, за которыми следуют буквенно-цифровые символы, может преобразовываться в число, с Number это не удастся. Как в:

parseFloat('3.23abc'); //=> 3.23
Number('3.23abc'); //=> NaN

в обоих преобразованиях входная строка обрезается, кстати:

parseFloat('  3.23abc '); //=> 3.23
Number('   3.23 '); //=> 3.23

не очень большая разница, если вы уверены, что в вашей строке нет ничего, кроме цифр. Если есть, Number вернутся NaN.
еще одна проблема, которую вы можете получить с помощью Number конструктор заключается в том, что коллеги могут подумать, что вы забыли new ключевое слово, и добавьте его позже, вызывая строгие сравнения с ошибкой new Number(123) === 123 --> false тогда как Number(123) === 123 --> true.

в общем, я предпочитаю оставить Number конструктор для чего он есть, и просто используйте самый короткий синтаксис -cast к int / float:+numString, или использовать parse*.


если вы не используете new чтобы создать объект-оболочку для числового значения,Number сводится к простому преобразованию типа из строки в число.

'parseFloat' с другой стороны, как вы упомянули, может анализировать число с плавающей запятой из любой строки, которая начинается с цифры, десятичного или +/-

Итак, если вы работаете только со строками, содержащими только числовые значения,Number(x) и parseFloat(x) приведет к тем же значениям


пожалуйста, извините меня за публикацию еще одного ответа, но я только что попал сюда через поиск 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

некоторые примечательные takeaways:

  1. если защита с помощью if (val) перед попыткой преобразования в number, то parseFloat () вернет число, за исключением случая пробела.
  2. Number возвращает число во всех случаях, за исключением нечисловых символов, кроме пробела.

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