JavaScript使用parseInt()的坑小结
2017-02-27 本文已影响197人
洵_BlackBYR
场景是根据包含几个变量的字符串算一个签名
例如
var data = {
type: this.type,
timestamp: this.timestamp,
id: this.id,
};
var s = 'hello';
var b = 'world';
var k = `${s}&${b}&${JSON.stringify(data)}`;
期待的变量k
应该长这样
'hello&world&{"type":0,"timestamp":1488191490594,"id":9800000000085572}'
id是一个16位的数字串
本来this.id
是一个string类型,但是经过JSON格式化后,会自动为string类型加上双引号,这样算出来的签名的值就会发生变化。
一开始的解决方式比较粗暴,就是把id值转换成Number格式
id: parseInt(this.id)
但是后来发现,parseInt返回的结果相对于本来的值会发生改变
>> parseInt("9800000000085573")
output: 9800000000085572
查询What is JavaScript's highest integer value that a Number can go to without losing precision?后发现js能安全处理的最大整数为:9007199254740991
最后采用字符串替换的方式解决:
var data = {
type: this.type,
timestamp: this.timestamp,
id: "tmpid",
};
var s = 'hello';
var b = 'world';
var k = `${s}&${b}&${JSON.stringify(data).replace('"tmpid"', this.id)}`;