В чем разница между 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:
- если защита с помощью if (val) перед попыткой преобразования в number, то parseFloat () вернет число, за исключением случая пробела.
- Number возвращает число во всех случаях, за исключением нечисловых символов, кроме пробела.
пожалуйста, не стесняйтесь добавлять любые тестовые случаи, которые могут отсутствовать.