JS数字与字符串运算的结果类型

需求:不使用parseInt()函数,写一个将string转化为number类型的函数。

我第一版写出的代码是这样的:

1
2
3
4
5
6
7
8
9
10
function string2int(s) {
let arr = [];
for(let i = 0; i < s.length; i++) {
arr.push(s[i]);
}

return arr.reduce(function (x, y) {
return x * 10 + y;
})
}

但当带入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
2
3
4
5
6
7
8
9
10
11
// string * number = number
let a = '1' * 10;

// string + number = string
let b = a + '0';

// 输出为number
console.log(typeof a);

// 输出为string
console.log(typeof b);

可以看到,string与number相乘的结果固定为number,所以直接把string乘1,就可以将string转化为number(所以说这个傻逼题目直接return s * 1不就完了……)

1
2
3
4
5
6
7
8
9
10
function string2int(s) {
let arr = [];
for(let i = 0; i < s.length; i++) {
arr.push(s[i]);
}

return arr.reduce(function (x, y) {
return x * 10 + y * 1;
}, 0)
}

我依稀记得好像Java和Python里是不能直接把数字和字符串进行运算的,会直接报错,需要转换类型后才能进行加减乘除。没注意到JavaScript可以直接运算,但结果却十分诡异,以后需要注意。