JavaScript parseInt()を使用したピットノット

1251 ワード

シーンは、いくつかの変数を含む文字列に基づいて署名を計算します.
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)}`;