uni-app 数字经过JSON.stringify 和JSON.parse转换之后类型异常
uni-app 数字经过JSON.stringify 和JSON.parse转换之后类型异常
示例代码:
type P = {
x : number
y : number
}
const s = JSON.parse<P[]>(JSON.stringify([{ x: 0, y: 0 }])) as P[]
s[0].x += 0;
const clearList = s.map((v : P, _, _a) : number => v.x)
console.log( clearList.includes(0));
操作步骤:
如代码所示
预期结果:
打印 true
实际结果:
打印 false
bug描述:
通过JSON.parse 和JSON.stringify 双重转换后 数字类型出现异常。
这个问题在于 include 函数在web 平台不区分 0.0和0 的情况。 目前UTS是区分的。
HBuiler X 4.0之后版本bug已修复
clearList这个变量哪来的 发完整的代码片段看下
不好意思,我修改了一下代码
回复 h***@geely.com: 确实只要JSON转了之后 在+= 就会变成0.0 导致includes查询不到 还是邀请官方人员看看吧
在 uni-app
中,当你使用 JSON.stringify
和 JSON.parse
对数字进行序列化和反序列化时,数字的类型通常不会发生变化。然而,如果你遇到类型异常的情况,可能是由于以下原因:
1. 数字被转换为字符串
在某些情况下,数字可能会被错误地转换为字符串。例如,如果你在序列化之前将数字与字符串拼接,或者在反序列化后进行了某些操作,可能会导致数字被转换为字符串。
示例:
let num = 123;
let str = JSON.stringify(num); // "123"
let parsed = JSON.parse(str); // 123
console.log(typeof parsed); // "number"
如果你在序列化之前将数字与字符串拼接,可能会导致问题:
let num = 123;
let str = JSON.stringify(num + ""); // "123"
let parsed = JSON.parse(str); // 123
console.log(typeof parsed); // "number"
在这个例子中,num + ""
将数字转换为字符串,但 JSON.parse
仍然会将其解析为数字。
2. 数字被转换为科学计数法
对于非常大的数字或非常小的数字,JSON.stringify
可能会将其转换为科学计数法。这通常不会导致类型异常,但在某些情况下可能会影响数据的精度。
示例:
let num = 1e21;
let str = JSON.stringify(num); // "1e+21"
let parsed = JSON.parse(str); // 1e+21
console.log(typeof parsed); // "number"
3. 数字被转换为其他类型
如果你在序列化或反序列化过程中进行了某些操作,可能会导致数字被转换为其他类型。例如,如果你在反序列化后对数据进行了某些操作,可能会导致类型异常。
示例:
let num = 123;
let str = JSON.stringify(num); // "123"
let parsed = JSON.parse(str); // 123
parsed = parsed.toString(); // "123"
console.log(typeof parsed); // "string"
4. 使用 JSON.parse
的 reviver
函数
如果你在 JSON.parse
中使用了 reviver
函数,可能会在解析过程中改变数据的类型。
示例:
let num = 123;
let str = JSON.stringify(num); // "123"
let parsed = JSON.parse(str, (key, value) => {
if (typeof value === 'number') {
return value.toString(); // 将数字转换为字符串
}
return value;
});
console.log(typeof parsed); // "string"