Есть ли какие-либо побочные эффекты использования этого метода для преобразования строки в целое число
Есть ли побочные эффекты, если я преобразую строку в число, как показано ниже?
var numb=str*1;
Если я проверю с кодом ниже, он говорит, что это число..
var str="123";
str=str*1;
if(!isNaN(str))
{
alert('Hello');
}
Пожалуйста, дайте мне знать, если есть какие-либо проблемы с использованием этого метода.
1 ответ
Решение
Когда вы используете parseFloat
, или же parseInt
Преобразование менее строгое. 1b5
-> 1.
С помощью 1*number
или же +number
конвертировать приведет к NaN
когда ввод не действительный номер. Хотя в отличие parseInt
числа с плавающей запятой будут проанализированы правильно.
Таблица охватывает все возможные соответствующие варианты.
//Variables // parseInt parseFloat + 1* /1 ~~ |0 ^1 >>0 >>>0
var a = '123,',// 123 123 NaN 0 & <<0 0
b = '1.e3',// 1 1000 1000 1000 1000
c = '1.21',// 1 1.21 1.21 1 1
d = '0020',// 16 20 20 20 20
e = '0x10',// 16 0 16 16 16
f = '3e9', // 3 3000000000 <-- -1294967296 3000000000
g = '3e10',// 3 30000000000 <-- -64771072 4230196224
h = 3e25 ,// 3 3e+25 3e+25 0 0
i = '3e25',// 3 3e+25 3e+25 0 0
j = 'a123',// NaN NaN NaN 0 0
k = ' 1 ',// 1 1 1 1 1
l = ' ',// NaN NaN 0 0 0
m = '.1 ',// NaN 0.1 0.1 1 1
n = '1. ',// 1 1 1 1 1
o = '1e999',// 1 Infinity Infinity 0 0
p = '1e-999',// 1 0 0 0 0
q = false ,// NaN NaN 0 0 0
r = void 0,// NaN NaN NaN 0 0
_ = function(){return 1;}, /* Function _ used below */
s={valueOf:_},//NaN NaN 1 1 1
t={toString:_};// 1 1 1 1 1
// Intervals: (-1e+20, +1e20) (-∞,+∞) (-∞,+∞) (-2³¹,+2³¹) [0, 2³²)
// In FF9 and Chrome 17, Infinity === Math.pow(2, 1024), approx. 1.7976e+308
// In FF9 and Chrome 17, bitwise operators always return 0 after about ±1e+25
Примечания о методах преобразования чисел:
- Преобразование чисел всегда завершается неудачей, если первый символ после усечения пробела не является числом.
parseInt
возвращает целочисленное представление первого аргумента. Когда основание (второй аргумент) опущено, основание зависит от заданного ввода.0_
= восьмеричное (основание-8),0x_
= шестнадцатеричный (основание-16). По умолчанию: база-10.parseInt
игнорирует любые нецифровые символы, даже если аргумент на самом деле был числом: см. h, i.
Чтобы избежать неожиданных результатов, всегда указывайте основание, обычно 10:parseInt(number, 10)
,parseFloat
самый терпимый конвертер. Он всегда интерпретирует ввод как base-10, независимо от префикса (в отличие отparseInt
). Точные правила разбора смотрите здесь.
Следующие методы всегда не смогут вернуть значащее значение, если строка содержит любые нечисловые символы. (действительные примеры:1.e+0 .1e-1
)+n, 1*n, n*1, n/1
а такжеNumber(n)
эквивалентны.~~n, 0|n, n|0, n^1, 1^n, n&n, n<<0
а такжеn>>0
эквивалентны. Это побитовые операции со знаком и всегда будут возвращать числовое значение (ноль вместоNaN
).n>>>0
также является побитовой операцией, но не резервирует знаковый бит. Следовательно, могут быть представлены только положительные числа, и верхняя граница равна 2 32 вместо 2 31.- Когда передан объект,
parseFloat
а такжеparseInt
будет смотреть только на.toString()
метод. Другие методы сначала ищут.valueOf()
, затем.toString()
, Смотрите д - т. NaN
"Не число":typeof NaN === 'number'
NaN !== NaN
, Из-за этой неловкости, используйтеisNaN()
проверить, является ли значениеNaN
,
Когда использовать какой метод?
parseFloat( x )
когда вы хотите получить как можно больше числовых результатов (для заданной строки).parseFloat( (x+'').replace(/^[^0-9.-]+/,'') )
когда вы хотите еще больше числовых результатов.parseInt( x, 10 )
если вы хотите получить целые числа.+x, 1*x ..
если вас интересует только получение истинных числовых значений объекта, отклонение любых недопустимых чисел (какNaN
).~~, 0| ..
если вы хотите всегда получать числовой результат (ноль для недействительного).>>>0
если отрицательных чисел не существует.
Последние два метода имеют ограниченный диапазон. Посмотрите на нижний колонтитул таблицы.
Кратчайший способ проверить, является ли данный параметр действительным числом, объясняется в этом ответе:
function isNumber(n) {
return typeof n == 'number' && !isNaN(n - n);
}