字符串转数组的5种方法
parseInt
parseInt(string, radix)
解析一个字符串并返回指定基数的十进制整数,radix
是2-36之间的整数,表示被解析字符串的基数。来源MDN
parseInt
在转换字符串时,根据后面radix
的取值作为基数转化,如果parseInt
遇到的字符不是指定radix
参数中的数字(radix
为2,那么可解析的字符0、1,radix
为3,可解析的0、1、2),它将忽略该字符以及所有后续字符,并返回到该点为止已解析的整数值。1.正常
radix
2
到36
,注意字符串是否在解析范围内,按照对应radix
的基数进行计算即可。
1 parseInt('123', 5) // 将'123'看作5进制数,返回十进制数38 => 1*5^2 + 2*5^1 + 3*5^0 = 382.
radix
是undefined
、0
或未指定的,JavaScript会假定以下情况:a.如果输入的
string
以 “0x
“或 “0x
“(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被当做十六进制数去解析。b.如果输入的
string
以 “0
“(0)开头,radix
被假定为8
(八进制)或10
(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用parseInt
时,一定要指定一个 radix。c.如果输入的
string
以任何其他值开头,radix
是10
(十进制)。3.
radix
小于 2 或大于 36或第一个非空格字符不能转换为数字,直接返回NaN
小题目
[‘0’,’1’,’2’].map(parseInt)的返回值?
解析
1
2
3
4
5
6
7
8
9
10
11 ['0','1','2'].map(parseInt)
==>等价于
['0','1','2'].map(myParseInt)
function myParseInt(item,index){
return 'parseInt方法的返回值'
}
即parseIn('0',0) ==> 基数为10处理 0
parseIn('1',1) ==> radix小于2 直接返回NaN
parseIn('2',2) ==> 2不在基数2的范围内无法转化 直接返回NaN
答案:[0, NaN, NaN]
1 | 根据 JsPerf.com 的基准测试,大多数浏览器对 parseInt 的响应最佳。虽然它是最快的方式,但使用 preseInt 会碰到一些常见陷阱 |
parseFloat
parseFloat()
函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。
- 如果
parseFloat
在解析过程中遇到了正号(+
)、负号(-
U+002D HYPHEN-MINUS)、数字(0
-9
)、小数点(.
)、或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。- 第二个小数点的出现也会使解析停止(在这之前的字符都会被解析)。
- 参数首位和末位的空白符会被忽略。
- 如果参数字符串的第一个字符不能被解析成为数字,
则
parseFloat
返回NaN
。parseFloat
也可以解析并返回Infinity
。parseFloat
解析BigInt
为Numbers
, 丢失精度。因为末位n
字符被丢弃。考虑使用
Number(*value*)
进行更严谨的解析,只要参数带有无效字符就会被转换为NaN
。来源MDN
1 | 注意:字符串中的负十六进制数字是一个特殊情况,如果你用 parseFloat 解析,结果是不正确的。为了避免程序出现 NaN 的情况,应该检查转化后的值。 |
Number
1
2
3
4
5
6
7
8
9
10
11 new Number("123")
//Number {123}
new Number("123adad")
// Number {NaN}
Number('12') // 12
Number(12) // 12
Number('023') // 23
注意:从010开始就是以八进制解析了,除此以外,对于没有单引号或双引号的十六进制数一样
Number(09) // 9
Number(010) // 8
Number(023); // returns 19
1 | Number 也是 JsPerf 中最慢的之一 |
按位非
1 | 按位非:用它确保输入中没有字符,仅用于整数。 |
一元运算符
1 | "1.23" * 1; // returns 1.23 |