JS数字与字符串运算的结果类型
需求:不使用parseInt()
函数,写一个将string转化为number类型的函数。
我第一版写出的代码是这样的:
1 | function string2int(s) { |
但当带入string2int('100')
时,结果居然是10000
而不是100
。打断点看一下,x=1,y=0,与期望一致。
但继续下一步时却不对了。reduce()函数将x乘以10再加y,应该是1*10+0
,赋值到第二轮的x值应该是10才对,而调试显示第二轮x已经是100了。
原因是数组arr里的元素,均为字符串(string)。例如带入string2int('100')
时,arr = ['1', '0', '0']
,而不是[1, 0, 0]
。
再将arr带入reduce函数里时,运算结果就等于'1' * 10 +'0'
。'1' * 10
所获得的结果是number类型的10
,然后10 + '0'
,此时的运算并不是10 + 0 = 10
,而是直接在10
的末尾增加了一个字符串'0'
,变成了'100'
。
1 | // string * number = number |
可以看到,string与number相乘的结果固定为number,所以直接把string乘1,就可以将string转化为number(所以说这个傻逼题目直接return s * 1
不就完了……)
1 | function string2int(s) { |
我依稀记得好像Java和Python里是不能直接把数字和字符串进行运算的,会直接报错,需要转换类型后才能进行加减乘除。没注意到JavaScript可以直接运算,但结果却十分诡异,以后需要注意。